Apache Pulsar是Apache软件基金会的顶级项目,被誉为下一代云原生分布式消息流平台,它集消息、存储、轻量化函数式计算为一体,采用计算与存储分离的架构设计,支持多租户、持久化存储、跨区域复制,具有强一致性、高吞吐、低延迟及高可扩展性等流数据存储特性。
一、Pulsar的核心组件
组件 | 描述 |
Broker | 无状态组件,负责处理producer和consumer的请求,消息的复制与分发,以及数据的计算。 |
ZooKeeper | 存储元数据、集群配置,协调任务(例如哪个broker负责哪个topic),服务的发现(例如broker发现bookie的地址)。 |
Bookie | 用于数据的持久化存储,除了消息数据,cursors也会被持久化到Bookie,每一个存储节点叫做一个bookie。 |
Producer & Consumer | 生产者发送数据给Pulsar,将消息以append的形式追加到topic中;消费者订阅topic并接收消息。 |
二、Pulsar的关键特性
特性 | 描述 |
多租户 | 支持多租户,每个租户有独立的命名空间和策略。 |
灵活的消息系统 | 统一了队列模型和流模型,同一份数据可多次消费。 |
云原生架构 | 计算与存储分离,支持独立扩展和快速恢复。 |
跨地域复制 | 支持跨不同地理位置的数据中心复制数据,提高可用性。 |
Pulsar Functions | 基于Pulsar的轻量级流处理方式,可直接在broker节点上或作为Kubernetes集群中的容器部署。 |
三、Pulsar的订阅模式
模式 | 描述 |
Exclusive | 一个subscription只允许被一个consumer用于订阅topic,如果多个consumer使用相同的subscription去订阅同一个topic,则会发生错误。 |
Failover | 多个consumer允许使用同一个subscription去订阅topic,但只有一个consumer作为主consumer,其他作为故障转移consumer,当主consumer失去连接时,topic将被重新分配给其中一个故障转移consumer。 |
Shared | 多个consumer可以使用同一个subscription去订阅topic,消息以轮询的方式分发给consumer。 |
Key_Shared | key_shared是Pulsar 2.4.0以后一个新的订阅模式,多个consumer可以使用同一个subscription去订阅topic,消息按照key分发给consumer,含有相同key的消息只被发送给同一个consumer。 |
四、Pulsar的存储模型
概念 | 描述 |
Topic(分区) | 逻辑上的概念,是消息的集合,所有生产者的消息都会归属到指定的topic里。 |
Partition(分区) | topic进一步分成多个分片(segment),segment是Pulsar中真正的物理单元。 |
Segment(分片) | 数据持久化在Bookie中,segment对应的就是Bookie中的ledger。 |
Entry | 存储到BookKeeper中的一条记录。 |
Ledger | 用来存储entry,多个entry序列组成一个ledger。 |
Journal文件 | 包含BookKeeper中的消息写入日志。 |
Entry log文件 | 管理BookKeeper客户端写入的entry,来自不同ledger的entry会被依次写入一个或多个entry log中。 |
Index file | ledger的索引文件,记录每个ledger在entry log文件中的存储位置以及数据在entry log文件中的长度。 |
Ledger cache | 用于缓存索引文件,加快查找效率。 |
五、Pulsar的数据落盘与压缩
数据落盘:内存中会存储一个LastLogMark,其中包含txnLogId(journal文件的id)和txnLogPos(journal文件中的位置),entry log文件和index文件都会先在内存中被缓存,当内存达到一定值或者离上一次刷盘过期了一段时间后,会触发entry log文件和index文件的刷盘,之后再将LastLogMark持久化,如果在持久化前发生宕机,可以通过journal文件进行恢复,保证了数据不丢失。
数据压缩:Pulsar支持对Producer发送的消息进行压缩,以提高传输效率和节省存储空间,支持的压缩类型包括LZ4、ZLIB、ZSTD和SNAPPY。
六、Pulsar的Functions与IO连接器
Pulsar Functions:Pulsar Functions是基于Pulsar的轻量级流处理方式,可以直接在broker节点上或作为Kubernetes集群中的容器部署,通过Pulsar Functions,Pulsar可以直接解决许多流处理任务,简化操作。
Pulsar IO连接器:Pulsar提供了多种类型的连接器,如Pulsar Adapters和Pulsar Connectors,以及Pulsar SQL(Pulsar Presto Connector),使得数据更容易移入、移出Apache Pulsar。
七、Pulsar的生态与社区
Pulsar拥有活跃的社区和丰富的生态项目,包括各种语言的客户端(如Java、C++、.Net/C#、Go、NodeJS、Ruby等)、管理工具(如Pulsar Manager)等,截至某时间点,Pulsar在Github上的star数量已超过10K+,共有470+个contributor,并且正在持续更新。
八、FAQs
Q1: Pulsar与传统的消息队列系统(如Kafka)相比有哪些优势?
A1: Pulsar与传统的消息队列系统相比,具有以下优势:支持多租户、灵活的消息系统(统一了队列模型和流模型)、云原生架构(计算与存储分离)、跨地域复制、极低的发布延迟和端到端延迟、简单的客户端API(支持多种语言)、分层存储等。
Q2: Pulsar如何保证消息的可靠性和顺序性?
A2: Pulsar通过Apache BookKeeper提供的持久化消息存储机制来保证消息的可靠性,对于顺序性,Pulsar在独占和灾备订阅模式下能够保证消息的顺序性,在共享订阅模式下,虽然消息不能保证有序,但可以通过设置合适的消息key来实现一定程度的顺序性,Pulsar还支持数据的落盘和压缩功能,以确保在系统故障时数据不会丢失。
小伙伴们,上文介绍了“pulsar”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1348482.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复