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

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

相关推荐
微三云 - 廖会灵 (私域系统开发)7 小时前
电商系统微服务拆分实战:从单体到Spring Cloud的分布式事务踩坑与补偿方案
分布式·spring cloud·微服务
ACP广源盛1392462567310 小时前
破局 PCIe 4.0 交换瓶颈@ACP#IX8024 / ASM58024参数及应用对比
大数据·人工智能·分布式·嵌入式硬件
淡然的煎蛋11 小时前
开始使用RabbitMQ
分布式·rabbitmq·ruby
笨鸟先飞的橘猫1 天前
skynet——分布式支持
分布式·skynet
ACP广源盛139246256731 天前
GSV6155 @ACP#工业车规 DP1.4 重定时器 Retimer
大数据·人工智能·分布式·嵌入式硬件
ACP广源盛139246256732 天前
GSV2221@ACP# DP1.4 MST 多流显示转换芯片国产工业多屏
大数据·人工智能·分布式·嵌入式硬件·spark
sukioe2 天前
从 0 到 1 构建城市公共设施智能报修与派单系统:FastAPI + Vue3 + RabbitMQ + Redis Geo + AI 工作流实践
redis·rabbitmq·fastapi
ACP广源盛139246256732 天前
GSV2231@ACP# 增强型 8K MST 多屏扩展芯片
大数据·人工智能·分布式·嵌入式硬件
虚心的百褶裙2 天前
远程调用服务架构设计及zookeeper技术详解(下篇)
分布式·zookeeper·云原生
清晨曦月2 天前
【从零构建分布式在线评测系统】二、Judge0服务器上的心跳程序
运维·服务器·分布式