zoukankan      html  css  js  c++  java
  • 如何处理RabbitMQ 消息堆积和消息丢失问题

    消息堆积

     为什么会产生消息堆积?

        大多数是因为Consumer 出问题了,没有及时发现,或者故障恢复需要较长时间,导致大量消息积压在消息队列中。

         消息队列堆积会造成什么后果?

    • 消息被丢弃
    • 磁盘满了
    • 海量消息需要处理

     解决方案:

    • 增加消费者或后台相关组件的吞吐能力
    • 增加消费的多线程处理
    • 根据不同的业务实现不同的丢弃任务,选择不同的策略淘汰任务
    • 默认情况下,RabbitMQ消费者为单线程串行消费设置并行消费两个关键属性,他们设置的是对每个消费者在初始化的时候设置的并发消费者个数,prefetchCount 是每次一次性从broker中获取的待消费的消息个数。
      • concurrentConsumer
      • prefetchConcurrentConsumer 

           小结:

        消息积压还是比较麻烦的,最好是提交防范,做好硬件和消息系统的健康监控。如果出现消息丢失,就要人中查找丢失的消息,然后补上,如果出现消费不过来的情况,考虑使用临时队列作为中转,提升处理能力。

    消息丢失

      解决方案:

    • 持久化
    • 消息确认机制

            消息在生产者,消息队列,消费者中都有可能丢失。

    1. 在生产者中丢失

        原因:生产者发送消息成功后,消息队列没有收到消息,消息在从生产者传输到队列的过程中丢失,一般可能是网络不稳定。

             解决方案: 发送方采用消息确认机制,当消息成功被MQ接收到后, 会给生产者发一个确认消息,表示成功接收。

    2. 在消息队列中丢失

          原因:消息到MQ后, 还没有被消费就被MQ给丢失了。比如MQ服务器宕机或者未进行持久化重启。

             解决方案:持久化交换机,队列和消息。确保MQ服务器重启时仍然能从磁盘恢复对应的队列,交换机和消息,然后我们把MQ 做多台分布式集群,防止出现所有的MQ服务器挂掉。

             注意: 交换机,队列和消息都要持久化

    3. 在消费者中丢失

        原因:默认消费者消费的时,设置的是自动回复MQ, 收到了消息,MQ会立刻删除自身保存的这条消息,如果消息已经在MQ中被删除,但消费者的业务处理出现异常或者宕机,那么就导致改消息没有被成功处理从而导致消息丢失。

                 解决方案: 设置手动ACK。

      

    生命不息,奋斗不止
  • 相关阅读:
    原创 记录一次线上Mysql慢查询问题排查过程
    原创 |我是如何解决POI解析Excel出现的OOM问题的?
    FastJson序列化时候出现了$ref?还不赶紧学习下
    fastjson自定义序列化竟然有这么多姿势?
    SpringBoot2.0整合WebSocket,实现后端数据实时推送!
    SpringMVC+Mybatis 如何配置多个数据源并切换?
    异常: java.security.InvalidKeyException: Illegal key size
    一分钟带你了解下MyBatis的动态SQL!
    一分钟带你了解下Spring Security!
    历时七天,史上最强MySQL优化总结,从此优化So Easy!
  • 原文地址:https://www.cnblogs.com/Griffin/p/15022951.html
Copyright © 2011-2022 走看看