922.ActiveMQ 中的消息重发时间间隔和重发次数吗?
ActiveMQ:是 Apache 出品,最流行的,能力强劲的开源消息总线。是一个完全支持 JMS1.1 和 J2EE1.4 规范的 JMS Provider 实现。JMS(Java 消息服务):是一个 Java 平台中关于面向消息中间件(MOM)的 API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
首先,我们得大概了解下,在哪些情况下,ActiveMQ 服务器会将消息重发给消费者,这里为简单起见,假定采用的消息发送模式为队列(即消息发送者和消息接收者)。
- 如果消息接收者在处理完一条消息的处理过程后没有对 MOM 进行应答,则该消息将由 MOM 重发.
- 如果我们队某个队列设置了预读参数(consumer.prefetchSize),如果消息接收者在处理第一条消息时(没向 MOM 发送消息接收确认)就宕机了,则预读数量的所有消息都将被重发!
- 如果 Session 是事务的,则只要消息接收者有一条消息没有确认,或发送消息期间 MOM 或客户端某一方突然宕机了,则该事务范围中的所有消息 MOM 都将重发。
- 说到这里,大家可能会有疑问,ActiveMQ 消息服务器怎么知道消费者客户端到底是消息正在处理中还没来得急对消息进行应答还是已经处理完成了没有应答或是宕机了根本没机会应答呢?其实在所有的客户端机器上,内存中都运行着一套客户端的 ActiveMQ 环境,该环境负责缓存发来的消息,负责维持着和 ActiveMQ 服务器的消息通讯,负责失效转移(fail-over)等,所有的判断和处理都是由这套客户端环境来完成的。
我们可以来对 ActiveMQ 的重发策略(Redelivery Policy)来进行自定义配置,其中的配置参数主要有以下几个:
可用的属性 | 属性 | 默认值 | 说明 |
---|---|---|---|
l | collisionAvoidanceFactor | 默认值 0.15 | 设置防止冲突范围的正负百分比,只有启用useCollisionAvoidance 参数时才生效。 |
l | maximumRedeliveries | 默认值 6 | 最大重传次数,达到最大重连次数后抛出异常。为-1 时不限次 |
数,为 0 时表示不进行重传。 | |||
l | maximumRedeliveryDelay | 默认值-1 | 最大传送延迟,只在 useExponentialBackOff 为 true 时有效(V5.5),假设首次重连间隔为 10ms,倍数为 2,那么第二次重连时间间隔为 20ms,第三次重连时间间隔为 40ms,当重连时间间隔大的最大重连时间间隔时,以后每次重连时间间隔都为最大重连时间间隔。 |
l | initialRedeliveryDelay | 默认值 1000L, 初始重发延迟时间 | |
l | redeliveryDelay | 默认值 1000L | 重发延迟时间,当 initialRedeliveryDelay=0 时生效(v5.4) |
l | useCollisionAvoidance | 默认值 false | , 启用防止冲突功能,因为消息接收时是可以使用多线程并发处理的,应该是为了重发的安全性,避开所有并发线程都在同一个时间点进行消息接收处理。所有线程在同一个时间点处理时会发生什么问题呢?应该没有问题,只是为了平衡 broker 处理性能,不会有时很忙,有时很空闲。 |
l | useExponentialBackOff | 默认值 false | 启用指数倍数递增的方式增加延迟时间。 |
l | backOffMultiplier | 默认值 5 | 重连时间间隔递增倍数,只有值大于 1 和启用useExponentialBackOff 参数时才生效 |