【问题标题】:ActiveMQ client redelivery deep understandingActiveMQ客户端重投深度理解
【发布时间】:2020-07-17 16:44:57
【问题描述】:

我有一个 ActiveMQ,其中有 400 条消息入队,重新传递延迟为 5 分钟(无 Exp. backoff),最大重新传递尝试为 288 次。这或多或少是,在最坏的情况下,消息可能在队列中 24h 。 ..或者那是原始服务设计师的想法,但我必须体验不同的行为,并且消息似乎更多地保留在队列中。 该服务是 Tomcat 上的 WAR。

我的假设是这样的:

  • 通过缓存消息和相关信息在客户端完成重新传递
  • 因此所有重新交付逻辑详细信息都存储在客户端/消费者中

当tomcat重启并且因为新版本而被CI/CD进程替换war时会发生什么? ... 24 小时计数器重置了吗? ...是否有最大数量的跟踪消息?

【问题讨论】:

    标签: java jms activemq


    【解决方案1】:

    绝对是的。

    所有重新传递策略控制都在客户端完成(除非使用我听说过的代理插件)并且没有持久性,因此重新启动客户端将使所有这些计数器重置并重新启动。

    【讨论】:

      【解决方案2】:

      发送成功后,消费者会发送一个确认,ActiveMQ(服务器)会减少消息数。

      如果失败,考虑到重新传递策略,队列(服务器)将负责计算重试次数,所以是的,如果您重新启动队列,计数将重置。

      【讨论】:

      • 嗯......我不是重新启动队列(代理),而是重新启动客户端(消费者)......这就是重点。我已经确认所有这些逻辑都在客户端处理(这是已知的)并且这些计数器没有持久状态,因此重新启动会使它们重置。
      • BTW 服务器不负责计算 ActiveMQ 模式中的重试次数。它在消费者级别缓存的消息和重试尝试在该级别完成。除非你使用的是我听说过的插件。
      • 有趣,感谢您试用!那么在有多个消费者/订阅者的情况下,重试计数值仍然存储在消费者端吗?
      • 问题是消息被传递给消费者(在客户端)并缓存在那里。当然,在重试策略流程完成之前,消费者不会发送 ACK 信号,但消息也不会发送给任何其他消费者。所以,基本上,是的;即使有多个消费者,计数器也存储在客户端