服务器与客户端通信的 MSMQ

4
我们正在考虑使用MSMQ作为持续的“推送”服务器到客户端的通信方式。每个服务器最多可以有1000个客户端。
在我们的一个测试中,我们向300个离线客户端发送了一条小消息,然后发送了一条在线客户端的消息。由于MSMQ逐步处理无法传递的消息(通过MMC观察),最后一条消息延迟了超过40分钟。 我们还将MSMQ用于返回路径,在那里它表现良好。
有没有办法通过减少连接到离线主机的尝试时间来使MSMQ适应这种使用模式? 如果没有,是否有其他队列产品更适合,或者是自己开发?原始吞吐量不是优先考虑的问题,但是输出队列的数量、可预测性/最大延迟以及客户端的内存占用(可以是相当老的机器)是优先考虑的问题。
2个回答

2
您可以通过禁用日志记录并使消息不可恢复来提高性能……如果您不在意丢失消息。对于您的离线场景,一个快速的解决方法是增加 MSMQ 可用的线程数,每个离线队列使用一个线程。每个离线连接尝试都需要一段时间,会阻塞一个线程。http://technet.microsoft.com/en-us/library/cc957498.aspx 尽可能多地投入线程来尝试解决问题。
我的同事们已经使用过 ActiveMQ,并表示它更加灵活,性能也更好。如果您没有与 .Net 绑定,我建议您研究一下。

在这种情况下,我们确实需要可恢复的消息。我们还增加了线程的数量,这确实有所帮助,但是大量的客户端仍然使它变慢。虽然两个建议都很好! - Matt

0
我们的解决方案是通过MSMQ的管理COM接口之一,对已离线的机器的队列进行编程暂停(我们已经有了一个UDP消息来告知客户端是否在线)。
通过暂停已知断开连接主机的队列,MSMQ花费了更少的时间来处理无法传递的消息。
这也是一个很好的教训,当考虑评估技术时应该运用一些侧面思维!总的来说,我不建议将MSMQ用于服务器到客户端通信,因为存在这个问题 - 我认为客户端轮询会更可取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接