我们如何加快从 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 从属复制 - 从属在主控之后 - 如何加快速度?