1.什么是 ActiveMQ?
activeMQ 是一种开源的,实现了 JMS1.1 规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。
2.ActiveMQ 服务器宕机怎么办?
ActiveMQ 在内存告急的时候会将内存中的非持久化消息写入临时文件中,以腾出内存。虽然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除。所以总是宕机尽量不要用非持久化消息,非要用的话,将临时文件限制尽可能的调大。
3.丢消息怎么办?
用持久化消息,或者非持久化消息及时处理不要堆积,或者启动事务,启动事务后,commit()方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了。
4. 持久化消息非常慢。
默认的情况下,非持久化的消息是异步发送的,持久化的消息是同步发送的,遇到慢一点的硬盘,发送消息的速度是无法忍受的。但是在开启事务的情况下,消息都是异步发送的,效率会有 2 个数量级的提升。所以在发送持久化消息时,请务必开启事务模式。其实发送非持久化消息时也建议开启事务,因为根本不会影响性能。
5. 消息的不均匀消费。
ActiveMQ 的 prefetch 机制 :当消费者去获取消息时,不会一条一条去
获取,而是一次性获取一批,默认是 1000 条。若想均匀可以将 prefetch 设为 1,每次处理 1 条消息,处理完再去取,这样也慢不了多少。
6. 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
参数时才生效。
ActiveMQ相关知识
最新推荐文章于 2021-10-26 16:31:45 发布