私はnetNamedPipeBinding
バインディングでコンソールにWCFサービスをホストしています。サービスは、ただ1つの空のメソッドにありSend(DataTable bulk)
MSMQがWCF QueueServiceより高速なのはなぜですか?
[ServiceContract]
public interface IWcfQueueService
{
[OperationContract]
void Send(DataTable bulk);
}
public class WcfQueueService : IWcfQueueService
{
public void Send(DataTable bulk)
{
// Here would be something like _bulks.Add(bulk);
// BUT, for now it is empty method and still it's slower than MSMQ
}
}
私のクライアントは、DBから200Kの入力を取得し、私たちのBoundedThreadPoolでそれを処理(言ってみましょう、だけで作成し、20スレッド)。各入力は異なるスレッドで処理されます。各スレッドはMyMethod
を実行し、MyMethod
の末尾には結果がbulkManager
に追加されます。
public void MyMethod(string input)
{
var res = ProcessInput(input);
bulkManager.Add(res);
}
bulkManager
は、N個のアイテム(=バルク)を蓄積それはないすべては、2つの方法のいずれかでそのバルクエンキューであることを他のスレッドにバルクを渡す:WCFが有効な場合
- :
wcfQueueService.Send(bulk);
- 他MSMQが有効になっている場合:
new MessageQueue(@".\private$\q").Send(new Message {Body = bulk});
すべての二つの方法が動作しますが、MSMQは、はるかに高速に動作します。 MSMQクライアントは20秒で約80Kのバルクを処理し、wcfは20K〜30Kのバルクのみを処理します。 なぜそれが起こるのか分かりません。私のWCFはMSMQのように異なるプロセスで動作します。また、WCFには何も格納されていませんが、空のメソッドがあります。ではなぜMSMQがWCFに勝ったのですか? leppie
は私が.NetRemotingを試してみまし示唆したように
は
を更新しました。 NetRemotingは確かにスピードを改善しました。クライアントは60Kを処理しました。しかし、
- 私は.NETリモート処理を読んでそれはまだMSMQ
- より遅いのですがWCFによって廃止されており、WCFはthisによる.NETリモート処理よりも高速でなければなりませんので、私は私のWCFが遅くなることを取得する理由は?多分私の縛りは間違っていますか?
リモート処理はMSMQ(名前付きパイプが与えられていますが、ローカルマシン上ではIPCとみなされます)よりもはるかに高速です。 – leppie
@leppie、.Net遠隔操作は実際に速度を改善しました。クライアントは60Kを処理しました。しかし、1 - それはまだMSMQと2よりも遅いです.Net RemotingはWCFによって廃止され、WCFはhttp://msdn.microsoft.com/en-us/library/bb310550に従って.Net Remotingより速くなければなりません.aspx#wcfperform_topic3d、なぜ私のwcfが遅くなるのですか? – theateist
@theateist:サービス上の 'InstanceContextMode'を' Single'に、ConcurrencyMode'を 'Multiple'に変更できますか?次に、別のテストを行います。また、(サービス動作の)スロットル設定を調整しようとしました。 –