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)时,它将批量传递给另一个线程,它所做的就是使用以下两种方法之一将该批量入队:
wcfQueueService.Send(bulk);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.但,
你不是在比较同类。
最明显的区别是,在 WCF 情况下,您的计时包括整个服务端通道堆栈和操作调用的执行,而直接 MSMQ 情况仅测量在客户端将有效负载排队的时间。请记住,WCF 中的服务端处理包括 DataTable 对象的反序列化,如果您的填充因子 N 很大,这可能会非常昂贵。
更重要的是,根据您配置服务实例和限制旋钮的方式,来自客户端的请求可能会比服务配置的处理速度更快,从而导致请求本身在服务端排队等待执行。
此外,根据您配置绑定的方式,可能还会存在其他显着差异,例如安全性。顺便说一句,您真的使用 NetNamedPipeBinding (如您的问题所述)而不是 NetMsmqBinding (如标题所示)?如果是这样,使用默认绑定配置,您将对每条批量消息进行完全不必要的加密和签名,这在直接 MSMQ 情况下不会发生。这些对大消息的加密操作也将相对昂贵。
更好的比较是与定义为 OneWay 的 WCF 操作。