是的,ActiveMQ 是基于 JMS 的消息代理,其核心旨在保证消息的可靠传递。为了更好地理解这一点,让我们考虑通过系统的消息路径,即从生产到消费。
消息通常分两跳传递。第一跳是消息从生产者传输到消息代理上的目的地的地方,在本例中为 ActiveMQ。在第二跳中,消息从代理上的物理目的地传输到消费者。
在此过程中,只有三种方式可以使消息在其路径中丢失。第一个是当它从生产者移动到消息代理时。第二个可能的丢失点在代理内存中,最后是在从代理到消费者的路径上。
ActiveMQ 使用两种机制来ensure messages are not lost 以三种方式中的任何一种方式。首先是代理将所有消息存储在高度持久的数据存储中。如果在消息成功投递之前系统中断或者broker内存出现故障,broker仍然可以在恢复后重新获取消息并重试操作。
其次,ActiveMQ 使用确认和事务来确保消息的生产和消费都成功。即使使用这两种方法,也可能会出现消息未成功传递的情况。例如,当用于消费消息的事务会话被回滚时。发生这种情况时,消息将返回到队列并重新传递。
ActiveMQ 提供了两种方法来处理返回到队列并重新传递但未成功的消息。这些是延迟重新投递和死信地址。
对于延迟重新传递,消息会延迟一段时间,以允许消费者从瞬时故障中恢复并防止网络或系统过载。这是一个示例,展示了如何在地址设置配置中定义延迟重新投递。
<!-- delay message redelivery for 5 seconds -->
<address-setting match="exampleQueue">
<!-- default is 1.0 -->
<redelivery-delay-multiplier>1.5</redelivery-delay-multiplier>
<!-- default is 0 (no delay) -->
<redelivery-delay>5000</redelivery-delay>
<!-- default is 0.0) -->
<redelivery-collision-avoidance-factor>0.15</redelivery-collision-avoidance-factor>
<!-- default is redelivery-delay * 10 -->
<max-redelivery-delay>50000</max-redelivery-delay>
</address-setting>
对于死信地址,未成功投递的消息从队列中移除并发送到死信地址。代理不会尝试重新传递此类消息,而是将它们置于系统管理员可以访问并采取行动的队列中。
下面是一个简单的死信地址配置。
<!-- undelivered messages in the Queue are sent to a dead letter address
after 3 unsuccessful redelivery attempts -->
<address-setting match="exampleQueue">
<dead-letter-address>deadLetterAddress</dead-letter-address>
<max-delivery-attempts>3</max-delivery-attempts>
</address-setting>