为什么MSMQ比WCF QueueService更快?

the*_*ist 13 .net performance wcf msmq

我在控制台中使用netNamedPipeBinding绑定自托管WCF服务.该服务只有一个空方法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
    }    
}
Run Code Online (Sandbox Code Playgroud)

我的客户从DB获得200K的投入,并与我们的BoundedThreadPool(只创建,让说,20个线程)处理它.每个输入都使用不同的线程处理.每个线程执行MyMethod并在MyMethod结果的末尾添加bulkManager.

public void MyMethod(string input)
{            
    var res = ProcessInput(input);
    bulkManager.Add(res);
}
Run Code Online (Sandbox Code Playgroud)

bulkManager累积N个项目(= bulk)时,它将批量传递给另一个线程,它所做的就是使用以下两种方法之一将该批量入队:

  1. 如果启用了wcf: wcfQueueService.Send(bulk);
  2. 否则,如果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.但,

  1. 它仍然比MSMQ慢
  2. 当我读到.NET远程通过WCF和WCF弃用应按照比NET远程处理速度更快这个,为什么我得到我的WCF是慢?也许我的绑定错了?

Chr*_*son 4

你不是在比较同类。

最明显的区别是,在 WCF 情况下,您的计时包括整个服务端通道堆栈和操作调用的执行,而直接 MSMQ 情况仅测量在客户端将有效负载排队的时间。请记住,WCF 中的服务端处理包括 DataTable 对象的反序列化,如果您的填充因子 N 很大,这可能会非常昂贵。

更重要的是,根据您配置服务实例和限制旋钮的方式,来自客户端的请求可能会比服务配置的处理速度更快,从而导致请求本身在服务端排队等待执行。

此外,根据您配置绑定的方式,可能还会存在其他显着差异,例如安全性。顺便说一句,您真的使用 NetNamedPipeBinding (如您的问题所述)而不是 NetMsmqBinding (如标题所示)?如果是这样,使用默认绑定配置,您将对每条批量消息进行完全不必要的加密和签名,这在直接 MSMQ 情况下不会发生。这些对大消息的加密操作也将相对昂贵。

更好的比较是与定义为 OneWay 的 WCF 操作。