.net 为什么MSMQ比WCF QueueService快?
我在控制台中使用.net 为什么MSMQ比WCF QueueService快?,.net,wcf,performance,msmq,.net,Wcf,Performance,Msmq,我在控制台中使用netNamedPipeBinding绑定自托管WCF服务。该服务只有一个空方法Send(DataTable bulk) 我的客户机从DB获得200K输入,并使用BoundedThreadPool处理它(只创建,比方说,20个线程)。每个输入都用不同的线程处理。每个线程执行MyMethod,在MyMethod的末尾,结果被添加到bulkManager public void MyMethod(string input) { var res = Pr
netNamedPipeBinding
绑定自托管WCF服务。该服务只有一个空方法Send(DataTable bulk)
我的客户机从DB获得200K输入,并使用BoundedThreadPool处理它(只创建,比方说,20个线程)。每个输入都用不同的线程处理。每个线程执行MyMethod
,在MyMethod
的末尾,结果被添加到bulkManager
public void MyMethod(string input)
{
var res = ProcessInput(input);
bulkManager.Add(res);
}
当bulkManager
累计N个项目(=批量)时,它将批量传递给另一个线程,它所做的只是使用以下两种方法之一将该批量排队:
wcfQueueService.Send(批量)代码>
newmessagequeue(@.\private$\q”).Send(新消息{Body=bulk})代码>
leppie
建议的那样,我尝试了.NetRemoting。NetRemoting确实提高了速度。客户机处理了60K。但是,
我认为区别在于WCF操作中发生的情况与MSMQ接受请求时的情况 我希望当您使用MSMQ simple将消息排入队列时执行的方法只接受消息而不接受其他内容。一些后端工人做起重工作 在操作中,需要将请求传递给请求处理程序的单实例。当服务“旋转”时,应该实例化请求处理程序实例
您还可以通过使用.NET4中的任务并行库来并行化您的请求,从而提高性能 您能否提供示例代码来显示您看到的行为 我自己做了测试,生成了20000条要发送的消息。我尝试了这两种方法,20000个使用直接MSMQ,20000个使用WCF为我抽象MSMQ端点 使用直接MSMQ的20000使用了64.75%的CPU时间,发送20000条消息的WCF版本使用了34.16%的CPU时间(使用Visual Studio Ultimate的分析功能进行检测)
除非我犯了错误,否则WCF版本的速度几乎是硬编码MSMQ版本的两倍。你不是在比较同类 最明显的区别是,在WCF情况下,您的计时包括整个服务端通道堆栈的执行和操作调用,而直接MSMQ情况下仅测量将负载排入客户端队列的时间。请记住,WCF中的服务端处理包括对DataTable对象的反序列化,如果扩展因子N很大,这可能会非常昂贵 更重要的是,根据您配置服务实例和节流旋钮的方式,来自客户端的请求可能比服务配置处理的速度更快,从而导致请求本身排队等待在服务端执行 此外,根据您如何配置绑定,可能还有其他显著差异,例如安全性。顺便问一下,您是否真的使用了NetNamedPipeBinding(如您的问题所述),而不是像标题所暗示的那样使用NetMsmqBinding?如果是这样,使用默认绑定配置,您将对每个批量消息进行加密和签名,这在直接MSMQ情况下是不会发生的。对大型消息的这些加密操作也将相对昂贵
更好的比较是将WCF操作定义为单向。您可能会发现远程处理比MSMQ(给定命名管道,我假设IPC在本地计算机上)快得多。@leppie、.Net远程处理确实提高了速度。客户机处理了60K。但是,1-它仍然比MSMQ慢,2-正如我所读到的.Net远程处理被WCF弃用,而且WCF应该比.Net远程处理快,所以为什么我认为我的WCF慢呢?@Theatest:你能把服务上的
InstanceContextMode
改为单一和并发模式改为多个吗?然后再做一次测试。还请尝试调整限制设置(在服务行为中)。@theateist:WCF仅“替换”非IPC场景中的.NET远程处理。WCF本质上是断开连接的,而远程处理是“大部分连接的”。网络远程处理永远不会消亡!:)@来吧,伙计。。。你在说什么?它已经死了:)。那个“完全不必要”的链接已经死了,你有没有可能得到该条目的副本?真的很有兴趣阅读,谢谢
public void MyMethod(string input)
{
var res = ProcessInput(input);
bulkManager.Add(res);
}