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

7
我的应用程序的瓶颈是使用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条消息。每个消息都小于2kb。
如何加快MSMQ将消息传递给MassTransit应用程序的速度,同时保持队列强制执行的消息排序?

你可能已经经历过这个问题了,但是请在这里看一下。我们使用的是Websphere MQ,可能和你现在使用的MSMQ差不多。 - Mike Perrenoud
你的每秒一千条消息的期望是基于什么? - D Stanley
如果您目前有一百万条未处理的消息积压,那么请不要期望奇迹,它们的数据存储是相当庞大的。MSMQ每秒处理数千条消息毫无问题。这段时间出了些问题,最好清空队列以回到一个合理的起点。 - Hans Passant
@DStanley,这是基于我在研究中阅读的一些博客文章,声称每秒可以处理数千条消息。特别是在没有网络延迟的情况下,预计能够在一秒钟内通过队列来回传递1000个小消息并不算疯狂。 - Chris
为了保持消息顺序,我理解您是同步读取它们,对吗?瓶颈可能在消息处理上而不是队列的读取本身? - Jens H
@JensH 我不这么认为。我设置了一个测试应用程序,只是读取它们并计算我们接收消息的速度,因此没有其他繁重的处理。我之所以说按顺序是因为我考虑过在多个线程上接收并推送到内存队列,但这种处理可以以任何给定的顺序发生。 - Chris
1个回答

1

我之前确实提到过类似的事情。如果我没记错的话,我们通过TimeToBeReceived指定了消息的过期时间(发送的消息从目标队列接收的总时间。默认值为InfiniteTimeout)。请参考msdn链接


如果您的处理速度不够快,这不就是过期消息吗?如果您每秒只能处理200条消息,那么删除800条消息是否算作每秒处理1000条消息呢?我对这个配置有什么误解吗? - Chris
@Chris,我支持你的想法。然而,在我的系统(离线系统)中,我们根据两种策略忽略消息或回调:(a) TimeToBeReceived (b) 消息附带的自定义时间戳。通过这些因素,我们能够以较少的队列积压处理最新的消息。请记住,只要您有更好的机制来清理积压,每秒处理500-1000条消息是可以实现的。 - S.N

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