一、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
三、解释图
原文:https://www.cnblogs.com/jock766/p/14828743.html