C#.NET - 以最小的延迟发送大量小消息(通过网络)

时间:2013-07-18 14:36:01

标签: c# wcf streaming

我正在尝试通过互联网找到一个最佳的解决方案,用于发送大量的小邮件(通常大约每秒1000个,每秒最多10000个。每个邮件大到1KB大)但是最小化可能的延迟(例如关于财务数据)。 我从基本的Duplex WCF频道开始 - 这对本地网络非常有用。 比我需要将我的合同更改为单向(OperationContractAttribute,IsOneWay属性设置为true),否则每条消息都等待确认,因此每条消息的网络延迟计数两次。 即使在此之后,我的服务有时仍然没有赶上(在服务器端我只是从队列中读取消息并立即发送,在客户端我只是在接收后排队消息并且不阻止)。

我想知道是否由于发送大量小消息而导致一些开销。有没有更好的方法(例如通过TCP进行某种流式传输)?

EDIT1: 根据反馈,我添加的技术信息很少:

我们的服务是Singleton实例模式,可以同时调用([ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Multiple)]。

我们没有配置限制因此它具有默认值(但是只有很少的并发客户端 - 1到4)

实际上我们使用双工通道 - 客户端调用(寄存器),然后服务器向客户端发送大量消息。客户端本身执行的调用很少。服务器以同步的方式通过回调通道调用客户端(我们遍历阻塞队列),但非常非常频繁(那些提到每秒约1000条消息,但每秒甚至几千条)。

编辑2:解释为什么这不是How well will WCF scale to a large number of client users?问题的重复:

在我们的场景中,我们实际上拥有非常少量的客户端(我们甚至只考虑一个客户端),但是大量的消息被连续发送到那个客户端 - 所以它就像流式场景。

我们已经对典型客户端场景和服务吞吐量进行了测量,发现我们目前无法在某些情况下很好地扩展(对于需要大量消息的白天短时间内的互联网客户端)发送 - 然后那些可能由WCF排队,因为我们暂时看到接收时间的延迟增加)。

对于我们来说,扩展到多个服务器盒并不是一个可行的解决方案(一个客户端需要连接一台服务器一整天)。

1 个答案:

答案 0 :(得分:0)

您是如何配置serviceThrottling的? (见MSDN serviceThrottling) 另外,请提供服务的InstanceContextMode配置。