RabbitMQ 确保消息不丢失
消息丢失的阶段:
- 生产端投递消息时丢失
- RabbitMQ服务丢失消息
- 消费端消费消息时丢失
生产端投递消息时确保不丢失
1、消息投递时进行确认
// 开启确认模式
channel.ConfirmSelect();
// 然后异步监听确认和未确认的消息
2、将exchange、queue和message进行持久化
// 第三个参数true表示将exchange持久化
channel.exchangeDeclare(exchangeName, "direct", true);
// 第二个参数true表示将queue持久化
channel.queueDeclare(queueName, true, false, false, null);
//第三个参数用于将消息持久化
channel.basicPublish(exchangeName, routingKey, null, message);
3、使用本地消息表(补偿、重试机制)
1. 投递消息前,先将消息保存到数据库中
2. 使用后台线程定时扫描本地消息表,将未确认、超时或投递失败的消息重新投递(消费者需要做幂等性处理)
3. 如果重试超过设定的次数,进行邮件告警,人工介入
消费端消费消息时确保不丢失
1、消息丢失的场景
1. RabbitMQ将消息发出后,消费端还没接收到消息之前,发生网络故障,连接断开
2. RabbitMQ将消息发出后,消费端还没接收到消息之前,消费者宕机
3. 消费端正确接收到消息,但在处理消息的过程中发生异常或宕机了,消息也会丢失
2、上述3种消息丢失场景归根结底是因为RabbitMQ的自动确认机制,即RabbitMQ默认在消息发出后就立即将这条消息删除,而不管消费端是否接收到,是否处理完。因此消费端要开启手动确认模式,只有消费成功了才通知RabbitMQ删除消息。
RabbitMQ 服务确保消息不丢失
开启持久化机制,将内存中的消息存储到磁盘中。
浙公网安备 33010602011771号