【问题标题】:How can we speed up receiving messages from MSMQ?我们如何加快从 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 条小消息并不疯狂,尤其是在没有网络延迟的情况下。
  • 为了保持消息的顺序,我理解它,以便您同步阅读它们,对吧?瓶颈可能在于消息的处理,而不是读取队列本身吗?

标签: c# .net msmq message-queue masstransit


【解决方案1】:

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

【讨论】:

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