当前位置:   article > 正文

ActiveMQ消息中间件面试专题

activemq将 prefetch 设为 1

1.什么是ActiveMQ?

        消息中间件
      

2. ActiveMQ服务器宕机怎么办?

        
  1. 这得从ActiveMQ的储存机制说起。在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件
  2. 中的,它们的最大限制在配置文件的<systemUsage>节点中配置。但是,在非持久化消息堆积到一定程度,内存
  3. 告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。虽然都保存到了文件里,但
  4. 它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除。
  5. 那如果文件增大到达了配置中的最大限制的时候会发生什么?我做了以下实验:
  6. 设置2G左右的持久化文件限制,大量生产持久化消息直到文件达到最大限制,此时生产者阻塞,但消费者可正
  7. 常连接并消费消息,等消息消费掉一部分,文件删除又腾出空间之后,生产者又可继续发送消息,服务自动恢复
  8. 正常。
  9. 设置2G左右的临时文件限制,大量生产非持久化消息并写入临时文件,在达到最大限制时,生产者阻塞,消费者
  10. 可正常连接但不能消费消息,或者原本慢速消费的消费者,消费突然停止。整个系统可连接,但是无法提供服
  11. 务,就这样挂了。
  12. 具体原因不详,解决方案:尽量不要用非持久化消息,非要用的话,将临时文件限制尽可能的调大。

3. 丢消息怎么办?

        解决方案:用持久化消息
      

4:为什么丢消息?

        
  1. 通过抓包得知,ActiveMQ会每隔10秒发送一个心跳包,这个心跳包是服务器发送给客户端的,用来判断客户端死没
  2. 死。如果你看过上面第一条,就会知道非持久化消息堆积到一定程度会写到文件里,这个写的过程会阻塞所有动作
  3. ,而且会持续20到30秒,由于服务器心跳包的设置,导致发生了java.net.SocketException异常,把缓存里的数
  4. 据作废了,没处理的消息全部丢失。

5. 持久化消息非常慢。

        
  1. 默认的情况下,非持久化的消息是异步发送的,持久化的消息是同步发送的,遇到慢一点的硬盘,发送消息的速度
  2. 是无法忍受的。但是在开启事务的情况下,消息都是异步发送的,效率会有2个数量级的提升。所以在发送持久
  3. 化消息时,请务必开启事务模式。其实发送非持久化消息时也建议开启事务,因为根本不会影响性能。

6. 消息的不均匀消费。

        
  1. 有时在发送一些消息之后,开启2个消费者去处理消息。会发现一个消费者处理了所有的消息,另一个消费者根
  2. 本没收到消息。原因在于ActiveMQ的prefetch机制。当消费者去获取消息时,不会一条一条去获取,而是一次
  3. 性获取一批,默认是1000条。这些预获取的消息,在还没确认消费之前,在管理控制台还是可以看见这些消息
  4. 的,但是不会再分配给其他消费者,此时这些消息的状态应该算作“已分配未消费”,如果消息最后被消费,
  5. 则会在服务器端被删除,如果消费者崩溃,则这些消息会被重新分配给新的消费者。但是如果消费者既不消费
  6. 确认,又不崩溃,那这些消息就永远躺在消费者的缓存区里无法处理。更通常的情况是,消费这些消息非常耗
  7. 时,你开了10个消费者去处理,结果发现只有一台机器吭哧吭哧处理,另外9台啥事不干。 解决方案:
  8. 将prefetch设为1,每次处理1条消息,处理完再去取,这样也慢不了多少。(肯定比每次拉去多条要慢)

7. 死信队列。

        
  1. 消息变成死信的情况:
  2. 消息被拒绝
  3. 消息 TTL 过期
  4. 队列达到最大长度。

死信队列也是一个正常的队列,只是其他队列里的消息变成死信的时候,往这个队列转发。

8. ActiveMQ中的常用配置参数?

        
  1. 一些配置信息
  2. 属性 默认值 说明
  3. collisionAvoidanceFactor 默认值0.15 , 设置防止冲突范围的正负百分比,只有启用useCollisionAvoidanc
  4. e参数时才生效。
  5. maximumRedeliveries 默认值6 , 最大重传次数,达到最大重连次数后抛出异常。为-1时不限制次数,
  6. 为0时表示不进行重传。
  7. maximumRedeliveryDelay 默认值-1, 最大传送延迟,只在useExponentialBackOff为true时有效(V5.5),
  8. 假设首次重连间隔为10ms,倍数为2,那么第二次重连时间间隔为 20ms,第三次重连时间间隔为40ms,当重
  9. 连时间间隔大的最大重连时间间隔时,以后每次重连时间间隔都为最大重连时间间隔。
  10. initialRedeliveryDelay 默认值1000L, 初始重发延迟时间 l redeliveryDelay 默认值1000L, 重发延迟时间,
  11. 当initialRedeliveryDelay=0时生效(v5.4)
  12. useCollisionAvoidance 默认值false, 启用防止冲突功能,因为消息接收时是可以使用多线程并发处理的,
  13. 应该是为了重发的安全性,避开所有并发线程都在同一个时间点进行消息接收处理。所有线程在同
  14. 一个时间点处理时会发生什么问题呢?应该没有问题,只是为了平衡broker处理性能,不会有时很忙,有时
  15. 很空闲。
  16. useExponentialBackOff 默认值false, 启用指数倍数递增的方式增加延迟时间。
  17. backOffMultiplier 默认值5, 重连时间间隔递增倍数,只有值大于1和启用useExponentialBackOff参数时
  18. 才生效。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/888007
推荐阅读
相关标签
  

闽ICP备14008679号