サービス
高負荷でWCFサービスを利用しています。応答時間は平均で約60ミリ秒です。サービスは、maxConcurrentCalls = "5000"を除いて、ほとんどデフォルトの構成を使用し、basicHttpBindingを持つエンドポイントが公開されます。
クライアント
別のサービス(さらに「クライアント」)がこれを消費しています。まれに(0.5%など)TimeoutExceptions(*)が発生します。クライアントのsendTimeoutは「00:00:05」に設定されています。
負荷テスト
VS負荷テストでも同じように再現できます。
[TestMethod]
public void Test()
{
using (var client = new SomeServiceClient())
{
// some randomization to make request more realistic
var response = client.GetSomething(request);
}
}
次の場合にタイムアウトが消えます。
- sendTimeoutを増やします。
- 1つのチャネルを作成し、負荷テスト全体で再利用します。
今奇妙なもの:
負荷テスト(タイムアウトがある場合でも)は、平均0.06のテスト時間を示し、最大で0.2秒かかります。これは、5秒よりはるかに短い時間です。これは本番環境でも発生しますが(ログによるとそうです)、これまでのところ顧客への影響は確認されていません。
質問
誰かが何が間違っている可能性があるか考えていますか?
または、WCFの構成/インスタンス化などの観点から、このシナリオに対して何を提案しますか?
スケーラビリティの時点で、これらすべてのものはすでに多くのホストで実行されています。4つのホストでクライアント、4つのホストでサービスも実行されています。ここで役立つクライアントの数が増えるでしょうか?
(*)TimeoutExceptionsを参照するときは、常にクライアント側の例外を意味します。
System.TimeoutException:00:00:05以降の応答を待っている間に要求チャネルがタイムアウトしました。Requestの呼び出しに渡されるタイムアウト値を増やすか、BindingのSendTimeout値を増やします。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。---> System.TimeoutException:' http://someservice.intranet/99.99/someendpoint.svc 'へのHTTPリクエストが、割り当てられたタイムアウト00:00:05を超えました。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。---> System.Net.WebException:操作がタイムアウトしました
喜んで手伝ってくれるWCFの達人はいますか?