【问题标题】:ActiveMQ with slow consumer skips 200 messages具有慢消费者的 ActiveMQ 跳过 200 条消息
【发布时间】:2012-03-11 08:57:18
【问题描述】:

我正在使用 ActiveMQ 和 Mule(一种基于 Spring 的 ESB)。 我们有一个快速的生产者和一个缓慢的消费者。 它是只有一个消费者的同步配置。

这里是spring风格consumer的配置:http://pastebin.com/vweVd1pi

最大的要求是保持消息的顺序。 然而,在运行这段代码几个小时后,突然,ActiveMQ 跳过了 200 条消息,并发送了下一条消息。这 200 条消息仍然存在于 activeMQ 中,它们并没有丢失。 但是我们的客户端(Mule)确实有一些自定义代码来检查消息的顺序,使用唯一标识符。

几个月前我就遇到了这个问题。我们通过使用参数“jms.prefetchPolicy.queuePrefetch=1”来改变消费者。当问题再次出现在其他消费者身上时,它似乎运行良好,并且是我们现在需要的解决方案。

是错误还是配置问题?

【问题讨论】:

  • 当你说消息被跳过,并留在 ActiveMQ 中是什么意思?他们是在您将他们发送到的队列中还是在其他地方?

标签: spring activemq mule


【解决方案1】:

我不能从 Mule 的角度谈论需求,但是您应该看看一些代理功能。在 ActiveMQ 中有两种方式来保证消息的顺序:

Message groups 是一种确保一组相关消息将被同一消费者按照它们放置在队列中的顺序消费的方法。要使用它,您需要在相关消息上指定 JMSXGroupID 标头,并为它们分配一个递增的 JMSXGroupSeq 编号。如果消费者死亡,来自该组的剩余消息将发送给另一个消费者,同时仍保持顺序。

Total message ordering 适用于主题 上的所有消息。它基于每个目标在代理上进行配置,不需要对客户端代码进行特殊更改。它带有同步开销。

这两项功能都允许您向外扩展至多个消费者。

【讨论】:

  • 我们必须有多个消费者吗?如果它还没有准备好接收,那么不向消费者发送消息怎么办?还是让消费者在准备好时轮询更多消息?有这样的策略吗?或者你认为我们必须有第二个消费者来接替第一个消费者。我们希望保持单一消费者配置。
  • 您不必拥有多个消费者,但消息排序机制是相同的,并且允许您横向扩展以获得更好的性能。当您使用基于代理的消息传递时,代理负责将消息传递给消费者。预取优化该过程以减少网络流量 - 消息进入客户端上的缓冲区。从那里消费消息的最常见方式是异步,通过在会话中注册一个消息侦听器(可能通过 Spring DefaultMessageListenerContainer)。
  • 好的,我们已经设置了独占消费者设置,并在活动的 mq 管理查询中检查它实际上正在考虑参数。但我们仍然有同样的问题。总是有 200 条消息被跳过并稍后处理
猜你喜欢
  • 1970-01-01
  • 2021-03-06
  • 2015-11-25
  • 2016-06-08
  • 2018-08-22
  • 2015-12-30
  • 2014-07-11
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多