【RabbitMQ工作原理相关】

RabbitMQ如何保证消息不丢失

  1. 开启生产者确认机制,确保生产者的消息能到达队列
  2. 开启持久化功能,确保消息未消费前在队列中不会丢失
  3. 开启消费者确认机制为auto,由spring确认消息处理成功后完成ack
  4. 开启消费者失败重试机制,多次重试失败后将消息投递到异常交换机,交由人工处理

RabbitMQ生产者确认机制

RabbitMQ消费者确认机制

RabbitMQ消息持久化

RabbitMQ消息的重复消费问题如何解决的

产生原因:

  • 网络抖动
  • 消费者挂了

    解决方案:
  • 每条消息设置一个唯一的标识id
  • 幂等方案:【分布式锁、数据库锁(悲观锁、乐观锁)】

RabbitMQ 延迟队列如何实现

  • 使用场景:

    超时订单、限时优惠、定时发布...

  • 解决方案

    死信交换机 +TTL(消息存活时间)

  • 具体实施(延迟队列插件实现延迟队列DelayExchange)

    1. 声明一个交换机,添加delayed属性为true
    2. 发送消息时,添加x-delay头,值为超时时间


RabbitMQ消息堆积如何处理

  • 产生原因

    当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列

    存储消息达到上限,之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题

  • 解决方案

    1. 增加 更多消费者 ,提高消费速度

    2. 在消费者内开启线程池 加快消息处理速度

    3. 扩大队列容积,提高堆积上限,采用惰性队列

    • 在声明队列的时候可以设置属性x-queue-mode为lazy,即为惰性队列

    • 基于磁盘存储,消息上限高

    • 性能比较稳定,但基于磁盘存储,受限于磁盘IO,时效性会降低

RabbitMQ高可用机制

  • 在生产环境下,我们当时采用的镜像模式搭建的集群,共有3个节点
  • 镜像队列结构是一主多从(从就是镜像),所有操作都是主节点完成,然后同步给镜像节点
  • 主宕机后,镜像节点会替代成新的主(如果在主从同步完成前,主就已经宕机,可能出现数据丢失)

RabbitMQ 避免数据丢失的措施

我们可以采用仲裁队列 ,与镜像队列一样,都是主从模式,支持主从数据同步,主从同步基于Raft 协议,强一致。并且使用起来也非常简单,不需要额外的配置,在声明队列的时候只要指定这个是中裁队列即可

相关推荐
方方洛4 分钟前
ray教程-25-附录E-端到端实战案例
人工智能·分布式·机器学习
一条泥憨鱼1 天前
【消息队列】ACK确认了什么:消息队列可靠投递的完整链路
java·后端·kafka·消息队列·rabbitmq
迅翼SwiftWing1 天前
编队系列(二)|固定翼如何依靠邻居信息保持队形?一致性控制、通信拓扑与分布式仿真实现,附仿真代码
分布式
ly76891 天前
幂等消费者与重试副作用:Kafka 端点接入时的去重边界
分布式·kafka·linq·apache camel·幂等消费者·重试副作用·去重边界
qq_452396231 天前
第三篇:《从 ZooKeeper 到 KRaft 的迁移实战:前置条件、三阶段流程与回滚策略》
分布式·zookeeper·云原生
真上帝的左手2 天前
30. 技术专题-‌应用框架组件-关系型数据库-MySQL-Mybatis
数据库·分布式·mysql·中间件·mybatis
程序猿乐锅2 天前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
sunny06602 天前
推理 INFRA 方法论(2):分布式推理:TP、DP、EP、CP 与 PP 的取舍
人工智能·分布式
字节探索2 天前
Redis 分布式锁:从 SETNX 误删到看门狗自动续期的原理与实践
redis·分布式
真上帝的左手2 天前
30. 技术专题-‌应用框架组件-缓存-Redis
数据库·redis·分布式·缓存·中间件