序文
ダボ2.7.5リリース2.7.0から2.7.5までのほぼ2ヶ月は、そこにある、ダボは、パフォーマンスの最適化に2.7.0からに、QPSレベルでは、圧力試験の正式な結果に応じて、たくさんのことを行っています2.7.5、ダボ30%の単一のRPCコールのリンク性能は、この記事では、ダボが通話リンク性能のRPCを改善するために行われた変更内容を確認するために行くことができます。
サービスメタデータの静的な、コンピューティングのリンクを減らします
消費者側のキャッシュConsumerModel
私たちは、あなたが設定している場合、サービス開始は、サービスを直接Fanger魏コード社会的関心の番号の下に掃引することができますパースの関連するサービスの参照元のプロセスを生成します消費者側では、関連する設定、プロキシオブジェクト参照のサービスを引用したときに、[コードを追加することを知っています調味料]の取得を調整します。プロキシオブジェクト生成サービスの前に設定するには、いくつかのチェックを行い、構成を更新、などでしょう、彼らは主に#checkAndUpdateSubConfigsのReferenceConfig()メソッドで実装されています。サービスメタデータをロードするために、いくつかのロジックを追加しました2.7.5バージョンでは、のは、ソースコードのこの部分を見てみましょう:
public void checkAndUpdateSubConfigs() {
/**
* 省略无关代码
*/
// part1-start
//init serivceMetadata
serviceMetadata.setVersion(version);
serviceMetadata.setGroup(group);
serviceMetadata.setDefaultGroup(group);
serviceMetadata.setServiceType(getActualInterface());
serviceMetadata.setServiceInterfaceName(interfaceName);
// TODO, uncomment this line once service key is unified
serviceMetadata.setServiceKey(URL.buildKey(interfaceName, group, version));
// part2-start
ServiceRepository repository = ApplicationModel.getServiceRepository();
ServiceDescriptor serviceDescriptor = repository.registerService(interfaceClass);
repository.registerConsumer(
serviceMetadata.getServiceKey(),
serviceDescriptor,
this,
null,
serviceMetadata);
// part2-end
/**
* 省略无关代码
*/
}
复制代码
プロバイダ側のキャッシュProviderModel
ときにサービスが開始さは、必然的に、特定のサービスが露出したソースコード解析プロセスは、Fanger魏コードの下に掃引することができ、直接コードトーンを得るために少し味を追加するには、[いいえ]公衆の懸念、doExportUrls方法を通過します。最終消費者と同じように、コンピューティングと新しいバージョンにメタデータをロードするためのロジックを追加します。下のソースコードを参照してください。
private void doExportUrls() {
// part1-start
ServiceRepository repository = ApplicationModel.getServiceRepository();
ServiceDescriptor serviceDescriptor = repository.registerService(getInterfaceClass());
repository.registerProvider(
getUniqueServiceName(),
ref,
serviceDescriptor,
this,
serviceMetadata
);
// part1-end
/**
* 省略无关代码
*/
}
复制代码
それともここで損失が読み、あきらめないでください、それを表示するには:
唯一のいくつかのメタデータに関連するサービスを割り当て、その1部分のその2部分とプロバイダ側消費端がServiceRepository、ServiceRepositoryサービスリポジトリ、そのカプセル化メタデータ関連するサービスメタデータコンシューマ端に導入されるその1部消費者側を見ますプロバイダ側モデルConsumerModelは、ProviderModel、ConsumerModel ProviderModelと二つのモデルをモデル化するようConsumerModel referenceConfig、methodConfigをパッケージ化するなど、最終消費者とプロバイダ側の構成をカプセル化メタデータ。最も重要なことは、ServiceRepositoryオブジェクトをインスタンス化することで、その後、ServiceRepositoryへのバージョン、グループ、サービスタイプ、サービス・インターフェース名と他のメタデータは、いくつかを行うには、いくつかの計算を行うためのプロセスの試みでメタデータサービスの開始段階を確実にするためのオブジェクトでパート2の一部メタデータと結果をキャッシュするには、(生成方法等、parameterDescパラメータデータを記載されているような)、直接の結果は、関連するメタデータリンクコールRPCを取得する必要があります直接計算することができます。以下のいくつかの場所では、メタデータのServiceRepositoryキャッシュされた結果を使用しています。
- 初期RpcInvocationは:リンクは、消費者端またはコール・リンク・プロバイダの端を呼び出すべきかどうか、RpcInvocation全体コールは、例えば、メタデータリンクに、ベクターによって運ばれている。ソースコードは、メソッドinitParameterDesc(RpcInvocationを見ることができます) 、parameterDesc、compatibleParamSignatures、returnTypesこれら3つのプロパティが割り当てられているが、これら3件のデータがServiceRepositoryから直接取得され、これら3つの値が初期化RpcInvocation中に再計算されません。
- デコード時:プロバイダ側が要求を復号化する場合、メソッドは、メソッド、戻り型のパラメータの型を含む、署名を呼び出す必要を解析し、今やこれらの要素は既にServiceRepositoryから限り、直接、キャッシュを行う再解析する必要がないようにしています特定のソースコードに#decodeのDecodeableRpcInvocation(チャンネルチャンネル、入力ストリーム入力)メソッドを見ることができます。
URL通話中に発生したメモリ割り当て操作を減らします
各通話終了消費者にリンクし、プロバイダ側の性能を向上させることに加えて、メモリ割り当て動作がアクションURL呼び出しが最適化された点の間に生成される低減します。バージョンのメタデータセンターではありません以前のバージョン2.7.35では、URLの内容の統一モデルは、ネットワークデータ内のデータパケットの伝送につながることができ、非常に運ば応答時間に影響を与える、大きすぎます。2.7.35版でURLのみ、そのようなプロトコル、ホスト、ポートなどのようなサービス・ロケーションに関連するメタデータに関係ように、コンテンツのURLを減少させました。ここでは、最新バージョンを見ては、工程で発生するメモリ割り当てオペレーション呼び出しのURLを減らすために行う方法です。主に次の側面から:
- URLは、オペレーティング・レベルのメタデータを取得するためのメモリの割り当て方法を削減します
- URL.getAddressオブジェクト割り当てを削減
URLは、オペレーティング・レベルのメタデータを取得するためのメモリの割り当て方法を削減します
public class URL implements Serializable {
/**
* 省略无关代码
*/
private final Map<String, String> parameters;
private final Map<String, Map<String, String>> methodParameters;
private volatile transient Map<String, Map<String, Number>> methodNumbers;
public static Map<String, Map<String, String>> toMethodParameters(Map<String, String> parameters) {
Map<String, Map<String, String>> methodParameters = new HashMap<>();
if (parameters == null) {
return methodParameters;
}
String methodsString = parameters.get(METHODS_KEY);
if (StringUtils.isNotEmpty(methodsString)) {
String[] methods = methodsString.split(",");
for (Map.Entry<String, String> entry : parameters.entrySet()) {
String key = entry.getKey();
for (String method : methods) {
String methodPrefix = method + '.';
if (key.startsWith(methodPrefix)) {
String realKey = key.substring(methodPrefix.length());
URL.putMethodParameter(method, realKey, entry.getValue(), methodParameters);
}
}
}
} else {
for (Map.Entry<String, String> entry : parameters.entrySet()) {
String key = entry.getKey();
int methodSeparator = key.indexOf('.');
if (methodSeparator > 0) {
String method = key.substring(0, methodSeparator);
String realKey = key.substring(methodSeparator + 1);
URL.putMethodParameter(method, realKey, entry.getValue(), methodParameters);
}
}
}
return methodParameters;
}
/**
* 省略无关代码
*/
}
复制代码
URLパラメータのプロパティは、グループ、タイムアウトとメソッドレベルの構成を含む他の構成、ならびにサービス関連する方法、インタフェースおよび他のメタデータなどのいくつかのメタデータ構造に関連するサービスを運ぶ、以下のデモIのRANはここで、ありますこれは、パラメータの内容の一部を示しています。
それは両方のそのようなアクセスのsayHelloなどのパラメータに対応する値を得る必要から、メタデータ処理を取得する必要があるたびにので、メンテナンスのURL文字列に縮小操作に関連するマップで新バージョンにおけるメタデータの方法。タイムアウト値は、と、この方法は、あなたが常に導通しない、レベルのメタデータは、URLに直接維持し、今もタイムアウトを取得するために、そして最終的にタイムアウト設定のsayHelloこの方法に到達するために。「」スプリット・コンフィギュレーション・キーに従っています文字列操作は、また、二次取得までのキャッシュmethodNumbers、スピードを追加します。
URL.getAddressオブジェクト割り当てを削減
コードの古いバージョン
public class URL implements Serializable {
/**
* 省略无关代码
*/
private final String host;
private final int port;
public String getAddress(String host, int port) {
return port <= 0 ? host : host + ':' + port;
}
/**
* 省略无关代码
*/
}
复制代码
コードの新バージョン
public class URL implements Serializable {
/**
* 省略无关代码
*/
private transient String address;
private final String host;
private final int port;
private static String getAddress(String host, int port) {
return port <= 0 ? host : host + ':' + port;
}
public String getAddress() {
if (address == null) {
address = getAddress(host, port);
}
return address;
}
/**
* 省略无关代码
*/
}
复制代码
このプロパティのアドレスにURLを追加し、ソースから見て、1つのオブジェクトのみ割り当て、アドレスを取得したホストやポートなどのgetAddressは、いくつかの文字列の連結を行い、元のメソッドへの各呼び出しは、スプライスされたときに決定しなくても、 String型のオブジェクトは、それがスプライシングで、コンパイル時間中に最適化されませんが、スプライスされるためにパフォーマンスの低下を取得するために、各アドレスがメモリ割り当てのオブジェクトをもたらすように、StringBuilderオブジェクトを作成します。
2.7.5リリースでは、割り当てられたURL.getAddressオブジェクトの最適化に加えて、いくつかのプル要求は、オブジェクトの割り当てに最適化された原則、これがほとんどで、それらをここにリストアップされていませんがあります。