消息中间件(Leo)

news/2025/10/24 10:48:03/文章来源:https://www.cnblogs.com/Leo0O-Luo/p/19162636

消息中间件

知识框架

image-20251023153134534

RabbitMQ

RabbitMQ如何保证消息不丢失?

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

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

嗯,这个我们还真遇到过,是这样的,我们当时消费者是设置了自动确认机制,当服务还没来得及给 MQ 确认的时候,服务宕机了,导致服务重启之后,又消费了一次消息。这样就重复消费了因为我们当时处理的支付(订单 | 业务唯一标识),它有一个业务的唯一标识,我们再处理消息时,先到数据库查询一下,这个数据是否存在,如果不存在,说明没有处理过,这个时候就可以正常处理这个消息了。如果已经存在这个数据了,就说明消息重复消费了,我们就不需要再消费了

面试官:那你还知道其他的解决方案吗?

候选人:嗯,我想想~其实这个就是典型的幂等的问题,比如,redis 分布式锁、数据库的锁都是可以的

生产者确认机制

RabbitMQ提供了publisher confirm机制来避免消息发到MQ过程中丢失消息到MQ以后,会返回一个结果给发送者,表示消息是否处理成功

image-20251023153859946

消息失败后如何处理?

  • ​ 回调方法即时重发
  • ​ 记录日志
  • ​ 保存到数据库然后定时重发,成功消费后即刻删除表中的数据

消费者确认机制

RabbitMQ支持消费者确认机制,即消费者处理消息后可以向MQ发送ACK回执,MQ收到ACK回执后才删除改消息

SpringAMQP则允许三种确认模式

  • manual:手动akc,需要在业务代码结束后,调用api发送ACK
  • auto:自动ACK,由spring监测listenter代码是否出现异常,没有异常则返回ack;抛出异常则返回nack
  • none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后会立即删除

可以利用Spring的retry机制,在消费者出现异常时利用本地重试设置重试机制,当次数到达了后,如果消息依旧消费失效,将消息投递到异常交换机,交由人工处理

image-20251023165902765

消息持久化

MQ默认是内存存储消息,开启持久化功能可以确保缓存在MQ的消息不丢失

持久化流程:

写入磁盘:消息到达broker(消息服务器) 后,先写入内存缓冲区(提升效率),再异步/同步刷盘至磁盘文件

  • 同步刷盘:消息写入磁盘成功后才返回“发送成功”给生产者,可靠性高,但是性能低
  • 异步刷盘:消息先存储内存,定期批量刷盘,性能高,但极端情况下可能丢失少量信息(刷盘前宕机)

元数据记录:同时记录信息的元信息(偏移量、主题、队列、过期时间等),用于后续检索和恢复

消息消费后的清理机制:

  • 消费者成功消费并发送ACK后,broker会标记消息已消费,并在合适时机从磁盘删除,避免磁盘空间占用
  • 消费者未成功消费(处理失败),消息会保留在磁盘,等待重试或进入死信队列
对比维度 Redis MySQL(InnoDB) MQ(如 Kafka)
刷盘核心目标 兼顾 “缓存性能” 与 “数据可恢复” 保证 “事务 ACID”,数据绝对不丢 保证 “消息不丢失”+“高吞吐”
刷盘数据类型 全量数据(RDB)或操作日志(AOF) redo log(事务日志)+ 数据页 消息本身(带元数据,如偏移量)
特殊优化 AOF 重写(合并冗余操作,减小文件);RDB 压缩(节省磁盘) 双写缓冲(避免 redo log 频繁刷盘); checkpoint(异步刷数据页) 顺序写(磁盘效率最高的写入方式);副本同步(多副本刷盘才算成功)

死信交换机

当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter):

  • 消费者使用basic.rejectbasic.nack声明消费失败,并且消息的requeue参数设置为false
  • 消息是一个过期消息,超时无人消费
  • 要投递的队列消息堆积满了,最早的消息可能成为死信

如果该队列配置了dead-letter-exchange属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机称为死信交换机(Dead Letter Exchange,简称 DLX)。

flowchart LRA[publisher] --> B[simple.direct]B --> C[simple.queue]C --> D[consumer]C --> E[dl.direct]E --> F[dl.queue]D -- reject --> CC -- dead-letter-exchange = dl.direct<br>dead-letter-routing-key = dl --> EE -- dl --> F

TTL(Time-To-Live)

TTL,也就是 Time-To-Live。如果一个队列中的消息 TTL 结束仍未消费,则会变为死信,ttl 超时分为两种情况:

  • 消息所在的队列设置了存活时间
  • 消息本身设置了存活时间
flowchart LRA[publisher] -- ttl = 5000 --> B[ttl.direct]B -- ttl --> C[ttl.queue]C -- x-message-ttl = 10000 --> CC --> D[dl.direct]D -- dl --> E[dl.queue]E --> F[consumer]

reject

dead-letter-exchange = dl.direct
dead-letter-routing-key = dl

dl

publisher

simple.direct

simple.queue

consumer

dl.direct

dl.queue

延迟队列

延迟队列就是用到了死信交换机和 TTL(消息存活时间)实现的

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

我记得 RabbitMQ 还有一种方式可以实现延迟队列,在 RabbitMQ 中安装一个死信插件,这样更方便一些,我们只需要在声明交换机的时候,指定这个就是死信交换机,然后在发送消息的时候直接指定超时时间就行了,相对与死信交换机 + TTL 要省略了一些步骤

消息堆积解决方法

当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题

三种解决思路:

  • ​ 增加更多消费者,提高消息消费速度
  • ​ 在消费者内开启线程池加快消息处理速度
  • ​ 扩大队列容积,提高堆积上限,采用惰性队列
    • 在声明队列的时候可以设置属性x-queue-mode为lazy,即惰性队列
    • 基于磁盘存储,上限更高
    • 性能较稳定,但基于磁盘存储,受限于磁盘IO,时校性会降低

惰性队列

惰性队列的特征

  • 接收到消息后直接存储到磁盘而非内存
  • 消费者要消费消息时才会从磁盘中读取并加载到内存
  • 支持数百万条的消息存储

RabbitMQ的高可用机制

在生产环境下采用集群保证高可用

普通集群、镜像集群、仲裁集群

普通集群

也叫做标准集群具备下列特征

  • 会在集训的各个节点共享部分数据,包括:交换机,队列元信息。不包括队列中的信息
  • 当访问集群的某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回
  • 队列所在节点宕机,队列中的消息就会丢失

image-20251024094157507

镜像集群

本质是主从模式,具备以下特征:

  • 交换机、队列、队列中的消息会在各个mq的镜像节点之间同步备份

  • 创建队列的节点叫做该队列的主节点备份到其它节点叫做该队列的镜像节点

  • 一个队列的主节点可能是另一个队列的镜像节点

  • 所有操作都是主节点完成,然后备份到镜像节点

  • 主宕机后,镜像节点会替代成为新的主

image-20251024094804015

仲裁队列

是3.8版本后才有的新功能,用来替代镜像队列,具备下列特征

  • 与镜像队列一样,都是主从模式,支持主从数据同步
  • 使用非常简单,没有复杂的配置
  • 主从同步基于Raft协议,强一致(解决镜像队列宕机丢数据)

RabbitMQ、RocketMQ和Kafka对比

对比维度 Kafka RabbitMQ RocketMQ
设计定位 高吞吐日志 / 数据同步(大数据场景) 灵活路由的通用消息队列(企业级业务) 高可靠 + 高吞吐的企业级消息队列(互联网业务)
开发语言 Scala/Java Erlang Java
核心优势 1. 百万级 TPS(高吞吐)2. 持久化性能强(顺序写磁盘)3. 分布式架构易扩容 1. 路由灵活(交换机类型多:Direct/Topic/Fanout/Headers)2. 社区成熟,生态完善3. 支持死信、重试、延迟等细粒度控制 1. 兼顾高吞吐(十万级 TPS)与低延迟2. 原生支持分布式事务、定时消息3. 适合复杂业务场景(如订单、支付)
核心劣势 1. 消息可靠性需依赖配置(如多副本)2. 路由功能简单(仅 Topic 路由)3. 延迟消息需二次开发 1. 高吞吐场景下性能较弱(万级 TPS)2. Erlang 语言开发,定制化难度高 1. 生态较 Kafka/RabbitMQ 弱2. 延迟消息精度较低(分钟级)
消息延迟 毫秒级(高吞吐下略高) 微秒级(轻量场景下极低) 毫秒级
可靠性保障 依赖副本数(replication-factor),acks=-1 时不丢消息 需手动配置 “队列 + 消息持久化”,支持事务消息 原生支持事务消息、消息轨迹,可靠性默认更强
社区与生态 大数据领域生态第一(适配 Spark/Flink) 通用 MQ 生态第一(客户端语言多) 阿里系生态,国内互联网企业用得多

Kafka是如何保证消息不丢失

需要从三个层面解决这个问题:

  • 生产者发送消息到Brocker丢失
    • ​ 设置异步发送,发送失败就自己回调重试或记录,设置重试次数上限
  • 消息在Brocker中存储丢失
    • 发送确认ack,选择all,让所有的副本都参与保存数据后确认
  • 消费者从Brocker接收消息丢失
    • 关闭自动提交偏移量,开启手动提交偏移量
    • 提交方式,最好事同步+异步

Kafka中消息重复消费问题:

  • 关闭自动提交偏移量,开启手动提交偏移量
  • 提交方式,最好是同步+异步提交
  • 幂等方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/945028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 UFactory基类或 CreateDefaultSubobject()动态生成对象

使用 UFactory基类或 CreateDefaultSubobject()动态生成对象实现方式​​:使用 UFactory基类或 CreateDefaultSubobject()动态生成对象。 ​​应用场景​​:动态生成敌人:根据配置生成 AZombie或 ADemon。 武器系统…

2025年诚信的在线压花机,工具房压花机,木塑压花机,离线压花机厂家推荐及采购指南

2025年诚信的在线压花机、工具房压花机、木塑压花机、离线压花机厂家推荐及采购指南 开篇介绍 随着工业制造技术的不断发展,压花机在板材加工、木塑复合材料、金属装饰等领域的需求日益增长。无论是在线压花机、离线…

使用 Delegate(委托)和 MulticastDelegate(多播委托)实现事件监听

使用 Delegate(委托)和 MulticastDelegate(多播委托)实现事件监听实现方式​​:使用 Delegate(委托)和 MulticastDelegate(多播委托)实现事件监听。 ​​应用场景​​:UI 更新:角色血量变化时触发 HUD 更新…

DevSecOps在中国:安全与效率的双重革命

DevSecOps在中国:安全与效率的双重革命 随着数字化转型浪潮席卷全球,中国企业在软件开发领域正面临前所未有的安全挑战。近年来,《网络安全法》和《数据安全法》的相继实施,为软件产业的安全发展划定了清晰的法律边…

Decart 发布口型实时同步 API;云蝠语音智能体发布网页语音客服模块丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态…

百度PaddleOCR-VL:基于0.9B超紧凑视觉语言模型,支持109种语言,性能超越GPT-4o等大模型

原文: https://mp.weixin.qq.com/s/zba1UAyqoKaTvOUIr6P_vg 全文摘要PaddleOCR-VL 是一款主打资源高效的文档解析工具,核心部分是 PaddleOCR-VL-0.9B—— 它是个小巧但能力强的视觉语言组件,结合了 NaViT 风格的动态…

2025年正规的pp储罐,聚丙烯pp储罐最新TOP厂家推荐

2025年正规的PP储罐,聚丙烯PP储罐最新TOP厂家推荐行业概述聚丙烯(PP)储罐作为化工行业重要的防腐储存设备,凭借其优异的耐腐蚀性、轻量化特性和经济性,已成为化工、制药、环保等领域的首选容器。随着2025年新材料技术…

2025 年成型机源头厂家最新推荐排行榜:冷弯 / 卷帘门 / 卷闸门 / 彩钢瓦 / 光伏水槽设备优选,16 年经验企业领衔

引言 当前金属加工行业对成型机需求激增,但市场厂家实力悬殊,给企业选购带来极大困扰。部分厂家无核心技术,设备成品率低、操作复杂,故障排查耗时长,严重拖慢生产;部分厂家售后不完善,设备出问题后响应迟缓,造…

2025年10月小型桨叶干燥机厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析

小型桨叶干燥机作为干燥设备领域的重要分支,在化工、食品、医药等行业中发挥着关键作用。随着产业升级和技术进步,市场对设备的节能性、稳定性和定制化需求日益提升。本报告基于行业调研数据,从企业专利技术、品质管…

2025年质量好的苏州切削液过滤机,切削液过滤机,移动式切削液过滤机直销制造

2025年质量好的苏州切削液过滤机,切削液过滤机,移动式切削液过滤机直销制造 行业概述 切削液过滤机是现代机械加工行业中不可或缺的环保设备,主要用于金属加工过程中切削液的净化、循环利用,有效延长切削液使用寿命…

详细介绍:企业协同办公平台与零信任安全防护的融合实践

详细介绍:企业协同办公平台与零信任安全防护的融合实践2025-10-24 10:40 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

2025年优质的全屋定制直销制造

2025年优质的全屋定制直销制造推荐指南 在当今家居装修市场中,全屋定制凭借其个性化设计、空间利用率高、风格统一等优势,成为越来越多消费者的首选。2025年,全屋定制行业竞争更加激烈,消费者在选择时不仅关注价格…

FastReport .NET 2026.1 全新发布: 统一Demo中心、全新Ribbon界面、Excel公式导出、Word图像质量设置等重磅升级!

FastReport .NET 2026.1版本全新发布!本次更新带来了多项重要功能改进与性能优化,包括:NET 产品统一演示中心(Demo Center)、内置数据库插件的报表设计器、全新 Ribbon UI 界面与 RibbonDesignerControl 控件、Ex…

用于跨模态编码和效应子预测的语言嵌入与生物特征对比学习

作者信息 彭越1,吴俊泽,孙毅1,张元星 \({}^{2}\) ,王启尧 \({}^{1,3,4}\) & 邵帅 \({}^{1,3,4}\) \({}^{1}\) 生物反应器工程国家重点实验室,华东理工大学,中国上海。 \({}^{2}\) 南方海洋科学与工程广东省实…

2025年质量好的封边条,肤感封边条,金属封边条厂家最新TOP推荐榜

2025年质量好的封边条,肤感封边条,金属封边条厂家最新TOP推荐榜封边条作为定制家具制造中不可或缺的关键材料,其质量直接影响家具的整体美观度、耐用性和环保性能。随着家居行业对细节要求的不断提升,封边条行业也在…

2025年质量好的香氛系列亚克力展示架,轻奢鞋服亚克力展示架,3C数码产品亚克力展示架推荐TOP生产厂家

2025年质量好的香氛系列亚克力展示架,轻奢鞋服亚克力展示架,3C数码产品亚克力展示架推荐TOP生产厂家 开篇介绍 在当今竞争激烈的零售环境中,优质的展示架不仅能提升产品陈列效果,还能增强品牌形象,吸引更多消费者…

Aspose.Words for Python 现已支持基于 AI 的文档翻译功能!

作为全球知名的文档处理组件厂商之一,Aspose 推出的 Aspose.Words for Python 现已全面支持 AI 智能翻译功能,通过全新的 aspose.words.ai 模块,为开发者提供高精度、结构化、自动化的 Word 文档翻译体验。在全球化…

2025年可靠的亚克力制品,亚克力加工品牌厂家排行榜

2025年可靠的亚克力制品与亚克力加工品牌厂家排行榜 亚克力制品因其高透明度、耐候性强、易加工等特性,广泛应用于商业展示、家居装饰、广告标识等领域。随着市场对定制化、高端化需求的提升,选择一家技术过硬、服务…

xxl-job 数据库表详解

-------------------------------------------------------------------------- XXL-JOB 的数据库表设计围绕分布式任务调度的核心功能展开,主要包括任务配置、执行器管理、日志记录、状态监控等模块。以下是核心表的…

2025 电动缸源头厂家最新推荐榜:剖析专精特新企业成本优势与技术实力的权威选购指南

引言 工业 4.0 深化推进下,电动缸作为自动化产线核心执行部件,市场需求年增速超 20%,但行业乱象却让采购决策陷入困境。部分厂家缺乏核心技术,依赖外购关键部件导致兼容性差、故障率居高不下;另有企业以次充好,通…