Rabbitmq防止消息的丢失

一、Rabbitmq的流程图

二、出现消息丢失的三个可能

  A:写消息的过程,消息都没到rabbitmq,在网络传输过程就丢了;或者是消息到了rabbitmq,但是人家内部出错了没保存下来
    
     例子:
          1、channel.confirm  // 先把channel设置成confirm的模式
          2、发一个消息
          3、生产者实现ConfirmListener接口handleAck()和handleNack()方法
            /**
             ** handleAck RabbitMQ消息接收成功的方法,成功后业务可以做的事情
             ** 发送端投递消息前,需要把消息先存起来,比如用KV存储,接收到ack后删除
           **/
          void handleAck(long deliveryTag, boolean multiple)
              throws IOException;

          //handleNack RabbitMQ消息接收失败的通知方法,用户可以在这里重新投递消息
          void handleNack(long deliveryTag, boolean multiple)
              throws IOException;



  B:Rabbitmq接收到消息之后先暂存在自己的内存里,结果消费者还没来得及消费,rabbitmq自己挂掉了就导致暂存在内存里得数据就就搞丢
    
       持久化queue,exchange均设置为 durable=True
     
       持久化消息message:delivery_mode = 2  

  C:消费者消费到了这个消息,但是还没来得及处理自己就挂掉了,但是rabbitmq以为这个消息者已经处理完了

      解决方案:使用手动ACK

三、解释图

posted @ 2021-05-30 18:59  jock_javaEE  阅读(120)  评论(0)    收藏  举报