RabbitMQ-保证消息不丢失的机制、避免消息的重复消费

  1. 消息中间件的使用场景

① 异步发送(验证码、短信、邮件等)

② MySql、Redis、ES之间的数据同步

③ 分布式事务

④ 削峰填谷

  1. 消息丢失的情况:
  1. 生产者发布消息,消息丢失的预防机制:生产者确认机制

RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ后,会返回一个结果到生产者,表示消息发送的状态情况。

消息发送失败后的处理方法:

① 回调方法即时重发

② 记录日志

③ 保存数据到数据库然后定时重发,成功发送后即可删除表中的数据

  1. MQ队列中消息对视的预防机制

MQ是默认内存存储消息,开启持久化功能可以确保缓存再MQ中的消息不丢失。

4.1 交换机持久化

4.2 队列持久化

4.3 消息持久化,SpringAMQP中的消息默认是持久的,可以通过MessageProperties中的DeliveryMode指定

  1. 消费者确认 保证消费者端消息不丢失

RabbitMQ支持消费者确认机制,即: 消费者处理消息后可以向MQ发送ack回执,MQ收到sck回执后才会删除该消息。而SprinmgAMQP则允许配置三种确认模式:

① manual:手动ack,需要在业务代码结束后,调用api发送sck。

② auto:自动ack,有sping监测listener代码是否出现异常,没有异常则返回ack,异常后则返回nack

③ none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除。

可以使用spring的retry机制,在消费者出现异常时利用本地重试,设置重试次数,当达到次数后,如果消息依然消费失败,则将消息投递给异常交换机,交由人工处理。

  1. 消息重复消费的出现的出现情况:

① 网络抖动 ② 消费者服务宕机

消费者处理完成消息后,因为上述原因无法正常返回ack回执到MQ,使得MQ中的消息无法正常删除,当消费者服务正常后,该消息又会被消费者重新处理,导致消息重复。

解决方案:

① 为每一条消息设置一个唯一标志ID

② 使用幂等方案(分布式锁、数据库锁),性能较差

相关推荐
无名客07 小时前
RocketMQ相对于RabbitMQ 的优势
分布式·rabbitmq·rocketmq
x-ming-code8 小时前
Spring AOP + Redisson 实现基于注解的分布式限流方案
java·redis·分布式·spring
孟意昶8 小时前
Spark专题-第二部分:Spark SQL 入门(5)-算子介绍-Join
大数据·分布式·sql·spark·big data
掘金-我是哪吒8 小时前
分布式微服务系统架构第172集:Kafka、MongoDB、Redis、MySQL
redis·分布式·微服务·kafka·系统架构
Dobby_059 小时前
【Hadoop】ZooKeeper:分布式系统的协调核心与一致性保障
大数据·hadoop·分布式·zookeeper
掘金-我是哪吒10 小时前
分布式微服务系统架构第174集:kafka硬件配置
分布式·微服务·架构·kafka·系统架构
csdn_aspnet10 小时前
.NET Core 中 RabbitMQ 和 MassTransit 的使用
rabbitmq·.netcore·masstransit
绝顶少年10 小时前
Spring Boot 集成 RabbitMQ 实现可靠消息传递:从配置到实战
spring boot·rabbitmq·java-rabbitmq
权^10 小时前
Hadoop 保姆级搭建手册:突出教程的细致和易上手
大数据·hadoop·分布式