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

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

相关推荐
阿华田5125 小时前
分布式分片执行原理解析
分布式·分片执行
suuijbd12 小时前
SpringCloud+Netty集群即时通讯项目
spring boot·分布式·spring cloud·java-rabbitmq·java-zookeeper
一叶飘零_sweeeet15 小时前
幂等性 VS 分布式锁:分布式系统一致性的两大护法 —— 从原理到实战的深度剖析
分布式·分布式锁·接口幂等
更深兼春远15 小时前
Spark on Yarn安装部署
大数据·分布式·spark
Mxsoft61916 小时前
电力设备绝缘状态分布式光纤传感实时监测与多维度诊断技术
分布式
Java爱好狂.16 小时前
分布式ID|从源码角度深度解析美团Leaf双Buffer优化方案
java·数据库·分布式·分布式id·es·java面试·java程序员
极造数字18 小时前
从EMS看分布式能源发展:挑战与机遇并存
人工智能·分布式·物联网·信息可视化·能源·制造
阿萨德528号21 小时前
Redis 分布式锁进阶:跨语言场景下的锁兼容性与一致性保障
数据库·redis·分布式
新疆嘉博智选科技有限公司1 天前
Macos系统上搭建Hadoop详细过程
大数据·hadoop·分布式
JH30732 天前
《Redis 经典应用场景(一):缓存、分布式锁与限流》
redis·分布式·缓存