首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 为什么需要消息队列?
02 | 该如何选择消息队列?
03 | 消息模型:主题和队列有什么区别?
04 | 如何利用事务消息实现分布式事务?
05 | 如何确保消息不会丢失?
06 | 如何处理消费过程中的重复消息?
07 | 消息积压了该如何处理?
08 | 答疑解惑(一) : 网关如何接收服务端的秒杀结果?
09 | 学习开源代码该如何入手?
10 | 如何使用异步设计提升系统性能?
11 | 如何实现高性能的异步网络传输?
12 | 序列化与反序列化:如何通过网络传输结构化的数据?
13 | 传输协议:应用程序之间对话的语言
14 | 内存管理:如何避免内存溢出和频繁的垃圾回收?
15 | Kafka如何实现高性能IO?
16 | 缓存策略:如何使用缓存来减少磁盘IO?
17 | 如何正确使用锁保护共享数据,协调异步线程?
18 | 如何用硬件同步原语(CAS)替代锁?
19 | 数据压缩:时间换空间的游戏
20 | RocketMQ Producer源码分析:消息生产的实现过程
21 | Kafka Consumer源码分析:消息消费的实现过程
22 | Kafka和RocketMQ的消息复制实现的差异点在哪?
23 | RocketMQ客户端如何在集群中找到正确的节点?
24 | Kafka的协调服务ZooKeeper:实现分布式系统的“瑞士军刀”
25 | RocketMQ与Kafka中如何实现事务?
26 | MQTT协议:如何支持海量的在线IoT设备?
27 | Pulsar的存储计算分离设计:全新的消息队列设计思路
28 | 答疑解惑(二):我的100元哪儿去了?
29 | 流计算与消息(一):通过Flink理解流计算的原理
30 | 流计算与消息(二):在流计算中使用Kafka链接计算任务
31 | 动手实现一个简单的RPC框架(一):原理和程序的结构
32 | 动手实现一个简单的RPC框架(二):通信与序列化
33 | 动手实现一个简单的RPC框架(三):客户端
34 | 动手实现一个简单的RPC框架(四):服务端
35 | 答疑解惑(三):主流消息队列都是如何存储消息的?
当前位置:
首页>>
技术小册>>
消息队列入门与进阶
小册名称:消息队列入门与进阶
### 27 | Pulsar的存储计算分离设计:全新的消息队列设计思路 在消息队列(Message Queue)的广阔领域中,Apache Pulsar以其独特的存储计算分离(Storage and Compute Separation)设计理念脱颖而出,为现代分布式系统架构带来了全新的视角与解决方案。本章将深入剖析Pulsar的这一核心特性,探讨其设计动机、实现机制、优势及应用场景,帮助读者理解并掌握这一引领未来的消息队列技术。 #### 一、引言:传统消息队列的局限 在深入探讨Pulsar的存储计算分离设计之前,有必要先回顾一下传统消息队列系统面临的挑战。传统消息队列,如RabbitMQ、Kafka等,虽然各自在性能、可靠性、易用性等方面有着显著优势,但大多采用存储与计算紧耦合的设计模式。这种模式下,消息数据的存储与处理逻辑紧密集成在同一组件中,随着业务规模的扩大,逐渐暴露出以下主要问题: 1. **扩展性受限**:存储与计算资源的扩展往往需要同步进行,难以根据实际需求灵活调整,导致资源浪费或瓶颈。 2. **高可用性复杂**:在紧耦合系统中,单点故障可能同时影响存储与计算能力,增加了系统高可用性的实现难度。 3. **运维成本增加**:紧耦合架构使得系统的升级、维护更加复杂,对运维人员的技术要求也更高。 #### 二、Pulsar的存储计算分离设计概述 Apache Pulsar,作为Apache软件基金会下的一个顶级项目,自诞生之初就旨在解决传统消息队列的上述痛点。其核心设计理念之一便是存储计算分离,即将消息数据的存储与消息处理逻辑(如消息的发布、订阅、消费等)分别由独立的组件负责。这种设计带来了以下关键优势: 1. **灵活的扩展性**:存储与计算资源可以独立扩展,根据实际需求灵活调整,实现资源的最优利用。 2. **增强的可用性**:存储与计算层的独立,降低了单点故障对整体系统的影响,提高了系统的可用性和容错能力。 3. **简化运维**:分离的设计使得存储与计算层的运维可以独立进行,降低了系统整体的运维复杂度。 #### 三、Pulsar存储计算分离的实现机制 ##### 1. 架构概览 Pulsar的架构主要包括以下几个核心组件: - **Broker**:负责处理消息的发布、订阅、消费等逻辑,是计算层的核心。Broker与客户端(生产者、消费者)交互,提供消息队列的核心功能。 - **BookKeeper**:作为Pulsar的存储层,负责持久化消息数据。BookKeeper是一个高可用的分布式日志存储系统,为Pulsar提供了可靠的数据存储保障。 - **ZooKeeper**:用于存储系统的元数据信息,如Broker和BookKeeper集群的配置信息、主题(Topic)和分区(Partition)的映射关系等,确保系统的协调一致性。 ##### 2. 消息存储与访问 在Pulsar中,消息被存储在BookKeeper的分布式日志中。每个主题(Topic)被划分为多个分区(Partition),每个分区对应BookKeeper中的一个或多个日志段(Ledger)。生产者将消息发送到Broker,Broker再将消息写入到对应的BookKeeper Ledger中。消费者则通过Broker从Ledger中读取消息。 为了实现高效的读写操作,Pulsar采用了分层索引(Tiered Storage)机制。新写入的消息首先存储在内存或SSD等高性能存储介质上,以提高读写速度。随着时间的推移,这些消息会被迁移到HDD等成本较低的存储介质上,以节省成本。同时,Pulsar还提供了灵活的索引策略,如稀疏索引(Sparse Indexing),以支持快速的消息检索。 ##### 3. 负载均衡与故障恢复 Pulsar通过ZooKeeper实现Broker与BookKeeper之间的负载均衡和故障恢复。Broker会定期向ZooKeeper报告自己的状态信息,ZooKeeper则根据这些信息以及集群的配置,动态调整Broker与BookKeeper之间的映射关系,确保系统的高可用性和负载均衡。 在故障发生时,如某个Broker或BookKeeper节点失效,ZooKeeper会及时感知并触发相应的故障恢复流程。对于Broker层,系统会根据需要自动将失效Broker上的负载迁移到其他正常运行的Broker上;对于BookKeeper层,则通过BookKeeper自身的容错机制(如副本复制、自动选举新Leader等)来确保数据的可用性和一致性。 #### 四、Pulsar存储计算分离设计的优势 ##### 1. 更高的扩展性与灵活性 存储计算分离的设计使得Pulsar能够根据业务需求灵活调整存储与计算资源。当业务量增长时,可以独立增加Broker或BookKeeper节点的数量,以满足性能需求;当业务量减少时,则可以相应地减少资源投入,以降低成本。 ##### 2. 更强的可用性与容错性 由于存储与计算层的独立,Pulsar能够更好地应对单点故障。即使某个Broker或BookKeeper节点失效,也不会对整个系统造成致命影响。同时,BookKeeper的高可用性设计(如副本复制)也为数据的可靠性提供了有力保障。 ##### 3. 更低的运维成本 存储计算分离的设计简化了Pulsar的运维工作。运维人员可以分别针对存储层(BookKeeper)和计算层(Broker)进行独立的监控、升级和维护操作,降低了运维复杂度。此外,由于系统架构的清晰和模块化设计,也使得运维人员更容易理解和掌握系统的工作原理。 #### 五、应用场景与案例分析 Pulsar的存储计算分离设计使其适用于多种复杂场景,包括但不限于: - **实时数据流处理**:在实时数据流处理场景中,Pulsar能够提供高吞吐量的消息发布与订阅能力,同时保证数据的可靠性与一致性。其分层索引机制还支持对历史数据的快速检索与分析。 - **微服务架构中的消息通信**:在微服务架构中,Pulsar可以作为微服务之间的消息中间件,实现服务间的解耦与异步通信。存储计算分离的设计使得Pulsar能够轻松应对微服务架构下的高并发与分布式挑战。 - **物联网(IoT)应用**:在物联网应用中,Pulsar可以处理来自海量设备的数据流,支持数据的实时采集、处理与分发。其高可扩展性和高可用性特点使得Pulsar成为物联网领域中的理想选择。 #### 六、总结与展望 Apache Pulsar以其独特的存储计算分离设计理念,为现代分布式系统架构带来了全新的解决方案。通过灵活的扩展性、增强的可用性、简化的运维等优势,Pulsar正逐步成为消息队列领域的佼佼者。未来,随着技术的不断发展和应用场景的不断拓展,我们有理由相信Pulsar将在更多领域发挥重要作用,为企业的数字化转型提供强有力的支撑。 在本书的后续章节中,我们将继续探讨Pulsar的其他核心特性与高级应用技巧,帮助读者全面掌握这一领先的消息队列技术。
上一篇:
26 | MQTT协议:如何支持海量的在线IoT设备?
下一篇:
28 | 答疑解惑(二):我的100元哪儿去了?
该分类下的相关小册推荐:
Kafka核心技术与实战
Kafka面试指南
Kafka 原理与源码精讲
kafka入门到实战