我们如何加快从 MSMQ 接收消息的速度?

Posted

技术标签:

【中文标题】我们如何加快从 MSMQ 接收消息的速度?【英文标题】:How can we speed up receiving messages from MSMQ? 【发布时间】:2014-01-06 22:11:50 【问题描述】:

我的应用程序的瓶颈变成了使用 MassTransit 通过 MSMQ 发送和接收消息。发送和接收都发生在同一个应用程序中,但通常有太多消息无法使用内存队列。

这是我的简单队列设置:

messageBus = ServiceBusFactory.New(sbc =>
                
                    sbc.UseMsmq();
                    sbc.VerifyMsmqConfiguration();
                    sbc.UseMulticastSubscriptionClient();
                    sbc.ReceiveFrom("msmq://localhost/msg_queue");
                    sbc.Subscribe(subs =>
                    
                        subs.Handler<EventMessage>(msg => Enqueue(msg));
                    );
                );

对于我的实验,MSMQ 目前有大约 100 万条消息,我们不会向它推送任何新消息。我们没有在Enqueue() 做任何工作,除了消息发送的速度。

有了这些信息,我们每秒只能从 MSMQ 获取 150 到 200 条消息,而我希望在没有网络延迟的情况下每秒至少可以获取 1000 条消息。每条消息

我们如何加快 MSMQ 通过 MassTransit 向应用程序传递消息的速度,同时保持队列强制执行的消息排序?

【问题讨论】:

你可能已经经历过这个,但有一个look here。我们使用 Websphere MQ,并且可能了解您现在使用 MSMQ 获得的内容。 你每秒 1000 条消息的希望是基于什么? 如果您当前积压了 百万 条未处理的消息,那么不要指望奇迹,它们的数据存储是可观的。 MSMQ 可以轻松处理每秒数千条消息。前段时间就坏了,最好清理队列,回到合理的起点。 @DStanley 这是基于我在研究中阅读的一些博客文章,该文章声称每秒有数千条消息。期望能够在一秒钟内通过队列来回传递 1000 条小消息并不疯狂,尤其是在没有网络延迟的情况下。 为了保持消息的顺序,我理解它,以便您同步阅读它们,对吧?瓶颈可能在于消息的处理,而不是读取队列本身吗? 【参考方案1】:

我之前确实解决过类似的问题。如果我没记错的话 我们通过TimeToBeReceived 指定消息过期时间(从目标队列接收已发送消息的总时间。默认为InfiniteTimeout。)。请参考此msdn link。

【讨论】:

如果您的处理速度不够快,这不只是使消息过期吗?如果您每秒只能处理 200 条消息,我认为再删除 800 条消息并不符合每秒处理 1000 条的条件。我是否缺少此配置的某些内容? @Chris,我和你在一起。但是,在我的系统(断开连接的系统)中,我们基于两种策略忽略消息或调用backogs。 (a)TimeToBeReceived (b) 自定义时间戳以及消息。使用这些因素,我们能够处理队列中较少积压的最新消息。请记住,如果您有更好的机制来清理积压,每秒处理 500-1000 条消息是可以实现的。

以上是关于我们如何加快从 MSMQ 接收消息的速度?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 从属复制 - 从属在主控之后 - 如何加快速度?

我在 Node JS 中检索 Git 标签信息的方法很慢,如何加快速度?

如何在C#中使用MSMQ

如何加快这个 PHP 脚本的执行速度

如何加快从磁盘加载XML文档的速度?

如何使用numba加快以下代码的速度?