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

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

相关推荐
用户8307196840827 小时前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者1 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者3 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧4 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖5 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农5 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者5 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀5 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式
Ronin3055 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
Asher05095 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式