netNamedPipeBinding
バインディングを使用してコンソールに自己ホスト型のWCFサービスがあります。サービスには空のメソッドが1つだけありますSend(DataTable bulk)
[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);
}
N個のアイテム(=バルク)を蓄積するbulkManager
と、バルクを別のスレッドに渡し、次の2つの方法のいずれかでそのバルクをキューに入れます。
- wcfが有効になっている場合:
wcfQueueService.Send(bulk);
- それ以外の場合、MSMQが有効になっている場合:
new MessageQueue(@".\private$\q").Send(new Message {Body = bulk});
2つの方法はすべて機能しますが、MSMQははるかに高速に機能します。MSMQを使用すると、クライアントは20秒で約80Kのバルクを処理できますが、wcfを使用すると20K〜30Kのバルクしか処理できません。なぜそれが起こるのか分かりません。私のWCFは、MSMQとは異なるプロセスで実行されます。さらに、私のWCFは何も格納せず、空のメソッドがあります。では、なぜMSMQがWCFに勝つのでしょうか。
更新しました
提案されたようleppie
に、私は.NetRemotingを試しました。NetRemotingは確かに速度を改善しました。クライアントは60Kを処理しました。だが、
- それでもMSMQより遅い
- 私が読んだように、.Net RemotingはWCFによって非推奨になり、これによるとWCFは.Net Remotingよりも高速であるはずですが、なぜwcfが遅くなるのでしょうか。たぶん私のバインディングが間違っていますか?