2017-02-02 5 views
5

私たちはいくつかの異なるサービスで構成されたサービスファブリックアプリケーションに取り組んでいます。アプリケーションの動作の重要な部分は、これらのサービスが互いに大量に呼び出す必要があることです。サービスファブリック:サービス間のコールが遅れていますか?

最近、私たちのアプリケーションの負荷が増えて、それが大幅に減速していることがわかりました。多くの調査とタイミングを取った結果、私たちはあるタイプのサービス(いくつかのインスタンスがあります)に多くの電話をかけているときに、サービスを呼び出す間に電話が遅れているようでしたサービスが実際に要求を処理し始めたことを示します。

明確にするために、マイクロソフトhereによって

を説明するように私たちは、サービス間で呼び出している:サービスAはServiceBへの参照を取得し、その後、ServiceB.GetResultは()呼び出し、我々はこの方法がサービスAで呼び出されている時間を記録し、 GetResult()で最初に行うことは、処理が開始される時刻を記録することです。負荷がない場合は、ほんの数msしかありませんが、そこに見つかった負荷を増加させてから、これらの時間の間に 4-5秒の遅延が発生します。

サービスファブリックに何らかの制限がありますか? ServiceBの複数のインスタンスがあり、クラスタ上のリソース使用率は本質的に何もなく、CPUは約10%、メモリ使用率はすべてのノードで約1/4ですが、ここで待機しているためサービスのスループットは非常に低くなります。

なぜそれが待たれますか?あるサービスが一度に処理できるコールの種類には、ある種の制限がありますか?私たちのコミュニケーションに間違ったことをしましたか?

ありがとうございます。

+0

はどのくらいの負荷私たちがここで話しているの?それはコール/秒または同様の面でそれを定量化することは可能ですか?また、生成されたロギングを見ると、サービスメソッドの開始イベントと停止イベントの間にどのくらいの時間がありますか?それは4-5秒の遅延を招いているのでしょうか、それとも通常そのサービス方法にかかる時間を反映しているだけでしょうか? – yoape

+0

@yoape ServiceBの呼び出しに関しては、増加した負荷は毎秒約60であり、GetResultメソッドを完了するのにかかる時間を記録しており、平均は約500msでした。 4-5秒の待ち時間は私たちのコードの外にあるようでした。 – Tom

+0

サービスがスローされてクライアントの再試行が強制されるタイムアウト例外があるかどうかを確認できますか?これはデフォルトのバックオフ時間が2秒であるため遅延を説明し、実際にサービスメソッドを実行しても表示されない平均2-3回、つまり4-5秒のメッセージを再試行すると、基本的にクライアントが再試行する前に待機している時間。 '' FabricTransportServiceRemotingClient''には再試行機能が組み込まれており、最大再試行回数とバックオフ遅延のための '' OperationRetrySettings''を参照します。 – yoape

答えて

5

MaxConcurrentCallsの設定が必要なようでした。

サービスに接続する場合:

  FabricTransportSettings transportSettings = new FabricTransportSettings 
      { 
       MaxConcurrentCalls = 32 
      }; 

      ServiceProxyFactory serviceProxyFactory = new ServiceProxyFactory(
       (c) => new FabricTransportServiceRemotingClientFactory(transportSettings)); 

      service = serviceProxyFactory.CreateServiceProxy<T>(serviceUri); 

作成サービスリスナー:それはスローダウンし始めたとき

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() 
    { 
     FabricTransportListenerSettings listenerSettings = new FabricTransportListenerSettings 
     { 
      MaxConcurrentCalls = 32 
     }; 
     return new[] 
     { 
      new ServiceInstanceListener(
      (context) => new FabricTransportServiceRemotingListener(context,this,listenerSettings)) 
     }; 
    } 
+2

接続先のサービスのsettings.xmlでFabricTransportの設定を指定することもできます。 FabricTransportServiceRemotingListenerは、クライアントファクトリを作成するときにリスナー_and_を作成するときにそれを選択します。 – yoape

関連する問題