3

我必须在我的 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

4 回答 4

4

Msmq 可能比 TcpBinding 慢。

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

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

于 2009-12-02T17:09:38.747 回答
4

一个单独的呼叫或成千上万个呼叫的速度更快?

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

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

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

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

  • 如果您想存入请求以例如打印文档,或重组数据库,或类似性质的东西 - 最终需要处理的东西,但您不希望立即得到回复(但您可以稍后检查是否消息已被正确处理),然后使用消息队列系统

希望这能让事情变得更清楚一些——我认为这两者并不真正适用于同一组操作,所以你很可能不必直接在这两者之间进行选择:)

于 2009-12-02T17:18:50.880 回答
3

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

于 2009-12-02T17:07:32.153 回答
2

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

如何调用/使用此服务?使它成为多线程有帮助吗?如果使用更复杂的锁,如 ReaderWriterLock,它允许同时发生多个 Get 调用,但仍阻止“添加”?

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

于 2009-12-02T17:12:33.067 回答