2016-11-11 12 views
2

APIゲートウェイサービスは、外部HTTP要求をクラスタ内で実行されている一連のワーカーサービスにルーティングするパブリックエンドポイントであるサービスファブリッククラスタに実装します。ゲートウェイと内部サービス間のサービス間通信については、ServicePartitionClientを使用しています。サービスファブリックの負荷分散ServicePartitionClientを使用したStatelessService

ServicePartitionClientを使用してサービスアドレスを解決し、ステートレスサービスと通信すると、ステートレスサービスの1つのインスタンスが選択され、すべての通信試行でその1つのインスタンスとのみ通信することがわかりました。私のケースでは、私は私のステートレスサービスの複数のインスタンスを実行しており、それらの間に負荷を分散したい(例えば、ラウンドロビン)。毎回NamingServiceサービスへのヒットを必要としないServicePartitionClientを使用してこれを行う方法がありますか?

答えて

2

要求ごとにServicePartitionClientの新しいインスタンスを作成します。

ServicePartitionClientは、通信チャネルに関するメタデータを保持する比較的軽量のデータ構造です。実際の接続管理、プール、および解決名のキャッシングは、下の層に起こる:あなたはネーミングサービスにエンドポイントを頼むたびにヒットしないようにエンドポイントを解決

  • FabricClientキャッシュ。
  • ServicePartitionResolverは、われわれが知っている共通の接続例外に基づいて、基本的な再試行ループでFabricClientをラップします。
  • CommunicationClientFactoryBaseを使用している場合、あなたのServicePartitionResolverインスタンスを保持し、接続をキャッシュします。

したがって、CommunicationClientFactoryを再利用していることを確認してください。 CommunicationClientFactoryBaseを使用していて、独自のServicePartitionResolverを渡していない場合は、デフォルトでシングルトンが使用されます。

+1

毎回新しいインスタンスを作成せずに同じ結果を達成する方法はありますか?私たちのテストでは、すべてのhttp要求で新しいインスタンスを作成するだけでスループットが〜30%低下することがわかりました。 –

関連する問題