ActiveMQ如何保障消息的可靠传输?

ActiveMQ提供了可靠性传输(Reliable Delivery)来保障消息的可靠投递。

主要有以下几种实现方式:

  1. 设置可靠传输模式
    在生产者端设置DeliveryMode.PERSISTENT:
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);


这会告知Broker按照可靠模式投递此消息。

  1. 持久化消息
    Broker将持久化消息到磁盘,重启后仍然存在。
    默认行为,保障持久化的可靠性。
  2. 提交事务
    在生产者端提交事务:
session.commit();

暂时不会从内存删除消息,直到消费者确认。

  1. 设置消息 acknowledge
  • AUTO_ACKNOWLEDGE: 消息消费后自动确认
  • CLIENT_ACKNOWLEDGE:需要调用message.acknowledge()手动确认

保证消费者确认后Broker才删除消息。

  1. 设置重试机制
    在Broker配置<redeliveryPolicy />设置重试次数和时间间隔:
<redeliveryPolicy ... >
   <maximumRedeliveries>5<maximumRedeliveries>   
</redeliveryPolicy>

设置消息最大重试次数。

通过以上这些配置,可以使ActiveMQ尽量保证以下几点:

  • 将消息持久化到磁盘,Broker重启后仍存在
  • 在生产者提交事务前不删除消息
  • 等待消费者确认后Broker才删除消息
  • 如果未确认,Broker会进行重试重新投递
  • 最终确保消息被成功消费