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

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

相关推荐
zxsz_com_cn1 小时前
设备预测性维护方案设计方向,如何设计设备预测性维护方案
分布式
少许极端9 小时前
消息队列-RabbitMQ(1)
分布式·消息队列·rabbitmq
若水不如远方10 小时前
分布式一致性(七):架构角度 —— 分布式共识系统的选型指南
分布式·后端
&&月弥11 小时前
三大开源消息队列(Kafka、RabbitMQ、RocketMQ)使用教程
kafka·开源·rabbitmq
Darkdreams12 小时前
分布式监控Skywalking安装及使用教程(保姆级教程)
分布式·skywalking
深蓝电商API21 小时前
分布式事务在跨境交易中的解决方案
分布式·跨境电商·代购系统·反向海淘·代购平台·跨境代购
我真会写代码1 天前
从入门到精通:Kafka核心原理与实战避坑指南
分布式·缓存·kafka
黄俊懿1 天前
【架构师从入门到进阶】第二章:系统衡量指标——第一节:伸缩性、扩展性、安全性
分布式·后端·中间件·架构·系统架构·架构设计
一叶飘零_sweeeet1 天前
击穿 Kafka 高可用核心:分区副本、ISR 机制与底层原理全链路拆解
分布式·架构·kafka
007张三丰1 天前
常用缓存技术全方位解析:从本地缓存到分布式缓存
分布式·缓存