面试题:RabbitMQ 消息队列中间件

1. 确保消息不丢失

  • 生产者确认机制
    确保生产者的消息能到达队列,如果报错可以先记录到日志中,再去修复数据
  • 持久化功能
    确保消息未消费前在队列中不会丢失,其中的交换机、队列、和消息都要做持久化
  • 消费者确认机制
    由spring确认消息处理成功后完成ack,当然也需要设置一定的重试次数,我们当时设置了3次,如果重试3次还没有收到消息,就将失败后的消息投递到异常交换机,交由人工处理

2. 消息重复消费问题

出现背景:消费者设置了自动确认机制,在消费者消费完消息后 的 ACK 确认消息 因为网络波动或者宕机的原因没有发送到 MQ,MQ中的消息并没有删除,这就将会导致消息的重复消费

解决方案:

  • 消息唯一ID
    给每一条消息的设置一个唯一标识ID ,我们在处理消息时,先到数据库查询一下,这个消息是否已经处理过,如果没有处理过,这个时候就可以正常处理这个消息了,处理前就可以把当前的 消息ID 标记为 处理中,处理完成后 再把此 消息ID 标记为 处理完。如果已经处理过这个消息了,就说明消息重复消费了,我们就不需要再消费了。
  • 幂等问题:数据库的唯一约束和锁、分布式锁?

3. 延迟队列

💖 死信队列+消息过期时间

如果消息超时未消费 就会变成死信 ,在 RabbitMQ 中如果消息成为死信,队列可以绑定一个死信交换机 ,在死信交换机上可以绑定其他队列,在我们发消息的时候可以按照需求指定TTL的时间,这样就实现了延迟队列的功能了。

💖 延时队列插件

  • 使用 RabbitMQ 的延迟队列插件,如 rabbitmq-delayed-message-exchange 插件。
  • 安装插件后,可以创建延迟交换(Delayed Message Exchange),它允许你指定消息的延迟时间。
  • 发送消息时,指定消息的 x-delay 属性来设置延迟时间。

4. 消息堆积

  • 提高消费者的消费能力,比如使用多线程消费消息
  • 增加更多的消费者,提高消费速度
    使用工作队列模式,设置多个消费者消费同一个队列中的消息
  • 扩大队列的容积,提高堆积上限
    • 可以使用 RabbitMQ 的惰性队列
      • 接收消息后直接存入磁盘而非内存
      • 消费者需要消费消息时才会从磁盘中读取并加载到内存
      • 支持百万条消息的存储

5. 高可用

  • 普通集群

  • 镜像集群

  • 仲裁队列(强一致性)

相关推荐
vip1024p2 天前
全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
jmeter·中间件·性能优化
九河云2 天前
分布式数据库中间件(DDM)的使用场景
数据库·分布式·中间件·华为云
Thuni_soft2 天前
华宇TAS应用中间件与新支点多款软件及操作系统完成兼容互认证
中间件
16年上任的CTO2 天前
一文大白话讲清楚Node中间件
中间件·node.js·express
m0_674031433 天前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构
nfenghklibra3 天前
Express中间件
中间件·node.js·express
update_z4 天前
【RocketMQ 消息中间件】RocketMQ篇之-消息存储 为什么性能高 CommitLog ConsumeQueue IndexFile 刷盘机制 同步 异步
中间件
老K(郭云开)4 天前
最新版Edge浏览器加载ActiveX控件技术——allWebPlugin中间件之awp_CreateActiveXObject接口用法
前端·javascript·chrome·中间件·edge
小馋喵知识杂货铺4 天前
Nginx 集群测试
中间件
小白的一叶扁舟4 天前
Elasticsearch(ES)与 MySQL 的对比分析及在 Spring Boot 中的使用
java·数据库·spring boot·后端·mysql·elasticsearch·中间件