RabbitMQ 确保消息不丢失

消息丢失的阶段:

  1. 生产端投递消息时丢失
  2. RabbitMQ服务丢失消息
  3. 消费端消费消息时丢失

生产端投递消息时确保不丢失

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 服务确保消息不丢失

开启持久化机制,将内存中的消息存储到磁盘中。

posted @ 2022-06-16 16:32  weidadong  阅读(227)  评论(0)    收藏  举报