
消息队列
文章平均质量分 92
小志的博客
随笔笔记,仅供参考
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【进阶篇-消息队列】——主流消息队列都是如何存储消息的
消息队列作为分布式存储系统,其性能主要取决于存储结构设计。Kafka采用分区存储,每个分区对应一组消息文件和稀疏索引文件,支持批量顺序读取但寻址较慢;RocketMQ以Broker为单位存储,所有主题消息写入同一组文件,采用稠密索引实现快速定位。两种架构各有优势:Kafka分区粒度更细便于扩展,稀疏索引节省存储但查询性能稍弱;RocketMQ粗粒度存储提升写入吞吐量,稠密索引加快查询速度。实际应用中需根据业务特点选择,如海量小消息场景适合Kafka,而多主题高并发写入场景则RocketMQ更具优势。理解底层原创 2025-07-06 19:59:52 · 700 阅读 · 0 评论 -
【进阶篇-消息队列】——Pulsar的存储计算分离设计(全新的消息队列设计思路)
Apache Pulsar采用创新的存储计算分离架构,将消息存储在BookKeeper集群中,元数据保存在ZooKeeper集群,使得Broker成为无状态节点。这种设计使分区可以动态分配到任意Broker,提升了负载均衡和故障恢复能力。相比传统消息队列,存储计算分离降低了开发复杂度,但增加了系统整体复杂度和网络开销。虽然性能有所损失,但其调度灵活性和易于扩展的优势使其成为消息队列架构的未来发展方向。Pulsar的Ledger写入机制和全局复制功能也为分布式系统设计提供了新思路。原创 2025-07-06 19:23:31 · 745 阅读 · 0 评论 -
【进阶篇-消息队列】——Kafka 和 RocketMQ 如何通过选举来产生新的 Leader
Kafka和RocketMQ采用不同机制实现Leader选举。Kafka通过ZooKeeper进行抢占式选举:各Broker尝试创建临时节点/controller,成功者成为Leader,其他节点监控该节点并在Leader失效时重新竞争。这种方法简单快速,适用于多种分布式存储系统。而RocketMQ(Dledger)采用Raft算法进行自我选举,无需外部系统但实现复杂,选举过程较慢。对于分布式业务系统,Kafka的抢占式选举方案更为简单实用。原创 2025-07-04 22:30:41 · 896 阅读 · 0 评论 -
【进阶篇-消息队列】——MQTT协议如何支持海量的在线IoT设备
摘要:本文介绍了物联网(IoT)及其核心通信协议MQTT的特点与应用。IoT通过互联网连接各类设备实现万物互联,而MQTT是为物联网设计的轻量级消息队列协议,具有精简报文、心跳机制和会话管理等特点,适合性能有限的IoT设备和不稳定的网络环境。文章对比了MQTT与传统消息队列的差异,指出MQTT面临海量客户端和主题的挑战。在技术选型方面,建议小规模场景选择开源产品,大规模部署需考虑云服务或自行构建集群。最后提出通过Proxy集群解决海量连接、会话管理和主题分片等核心问题,为构建高性能MQTT集群提供解决方案。原创 2025-07-04 21:21:46 · 1142 阅读 · 0 评论 -
【进阶篇-消息队列】——Kafka如何实现事务的
Kafka的事务机制与RocketMQ不同,主要用于确保多条消息(可跨主题和分区)的事务性发送,而非解决本地事务与消息发送的一致性。Kafka的事务与幂等机制结合,实现其特有的Exactly Once语义,主要应用于流计算场景,确保数据从Kafka消费、计算到存储回Kafka的过程不重不丢。其实现基于两阶段提交,引入事务协调者记录事务日志,消息直接写入业务分区,通过客户端过滤未提交消息。相比之下,RocketMQ通过特殊队列暂存事务消息,更适合解决本地事务与消息发送的一致性问题。两者虽都基于两阶段提交,但设原创 2025-07-03 22:49:33 · 813 阅读 · 0 评论 -
【进阶篇-消息队列】——RocketMQ如何实现事务的
RocketMQ事务消息实现摘要(149字): RocketMQ通过半消息机制实现分布式事务。生产者发送消息时标记为"半消息"状态,Broker接收后暂不投递。本地事务执行成功后回调COMMIT_MESSAGE,失败则ROLLBACK_MESSAGE。若本地事务状态未知,Broker会定期回调checkLocalTransaction进行状态检查。文中示例展示了创建订单场景下,通过TransactionListener实现本地订单创建与消息发送的原子性。源码层面,sendMessageI原创 2025-07-03 22:20:03 · 1190 阅读 · 0 评论 -
【进阶篇-消息队列】——RocketMQ客户端如何在集群中找到正确的节点
摘要: 本文解析了RocketMQ中NameServer的核心机制,它作为分布式集群的协调服务,为Broker、生产者和消费者提供寻址与状态监控功能。NameServer通过独立节点或集群部署,各节点无通信依赖,确保高可用性。Broker主动上报路由信息并维持心跳,NameServer据此动态更新路由表并剔除异常节点。客户端通过查询NameServer获取主题对应的Broker地址,实现故障自动切换。源码分析揭示了RouteInfoManager类如何用内存存储路由数据(如topicQueueTable和b原创 2025-07-03 21:30:41 · 889 阅读 · 0 评论 -
【进阶篇-消息队列】——Kafka和RocketMQ的消息复制实现的差异点在哪
本文探讨了消息队列中的消息复制机制及其面临的挑战。消息复制主要用于提高数据可靠性和系统高可用性,但需在性能、一致性和高可用性之间权衡。RocketMQ采用主从复制,提供异步和同步双写两种方式,兼顾性能和数据安全;Kafka基于分区副本,通过ISR配置灵活平衡一致性、可用性和性能。两种方案各有优劣,RocketMQ更易用,Kafka更灵活但复杂度高。实际应用中需根据业务需求选择合适的复制策略,无法同时完美兼顾三大特性。原创 2025-07-02 23:53:39 · 714 阅读 · 0 评论 -
【进阶篇-消息队列】——Kafka Consumer源码分析(消息消费的实现过程)
Kafka消费者源码分析摘要 本文基于Kafka 2.2版本源码,分析了消费者实现的关键流程。主要内容包括: 消费模型回顾:重点说明消费者组、分区分配、协调者等核心概念; 订阅流程:通过subscribe()方法更新订阅状态和元数据,标记需要更新但未立即请求; 消息拉取流程:通过poll()方法触发元数据更新和实际消息获取,包含与协调者的交互; 线程安全设计:使用acquireAndEnsureOpen()机制保证线程安全; 异步通信实现:通过ConsumerNetworkClient实现无阻塞的网络通信。原创 2025-07-02 23:09:35 · 849 阅读 · 0 评论 -
【进阶篇-消息队列】——RocketMQ Producer源码分析(消息生产的实现过程)
本文分析了RocketMQ Producer客户端的源码实现,重点探讨了消息发送的原理和客户端设计。首先介绍了源码获取方式,建议通过单元测试用例入手分析Producer API的使用。文章详细讲解了Producer的启动过程,揭示其采用门面模式隐藏内部复杂性,通过状态模式管理服务状态的关键设计。在初始化过程中,Producer会创建MQClientInstance实例、注册自身并发送心跳检测。文中强调优秀开源项目通过充分测试保证质量,并建议开发者学习这些设计模式的应用。分析源码时需关注实现原理和优秀设计,为原创 2025-07-01 22:26:40 · 688 阅读 · 0 评论 -
【进阶篇-消息队列】——Kafka 是如何处理消息压缩(数据压缩)
数据压缩是提升系统性能的有效方法,通过牺牲CPU资源换取存储空间和网络带宽。本文探讨了压缩技术的应用场景、算法选择和分段策略。使用压缩前需权衡系统资源瓶颈,若CPU有余而IO不足则适合压缩。常见的无损压缩算法如ZIP、GZIP、SNAPPY等各有特点,压缩率和耗时需平衡。压缩分段大小影响压缩效率,过大会造成解压浪费。以Kafka为例,其采用客户端批量压缩,服务端不解压的设计,既节省资源又提升吞吐。合理运用数据压缩能在特定场景显著优化系统性能。原创 2025-07-01 21:56:26 · 494 阅读 · 0 评论 -
【进阶篇-消息队列】——如何用硬件同步原语(CAS)替代锁
硬件同步原语(如CAS和FAA)是CPU提供的原子操作,可替代锁实现并发安全且性能更高。CAS通过比较-交换机制确保数据修改的原子性,适用于"读取-计算-更新"场景,但线程竞争频繁时会因重试消耗CPU资源。FAA则更适合简单的加减操作。本文通过账户转账的Go语言示例,对比了锁、CAS和FAA三种实现方式,说明CAS原语在低竞争场景下能兼顾安全性与性能,但需注意其适用条件。合理选用同步原语可以提升并发程序效率。原创 2025-06-30 22:49:06 · 691 阅读 · 0 评论 -
【进阶篇-消息队列】——如何正确使用锁保护共享数据、协调异步线程
**摘要:消息队列中的锁使用与优化 在多线程环境中,锁是保护共享资源的必要手段,但不当使用会降低性能甚至导致死锁。本文从微信群报名的并发问题引入,分析了锁的原理与使用场景,强调锁的滥用会导致性能损失和死锁风险。正确使用锁需遵循获取-访问-释放的流程,并确保异常情况下也能释放锁。文章详细探讨了死锁的三种成因(未释放锁、不可重入锁、多锁循环等待),并给出避免死锁的5条建议,包括减少锁数量、保持加解锁顺序一致等。此外,针对读多写少场景,推荐使用读写锁(如ReentrantReadWriteLock)以提升性能,但原创 2025-06-30 22:13:40 · 798 阅读 · 0 评论 -
【进阶篇-消息队列】——如何使用缓存来减少磁盘IO
摘要: 本文探讨了消息队列中磁盘与缓存的优化策略。磁盘具备持久化和低成本优势,但读写速度慢,而内存缓存可显著提升性能。缓存分为读写缓存(如Kafka的PageCache)和只读缓存,前者牺牲一致性换取性能,适用于读写均衡场景;后者更适合读多写少的业务系统,需关注数据一致性和置换策略。保持缓存数据新鲜可通过同步更新、定期同步或设置过期时间实现;置换策略推荐LRU算法或业务定制化方案。合理选择缓存类型和更新策略,可有效提升系统性能与命中率。原创 2025-06-27 23:22:53 · 1138 阅读 · 0 评论 -
【进阶篇-消息队列】——Kafka如何实现高性能IO
本文解析了Apache Kafka实现高性能消息队列的四大核心技术:1)采用批量消息处理机制,客户端异步攒批发送,服务端整批处理,显著提升吞吐量;2)利用磁盘顺序读写特性设计存储结构,比随机读写性能提升数十倍;3)通过操作系统PageCache缓存热点数据,减少磁盘IO并提高读取速度;4)使用零拷贝技术优化消费流程,减少数据复制次数,降低CPU开销。这些底层优化使Kafka在消息队列中保持顶尖性能,体现了其对网络编程、操作系统等底层技术的深度运用。原创 2025-06-27 22:38:46 · 665 阅读 · 0 评论 -
【进阶篇-消息队列】——如何避免内存溢出和频繁的垃圾回收
本文介绍了自动内存管理机制的原理及其在高并发场景下的问题。现代编程语言采用自动内存管理,通过标记-清除算法进行垃圾回收,但该过程会暂停进程。在高并发情况下,大量对象快速占用内存,导致频繁且长时间的垃圾回收,形成恶性循环,表现为程序"卡死"。为解决这一问题,文章建议优化代码减少一次性对象创建、使用对象池重用对象或增加服务器内存。自行管理内存虽然可行但复杂度高。总体而言,合理优化可以有效减轻垃圾回收压力,提升高并发性能。原创 2025-06-26 22:45:00 · 784 阅读 · 0 评论 -
【进阶篇-消息队列】——如何通过网络传输结构化的数据( 序列化与反序列化)
摘要: 本文探讨了网络通信中结构化数据的序列化与反序列化技术。结构化数据需转换为二进制流(序列化)才能在网络中传输,反序列化则用于还原数据。通用序列化实现(如JSON、Protobuf)需权衡可读性、复杂度、速度及信息密度:JSON适合业务系统,兼顾可读性与易用性;二进制序列化(如Kryo)性能更优但牺牲可读性。消息队列等高性能场景常采用专用序列化方法,通过优化字段存储顺序和类型编码提升效率(如12字节即可序列化User对象),但实现复杂。最终选择需根据业务需求平衡各项指标。原创 2025-06-25 22:12:54 · 493 阅读 · 0 评论 -
【进阶篇-消息队列】——如何实现高性能的异步网络传输
本文讨论了异步网络框架在IO密集型系统中的应用。通过对比同步网络IO模型的局限性,提出了异步网络IO的两种实现方案:Netty和NIO。同步网络IO模型在处理大量连接时效率低下,而异步设计可以显著提升性能。Netty提供了一套完整的异步网络IO解决方案,简化了线程控制、缓存管理等复杂问题;NIO则提供了更底层的Selector机制,实现单线程多路复用。文章详细介绍了两种框架的API设计和使用方法,并分析了它们各自的优势。最终表明,异步网络IO框架能够有效解决高并发场景下的性能问题。原创 2025-06-25 22:45:00 · 999 阅读 · 0 评论 -
【进阶篇-消息队列】——如何使用异步设计提升系统性能
摘要: 本文探讨了异步编程如何提升系统性能。通过转账微服务的示例,对比同步与异步实现的差异:同步方式因线程等待导致吞吐量受限,而异步设计通过回调机制减少线程阻塞,显著提升吞吐量和响应速度。文章还介绍了Java8的CompletableFuture框架,演示如何用其优雅地实现异步转账服务,解决高并发场景下的性能瓶颈。异步模式尤其适合消息队列等高吞吐量系统,能有效降低延迟,提升资源利用率。 (150字)原创 2025-06-24 23:04:04 · 814 阅读 · 0 评论 -
【基础篇-消息队列】—— 如何实现单个队列的并行消费及如何保证消息的严格顺序
文章摘要: 本文探讨了消息队列的两种消费模式:1) 并行消费的实现方式,通过多消费者分配不同消息并处理"消息空洞"问题,但指出其开销较大,建议优先扩容队列数;2) 严格顺序消费的两种场景——全局有序需限制单队列单实例,局部有序(如按账户ID)可通过一致性哈希或取模算法确保相同Key消息入同一队列。强调实际业务中通常仅需局部有序即可满足需求。原创 2025-06-24 22:29:17 · 343 阅读 · 0 评论 -
【基础篇-消息队列】——详解 RocketMQ 和 Kafka 的消息模型
本文通过示例详细解析了RocketMQ和Kafka的消息模型。以一个包含5个队列、分布在2个Broker上的MyTopic主题为例,说明生产者可以自由选择队列发送消息。重点讲解了消费组机制:不同消费组相互独立,同一消费组内每个队列只能由一个消费者实例占用,但消费者与消费位置无关。消费位置由服务端维护,记录各队列的消费进度。文章还通过表格直观展示了消费位置的管理方式,帮助读者深入理解消息队列的核心概念和运行机制。原创 2025-06-23 23:07:46 · 892 阅读 · 0 评论 -
【基础篇-消息队列】——网关如何接收服务端的秒杀结果
本文介绍了网关接收服务端秒杀结果的简单实现方案。网关在收到APP请求后生成唯一ID,通过消息队列异步发送请求至后端服务,并同步等待结果返回。后端处理完成后通过RPC返回结果,网关将结果存入Map并唤醒等待线程。该方案采用阻塞等待方式,性能并非最优,后续课程将介绍异步优化方法。整个流程包含请求转发、结果等待和响应返回三个主要环节,通过请求ID和网关ID确保消息正确路由。原创 2025-06-23 22:36:54 · 1156 阅读 · 0 评论 -
【基础篇-消息队列】——如何处理消息积压问题
摘要: 本文探讨消息队列中消息积压问题的优化与处理方案。积压主要源于消费性能不足或生产过快。优化性能需关注生产与消费两端:生产端可通过批量发送或并发提升吞吐量,消费端需确保消费能力高于生产速度,并同步扩容消费者实例与分区数。处理突发积压时,优先通过监控定位问题(生产加速或消费变慢),快速扩容消费者实例或降级非核心业务。关键点在于预防为主,发生时紧急扩容优先恢复系统可用性。避免使用内存队列等易丢失消息的临时方案。原创 2025-06-23 22:11:52 · 1077 阅读 · 0 评论 -
【基础篇-消息队列】——如何处理消费过程中的重复消息
消息队列中消息重复传递是常见问题,本文探讨了如何通过幂等性设计解决该问题。文章首先分析了三种消息传递服务质量标准(最多一次、至少一次、恰好一次),指出主流消息队列如Kafka、RabbitMQ等都只提供"至少一次"保证。为解决重复消息问题,提出了三种幂等性实现方法:1)利用数据库唯一约束防止重复操作;2)为数据更新设置前置条件;3)采用全局唯一ID记录并检查操作状态。其中前两种方法实现相对简单,第三种虽然通用性最强但实现复杂度高。这些方法不仅适用于消息处理,也可用于解决HTTP重复提交、原创 2025-06-21 22:59:18 · 590 阅读 · 0 评论 -
【基础篇-消息队列】——如何确保消息不会丢失
摘要: 消息队列如何确保消息可靠传递?关键在于三个阶段:生产、存储和消费。生产阶段通过请求确认机制,正确处理返回值或异常避免丢失;存储阶段需配置Broker参数(如同步刷盘、多副本)防止宕机丢消息;消费阶段应在业务逻辑完成后发送确认响应,避免逻辑出错导致丢失。检测消息丢失可利用有序性,通过连续序号验证。熟悉原理后,结合具体消息队列的API和配置,即可编写可靠代码,避免消息丢失。原创 2025-06-21 15:45:00 · 1312 阅读 · 0 评论 -
【基础篇-消息队列】——如何利用事务消息实现分布式事务
本文探讨了消息队列如何实现分布式事务,以订单系统与购物车系统的数据一致性为例进行分析。传统事务的ACID特性在分布式系统中难以完全实现,因此出现了分布式事务的多种解决方案,包括2PC、TCC和事务消息。文章详细介绍了事务消息的实现机制,重点解析了RocketMQ通过"半消息"和事务反查机制来确保"要么都成功,要么都失败"的一致性要求。与Kafka相比,RocketMQ的事务反查功能能够自动处理提交失败的情况,但强调不同消息队列的事务实现各有适用场景。文章最后指出,分布原创 2025-06-20 22:48:56 · 1003 阅读 · 0 评论 -
【基础篇-消息队列】——消息模型中的主题和队列有什么区别
本文探讨了消息队列中的两种核心消息模型:队列模型和发布-订阅模型。队列模型遵循严格的FIFO原则,而发布-订阅模型允许消息被多个消费者重复消费。RabbitMQ采用队列模型,通过Exchange模块实现发布-订阅功能;RocketMQ和Kafka则采用发布-订阅模型,通过多队列/分区机制解决消费性能问题,其中消费组和消费位置的概念至关重要。尽管业务模型相似,不同消息队列的实现机制差异很大。理解这些模型有助于更好地选择和使用消息队列产品。原创 2025-06-19 23:33:27 · 797 阅读 · 0 评论 -
【基础篇-消息队列】——如何选择消息队列
文章摘要: 本文对比了三大开源消息队列产品(RabbitMQ、RocketMQ、Kafka)的核心特性和适用场景。 RabbitMQ:轻量级、支持灵活路由,但性能较差(每秒几万条),Erlang语言二次开发困难,适合中小规模场景。 RocketMQ:阿里开源,性能强劲(每秒几十万条),低延迟,中文社区活跃,适合高并发在线业务,但国际生态较弱。 Kafka:超高吞吐(异步设计)、大数据生态兼容性好,但同步响应延迟较高,适合日志处理等离线场景。 选择建议:优先考虑开源、流行度及核心功能(可靠性、集群、性能),根原创 2025-06-19 22:54:57 · 581 阅读 · 0 评论 -
【基础篇-消息队列】——为什么需要消息队列
本文探讨了消息队列的核心作用与应用场景。文章重点分析了消息队列的三大典型应用:1)异步处理,以秒杀系统为例说明如何提升响应速度;2)流量控制,介绍令牌桶等削峰填谷方法保护系统;3)服务解耦,通过订单系统案例说明如何降低模块间耦合度。同时也指出消息队列可能带来的延迟增加、系统复杂度提升等问题。文章强调架构设计需要权衡利弊,根据业务特点选择合适方案。原创 2025-06-18 22:46:07 · 789 阅读 · 0 评论 -
【消息队列】——消息存储读写性能的优化方法
因为我们给每个文件设置了一个写缓存,每次写入不需要 IO 等待,所需的时间只是两次内存拷贝的时间,所以即使是单线程写入,仍然可以做到非常高的 QPS。因为 WAL 的不可变性,对缓存页的并发读操作,即使不加锁也是安全的。借助于这个缓存并结合 WAL 的特性,JoyQueue 实现了近乎无锁的纯内存读写,将读写的时间开销降至最低,这也是高性能读写的关键因素之一。用个形象的比喻就是,对于一个桌数固定的饭店来说,每桌客人用餐的时间越短,翻台率也就越高,饭店单位时间内能接待的客人就越多。原创 2025-06-16 23:38:28 · 1115 阅读 · 0 评论 -
【消息队列】——消息队列的高可用与容灾设计
高可用是指系统抵御小规模故障的能力。容灾是指系统抵御 AZ 或城市级大规模故障的能力。RTO 和 RPO 可以做到秒级。如果系统规模较大,RTO 和 RPO 通常只能分钟级。原创 2025-06-14 23:08:51 · 1116 阅读 · 0 评论 -
【消息队列】——如何使用Actor模型解决并发问题
摘要 本文探讨了Actor模型在多线程并发编程中的优势与应用。文章首先分析了传统共享内存模型面临的挑战,包括线程安全、竞争条件以及同步机制带来的死锁等问题。随后详细介绍了Actor模型的核心思想:每个Actor独立维护状态和消息队列,通过消息传递实现通信,从而避免共享内存带来的并发问题。通过餐厅点餐的生动案例,展示了Actor模型如何简化并发程序设计。文章还讨论了Actor模型的优势(简单可靠、高性能、易扩展)和局限性(设计复杂度高、高并发场景限制、分布式事务处理困难),并比较了不同语言对Actor模型的支原创 2025-06-12 23:08:09 · 701 阅读 · 0 评论 -
【消息队列】——如何实现消息保序
消息保序常见场景及实现方法 电商、金融、数据库同步等业务场景中常需要消息保序,确保事件按发生顺序处理。实现方法包括: 全局保序:通过单分区/单队列+单线程消费实现,但吞吐量受限 局部保序:将关联消息(如同订单号)路由到同一分区处理,兼顾顺序性与并发性 常见问题应对策略: 重复消息:携带递增序号或维护已消费ID集合进行过滤 节点故障:消费者故障可能导致短暂乱序,可通过事后数据修复处理 关键点在于根据业务需求选择合适的保序粒度,平衡顺序性与系统吞吐量。原创 2025-06-12 23:04:35 · 802 阅读 · 0 评论