1.RabbitMQ的三大作用:解耦,削峰,异步
2.我们讨论消息不丢失,首先要看看发送消息的执行流程
1)生产者(Publisher)将消息发送到交换机(Exchange)中
2)交换机通过Routing Key路由到队列(Queue)
3)消费者(Consumer)订阅Queue,从队列中获取消息消费
3.由上面的分析我们可以知道可能发生消息丢失的情况:
1)生产者将消息发送到Exchange的时候丢失,例如:在发送过程中由于网络问题发送失败,或者发送到了一个不存在的Exchange
2)路由失败,这种情况消息已经到达了Exchange中,交换机通过Routing Key路由到队列时失败,例如:Exchange根本就没有绑定Queue
3)消费者在处理消息的时候失败,消费者已经获取了消息,在消费的时候出现了异常,没有对异常处理,导致了消息丢失
4.解决方案
1).对于生产者将消息发送到Exchange的时候丢失
a)通过事务机制实现(同步,会降低RabbitMQ的性能)
b)通过confirm机制来解决(异步,解决事务性能)
注意:事务机制和confirm机制两者不能共存
2).对于路由失败
a)开启RabbitMQ的持久化机制
3). 消费者在处理消息的时候失败
a)关闭RabbitMQ的自动ack,开启手动ack