Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么MSMQ比WCF QueueService快?_.net_Wcf_Performance_Msmq - Fatal编程技术网

.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个项目(=批量)时,它将批量传递给另一个线程,它所做的只是使用以下两种方法之一将该批量排队:

  • 如果启用wcf:
    wcfQueueService.Send(批量)
  • 如果启用了MSMQ,则执行以下操作:
    newmessagequeue(@.\private$\q”).Send(新消息{Body=bulk})
  • 这两种方法都有效,但MSMQ的工作速度要快得多。使用MSMQ时,客户端可以在20秒内处理大约80K块,而使用wcf时仅处理20K-30K块。 我不明白为什么会这样。我的WCF和MSMQ一样在不同的进程中运行。另外,我的WCF没有存储任何东西,它有一个空方法。那么为什么MSMQ赢得WCF呢

    已更新

    正如
    leppie
    建议的那样,我尝试了.NetRemoting。NetRemoting确实提高了速度。客户机处理了60K。但是,

  • 它仍然比MSMQ慢
  • 正如我所读到的,WCF不推荐使用.Net远程处理,并且根据,WCF应该比.Net远程处理快,所以为什么我认为我的WCF慢呢?也许我的装订错了

  • 我认为区别在于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);
    }