什么WCF绑定最高效?

时间:2009-12-02 17:01:38

标签: .net wcf performance nettcpbinding netmsmqbinding

我必须在WCF服务中获得最大吞吐量性能。在我的一个测试中,下面的服务使用NetTcpBinding每分钟只获得50k数据项。像NetMsmqBinding这样的断开连接会改善这种性能吗?

服务和客户端使用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();
        }
    }
}

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

4 个答案:

答案 0 :(得分:4)

Msmq可能比TcpBinding慢。

如果你在同一台机器上运行,你肯定应该使用NetNamedPipeBinding(IPC),这是最快的绑定。

您还应该检查序列化数据的方式。协议缓冲区序列化比默认的WCF二进制序列化要快得多(并且更精简)(但需要稍微调整一下)。

答案 1 :(得分:4)

单独拨打电话的速度更快,还是成千上万的电话?

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

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

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

  • 如果你想要,例如查找邮政编码并获取该位置的经度/纬度,您肯定需要一个请求/响应机制 - &gt;使用netTcp

  • 如果您想将请求存入例如打印文档,或重新组织数据库,或那种性质的东西 - 最终需要倾向的东西,但你不要指望立即回复(但你可以稍后检查消息是否已被正确处理),然后使用消息排队系统

希望能让事情变得更加清晰 - 我不认为这两者真的是针对同一组操作,所以你很可能不必直接在这两者之间做出选择:)

答案 2 :(得分:3)

如果服务和客户端在同一台机器上运行,我会完全避免网络支持IPC机制,例如命名管道。网络流量会产生大量开销,使用IPC机制可以避免这种开销。

答案 3 :(得分:2)

您是否有理由相信运输正在降低交易速度?分析告诉你什么?现在,这项服务被设置为单线程,并且还有多次调用“Get”相互锁定。

如何调用/使用此服务?是否有助于使其多线程?如何使用像ReaderWriterLock这样的更复杂的锁,允许多次调用Get同时发生,但仍然阻止“添加”?

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