どの WCF バインディングが最もパフォーマンスが高いですか?
-
11-09-2019 - |
質問
WCF サービスで最大のスループット パフォーマンスを得る必要があります。私のテストの 1 つでは、以下のサービスは NetTcpBinding を使用して 1 分あたり 50,000 のデータ項目しか取得できませんでした。NetMsmqBinding のような切断されたバインディングにより、このパフォーマンスは向上しますか?
サービスとクライアントは WCF を使用し、同じマシンで実行されます。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Storage : IStorage
{
protected List<int> _data = new List<int>();
public void Insert(int[] data)
{
lock (_data)
{
_data.AddRange(data);
}
}
public int[] Get()
{
lock (_data)
{
return _data.ToArray();
}
}
}
上記のコードは、実際のコードの簡略化されたバージョンです。
解決
MSMQはTcpBindingよりも遅くなる可能性がある。
あなたが同じマシン上で実行している場合は、、あなたは間違いなく最速の結合可能ですNetNamedPipeBinding(IPC)を使用する必要があります。
また、あなたは、データをシリアル化しているか確認する必要があります。プロトコルバッファシリアル化がデフォルトWCFバイナリシリアルよりもはるかに高速(とスリム)である(ただし、微調整の少しが必要です)。
他のヒント
単独の 1 つの呼び出しの方が速いでしょうか、それとも何千もの呼び出しが殺到する場合の方が速いでしょうか?
NetMsmq は MSMQ メッセージ キューを使用します。MSMQ によって処理されるキューにメッセージを入れると、サービスは最終的にそのキューからメッセージを取得して処理します。即座にフィードバックは得られません。メッセージは一方向のみです。
一方、NetTcp は http に似ていますが、速度が速いだけです。サービスにリクエストを送信すると、(すべてがうまくいけば) すぐにレスポンスが返されます。メッセージ キュー自体は関係せず、メッセージは要求/応答です。
したがって、実際には 2 つのバインディングを比較することはできないと思います。それらはまったく異なる目的を果たします。
したい場合は、たとえば郵便番号を調べてその場所の経度/緯度を取得するには、必ず要求/応答メカニズムが必要です --> netTcp を使用します
リクエストを預けたい場合は、たとえばドキュメントの印刷、データベースの再編成、またはそれに類するもの - 最終的に対処する必要があるものですが、すぐに応答が返ってくることは期待できません (ただし、メッセージが適切に処理されたかどうかは後で確認できます)。次に、メッセージ キュー システムを使用します
これで状況がもう少し明確になることを願っています。これら 2 つは実際には同じ一連の操作を対象としていないと思います。そのため、これら 2 つのどちらかを直接選択する必要はおそらくないでしょう :)
サービスとクライアントが同じマシン上で実行する場合、私は、名前付きパイプなどのIPCメカニズムを支持して完全にネットワークを避けるだろう。ネットワークトラフィックは、IPCメカニズムを使用することによって回避することができる多くのオーバーヘッドが発生します。
あなたは、トランスポートは、トランザクション・レートを遅くされているものであることを信じる理由を持っていますか?何がプロファイリングはあなたに言いましたか?今のところ、このサービスは、単一スレッドに設定し、また、互いをロックアウト「ゲット」するために複数のコールを持っている。
どのようにこのサービスが呼び出される/使用されていますか?それはマルチスレッドにするために役立つだろうか?どのような複数の呼び出しが同時に発生するには、Get、それでも「追加」でブロックすることができますReaderWriterLockのような、より洗練されたロックを使用してはどうですか?
編集:?私は、これは単純化された状況ですが、知っているのと同じ配慮から、実際のサービスbenifit