ActiveMQ Artemis 最大重新传递延迟和死信队列

问题描述 投票:0回答:3

我们正在使用代理 ActiveMQ Artemis 2.26.0,我正在尝试在队列上设置重新传递机制。

我希望某些消息能够重试最多 72 小时,并逐步回退。 72 小时后,消息应发送至 DLQ。

文档指出消息重新传递和死信队列两种机制可以组合使用,因此我使用 ActiveMQ Artemis 提供的示例尝试了以下操作:

broker.xml

      <address-settings>
         <!--override the redelivery-delay  for the example queue-->
         <address-setting match="exampleQueue">
            <redelivery-delay>30000</redelivery-delay>
            <redelivery-delay-multiplier>2.5</redelivery-delay-multiplier>
            <dead-letter-address>deadLetterQueue</dead-letter-address>
            <max-redelivery-delay>259200000</max-redelivery-delay>
         </address-setting>
      </address-settings>

      <addresses>
         <address name="deadLetterQueue">
            <anycast>
               <queue name="deadLetterQueue"/>
            </anycast>
         </address>
         <address name="exampleQueue">
            <anycast>
               <queue name="exampleQueue"/>
            </anycast>
         </address>
      </addresses>

看来,使用此配置,消息会在 10 次重新传递后发送到

deadLetterQueue
(默认值
max-delivery-attempts
)。

如何组合这些值来适应我的场景?

activemq-artemis messagebroker dead-letter
3个回答
0
投票

TL;博士;您需要设置一个大于 10

max-delivery-attempts

总的交付延迟是一个几何级数所以它是

<redelivery-delay>*(1-<redelivery-delay-multiplier>^<max-delivery-attempts>)/(1-<redelivery-delay-multiplier>)

在您的情况下,总交付延迟为

30000*(1-2.5^10)/(1-2.5)=190714863
,小于 72 小时(259200000),因此为了适合您的场景,您需要设置大于 10 的
max-delivery-attempts
值,即
max-delivery-attempts
= 11,总交付延迟为476817158(132小时)大于72小时。


0
投票

此设置只能通过broker.xml 进行吗?每次需要添加队列时都需要重新启动,有没有办法在不重新启动的情况下执行此操作?即命令行?


-2
投票

要在 ActiveMQ Artemis 2.26.0 中的队列上设置重新传递机制,以渐进式回退方式重试消息最多 72 小时,然后将消息发送到死信队列 (DLQ),您可以使用以下配置:

<address-settings>
   <address-setting match="exampleQueue">
      <redelivery-delay>30000</redelivery-delay>
      <redelivery-delay-multiplier>2</redelivery-delay-multiplier>
      <max-redelivery-delay>259200000</max-redelivery-delay>
      <max-delivery-attempts>0</max-delivery-attempts>
      <dead-letter-address>deadLetterQueue</dead-letter-address>
      <expiry-delay>259200000</expiry-delay>
   </address-setting>
</address-settings>

<addresses>
   <address name="deadLetterQueue">
      <anycast>
         <queue name="deadLetterQueue"/>
      </anycast>
   </address>
   <address name="exampleQueue">
      <anycast>
         <queue name="exampleQueue"/>
      </anycast>
   </address>
</addresses>

配置说明: redelivery-delay:这设置重新传递尝试之间的初始延迟(以毫秒为单位)。在此示例中,它设置为 30,000 毫秒(30 秒)。 redelivery-delay-multiplier:这设置了重新投递尝试之间的延迟随时间增加的速率。在此示例中,它设置为 2,这意味着每次重新投递尝试后延迟都会加倍。 max-redelivery-delay:这设置重新传递尝试之间的最大延迟(以毫秒为单位)。在此示例中,它设置为 259,200,000ms(72 小时)。 max-delivery-attempts:这设置了消息在发送到 DLQ 之前可以重新传递的最大次数。在本例中,它设置为 0,这意味着重新投递尝试的次数没有限制。 dead-letter-address:设置发送超过最大重新投递尝试次数或最大重新投递时间的消息的 DLQ 地址。 expiry-delay:设置时间(以毫秒为单位),过了该时间后,尚未消费的消息将自动过期并发送到 DLQ。在此示例中,它设置为与 max-redelivery-delay 相同的值。 使用此配置,消息将在最长 72 小时内逐步回退重试,或者直到消息被消耗为止,如果到那时消息尚未被消耗,则将其发送到 DLQ。重新投递尝试次数没有限制,因此尝试之间的延迟将继续增加,直到达到最大延迟。

© www.soinside.com 2019 - 2024. All rights reserved.