2009-12-02 75 views
3

我必须在我的WCF服务中获得最大吞吐量性能。在我的一个测试中,使用NetTcpBinding,以下服务每分钟只能获得50k个数据项。像NetMsmqBinding这样的断开连接可以提高性能吗?什么WCF绑定是最高性能的?

服务和客户端使用WCF并运行在同一台机器上。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class Storage : IStorage 
{ 
    protected List<int> _data = new List<int>(); 

    public void Insert(int[] data) 
    { 
     lock (_data) 
     { 
      _data.AddRange(data); 
     } 
    } 

    public int[] Get() 
    { 
     lock (_data) 
     { 
      return _data.ToArray(); 
     } 
    } 
} 

上面的代码是实际代码的简化版本。

+2

有关如何选择WCF绑定的流程图,请参阅http://stackoverflow.com/questions/1613586/c-wcf-inter-process-communication/1613601#1613601。它并没有直接解决绩效问题,但其他人看到这个问题可能会有帮助。 – 2009-12-02 21:59:19

回答

4

Msmq可能比TcpBinding慢。

如果您在同一台计算机上运行,​​您绝对应该使用NetNamedPipeBinding(IPC),它是可用的最快绑定。

您还应该检查如何序列化数据。与默认的WCF二进制序列化相比,协议缓冲区序列化速度更快(并且更精简)(但需要稍微调整一下)。

+0

http://code.google.com/p/protobuf-net/wiki/Performance – 2009-12-02 17:56:58

+0

是的。这是两个具有很好的WCF支持的实现之一。听说那个lib的创建者并不是一个未知的人,在这里round。 – 2009-12-02 19:02:25

+0

我用它,但奇怪的是它并没有改善我的服务的性能 – 2009-12-02 19:55:18

3

如果服务和客户端运行在同一台机器上,我会避免网络完全支持IPC机制,如命名管道。网络流量引发了很多开销,可以通过使用IPC机制来避免。

+0

为命名管道+1。耻辱WCF 4.0不得不放弃localProcessBinding :( – MattC 2009-12-02 17:09:57

2

您是否有理由相信运输是降低交易速度的原因?分析有什么告诉你的?此时此服务设置为单线程,并且还有多个调用“Get”互相锁定。

这个服务是如何被调用/使用的?它有助于使它成为多线程吗?如何使用像ReaderWriterLock这样更复杂的锁,它允许多个调用同时发生,但仍然阻止“添加”?

编辑:我知道这是一个简化的情况,但会从同样的考虑实际的服务利益?

+0

+1引发问题 – 2009-12-02 17:14:14

+0

我刚刚纠正了并发模式,谢谢! – 2009-12-02 17:16:16

+0

是的,我认为实际的服务也会受益于先进的锁定 – 2009-12-02 17:17:51

4

单个呼叫孤立或数千个呼叫洪水更快?

NetMsmq使用MSMQ消息队列 - 您将消息放入由MSMQ处理的队列中,服务将最终从该队列中获取并处理它。您不会得到即时反馈,这些消息只是单向的。

另一方面NetTcp就像http - 只有更快。您向服务发送请求并立即收到回复(如果一切顺利)。本身没有消息排队,你的消息是请求/回复。

所以我不认为你可以比较两个绑定,真的。它们的用途完全不同:

  • 如果您想要查找邮政编码并获取该位置的经度/纬度,您绝对需要一个请求/响应机制 - >使用netTcp

  • 如果您想要将请求存入打印文档或重新组织数据库或某种性质的内容 - 这些内容最终需要付诸实践,但您不希望立即回复回复(但您可以稍后检查邮件是否已正确处理),然后用一个消息队列系统

希望使事情更清楚一点 - 我不认为这两个确实相对于相同的一组操作的面向,让你最有可能永远不会有之间进行选择这两个直接:)

+0

如果你看看我的代码,如果我告诉你,每个客户端只使用1个操作(一个客户端插入,另一个客户端获取),我想我们会同意MSMQ适合我的服务。问题是我从来没有使用它,我不知道它是否是高性能的。 – 2009-12-02 17:23:42

+0

好吧 - 如果你想“获取”某些东西,你必须向MSMQ发送一个“GET”请求给服务。但是,你如何获得数据?由于MSMQ总是只有单向........你几乎不得不打开服务放置响应的另一个(响应)队列,客户端需要从那里获取数据。不,我不认为,一般来说,MSMQ对于GET操作来说是个好主意。 – 2009-12-02 17:28:02

+0

因此,如果我理解你的话,我将不得不忽略这个服务的GET方法,并在接收数据的服务中转换我的客户端中的一个,以便使用MSMQ? – 2009-12-02 17:34:06

相关问题