当前位置: 首页 > news >正文

面试题: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. 高可用

  • 普通集群
    在这里插入图片描述

  • 镜像集群
    在这里插入图片描述

  • 仲裁队列(强一致性)
    在这里插入图片描述

相关文章:

  • 基于ssm的轻型卡车零部件销售平台(java项目+文档+源码)
  • 站群服务器如何提高搜索引擎排名
  • Linux中部署Java jar 包 shell 脚本
  • Excel中文显示问号
  • 多媒体编解码
  • Axure案例分享—垂直手风琴(附下载地址)
  • 如何使用 Python 本地客户端操作读写云服务器 Redis 缓存数据库详细教程(更新中)
  • Ubuntu20.04使用Neo4j导入CSV数据可视化知识图谱
  • 【C语言】预处理详解
  • 【C++】编程规范之表达式原则
  • 第四篇:3.3 无效流量(Invalid traffic) - IAB/MRC及《增强现实广告效果测量指南1.0》
  • Spring Boot 学习(2)——HelloWorld
  • docker部署nacos,单例模式(standalone),使用mysql数据库
  • 使用Java拓展本地开源大模型的网络搜索问答能力
  • 在Ubuntu 18.04上如何添加交换空间
  • ES6 ...操作符
  • javascript面向对象之创建对象
  • js中forEach回调同异步问题
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python_OOP
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Vue 重置组件到初始状态
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 实现菜单下拉伸展折叠效果demo
  • 项目实战-Api的解决方案
  • 学习笔记TF060:图像语音结合,看图说话
  • 阿里云ACE认证学习知识点梳理
  • 从如何停掉 Promise 链说起
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # Panda3d 碰撞检测系统介绍
  • #NOIP 2014#Day.2 T3 解方程
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (C语言)逆序输出字符串
  • (第二周)效能测试
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (七)Java对象在Hibernate持久化层的状态
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (四)linux文件内容查看
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET学习教程二——.net基础定义+VS常用设置
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [Angular 基础] - 表单:响应式表单
  • [BZOJ] 2044: 三维导弹拦截
  • [BZOJ3223]文艺平衡树
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [C++]运行时,如何确保一个对象是只读的