哪种 WCF 绑定性能最高?

Jad*_*ias 3 .net performance wcf 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Yan*_*rtz 5

Msmq 可能比 TcpBinding 慢。

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

您还应该检查如何序列化数据。Protocol Buffer 序列化比默认的 WCF 二进制序列化要快得多(也更精简)(但需要一些调整)。


mar*_*c_s 5

对于单独的单个调用,还是对于大量的数千个调用,速度更快?

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

另一方面,NetTcp 与 http 类似,只是速度更快。您向服务发送请求并立即收到响应(如果一切顺利)。本身不涉及消息队列,您的消息是请求/回复。

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

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

  • 如果您想提交请求,例如打印文档,或重新组织数据库,或类似的事情 - 最终需要处理的事情,但您不希望立即返回响应(但您可以稍后检查是否消息已被正确处理),然后使用消息队列系统

希望这能让事情变得更清楚 - 我不认为这两个真的适合同一组操作,所以你很可能不必直接在这两个之间进行选择:)