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)
上面的代码是实际代码的简化版本。
Msmq 可能比 TcpBinding 慢。
如果您在同一台计算机上运行,则绝对应该使用 NetNamedPipeBinding (IPC),这是最快的可用绑定。
您还应该检查如何序列化数据。Protocol Buffer 序列化比默认的 WCF 二进制序列化要快得多(也更精简)(但需要一些调整)。
对于单独的单个调用,还是对于大量的数千个调用,速度更快?
NetMsmq 使用 MSMQ 消息队列 - 您将消息放入由 MSMQ 处理的队列中,服务最终将从该队列中获取消息并对其进行处理。您不会得到即时反馈,这些消息只是单向的。
另一方面,NetTcp 与 http 类似,只是速度更快。您向服务发送请求并立即收到响应(如果一切顺利)。本身不涉及消息队列,您的消息是请求/回复。
所以我不认为你真的可以比较这两个绑定。它们有完全不同的目的:
例如,如果您想查找邮政编码并获取该位置的经度/纬度,您肯定需要一个请求/响应机制 --> 使用 netTcp
如果您想提交请求,例如打印文档,或重新组织数据库,或类似的事情 - 最终需要处理的事情,但您不希望立即返回响应(但您可以稍后检查是否消息已被正确处理),然后使用消息队列系统
希望这能让事情变得更清楚 - 我不认为这两个真的适合同一组操作,所以你很可能不必直接在这两个之间进行选择:)