我们正在使用代理 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
)。
如何组合这些值来适应我的场景?
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小时。
此设置只能通过broker.xml 进行吗?每次需要添加队列时都需要重新启动,有没有办法在不重新启动的情况下执行此操作?即命令行?
要在 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。重新投递尝试次数没有限制,因此尝试之间的延迟将继续增加,直到达到最大延迟。