📖摘要
今天分享下 ——
Apache Pulsar
之什么是Apache Pulsar
?欢迎关注!耐心看完哦
🌂官方文档查看
😊Apache Pulsar?
What is Pulsar
“Pulsar is a distributed pub-sub messaging platform with a very flexible messaging model and an intuitive client API.”
Pulsar
是pub-sub
模式的分布式消息平台,拥有灵活的消息模型和直观的客户端API
。
Pulsar
由雅虎开发并开源的下一代消息系统,目前是Apache软件基金会的孵化器项目。
💕概念(Topic)
Topic
是Pulsar
的核心概念,表示一个“channel”,Producer可以写入数据,Consumer
从中消费数据(Kafka、RocketMQ
都是这样)。
Topic
名称的 URL
类似如下的结构:
{persistent|non-persistent}://tenant/namespace/topic
persistent|non-persistent
表示数据是否持久化(Pulsar
支持消息持久化和非持久化两种模式)Tenant
为租户Namespace
一般聚合一系列相关的Topic
,一个租户下可以有多个Namespace
租户和 Namespace
上图中
Property
即为租户,每个租户下可以有多个Namespace
,每个Namespace
下有多个Topic
。
Namespace
是Pulsar
中的操作单元,包括Topic
是配置在Namespace
级别的,包括多地域复制,消息过期策略等都是配置在Namespace
上的。
订阅模型
Pulsar
提供了灵活的消息模型,支持三种订阅类型:
Exclusive subscription
:排他的,只能有一个Consumer
,接收一个Topic
所有的消息Shared subscription
:共享的,可以同时存在多个Consumer
,每个Consumer
处理Topic
中一部消息(Shared
模型是不保证消息顺序的,Consumer
数量可以超过分区的数量)Failover subscription
:Failover模式
,同一时刻只有一个有效的Consumer
,其余的Consumer
作为备用节点,在Master Consumer
不可用后进行替代(看起来适用于数据量小,且解决单点故障的场景)
分区
为了解决吞吐等问题,
Pulsar
和Kafka
一样,采用了分区(Partition
)的机制。
Pulsar
提供了一些策略来处理消息到 Partition
的路由(MessageRouter
):
Single partitioning
:Producer
随机选择一个Partition
并将所有消息写入到这个分区Round robin partitioning
:采用Round robin
的方式,轮训所有分区进行消息写入Hash partitioning
:这种模式每条消息有一个Key
,Producer
根据消息的Key
的哈希值进行分区的选择(Key
相同的消息可以保证顺序)。Custom partitioning
:用户自定义路由策略
不同于别的MQ
系统,Pulsar
允许Consumer
的数量超过分区的数量(对于RocketMQ
,超过分区数的Consumer
会分配不到分区而“空跑”)。
在
Shared subscription
的订阅模式下,Consumer
数量可以大于分区的数量,每个Consumer
处理每个Partition
中的一部分消息,不保证消息的顺序。
持久化
Pulsar
通过BookKeeper
来存储消息,保证消息不会丢失(BookKeeper:A scalable, fault-tolerant, and low-latency storage service optimized for real-time workloads
)。
架构
Pulsar
采用“存储和服务分离”的两层架构(这是 Pulsar
区别于其他 MQ
系统最重要的一点,也是所谓的“下一代消息系统”的核心):
Broker
:提供发布和订阅的服务(Pulsar
的组件)Bookie
:提供存储能力(BookKeeper
的存储组件)
优势是
Broker
成为了stateless
的组件,可以水平扩容(RocketMQ
的Broker
是包含存储的,是有状态的,Broker
的扩容更像是“拆分”)。高可靠,一致性等通过BookKeeper
去保证。
上图是
Pulsar Cluster
的架构:
- 采用
ZooKeeper
存储元数据,集群配置,作为coordination
local zk
负责Pulsar Cluster
内部的配置等global zk
则用于Pulsar Cluster
之间的数据复制等
- 采用
Bookie
作为存储设备(大多数MQ
系统都采用本地磁盘或者DB作为存储设备) Broker
负责负载均衡和消息的读取、写入等Global replicators
负责集群间的数据复制
GEO-REPLICATOIN
多个 Broker
节点组成一个 Pulsar Cluster
;多个 Pulsar Cluster
组成一个 Pulsar Instance
。
Pulsar
通过 GEO-REPLICATION
支持一个 Instance
内在不同的地域发送和消费消息。
上图中,
Producer P1、P2、P3
在不同的Cluster
发送给Topic T1
的消息,会在Cluster
之间进行复制,Consumer C1、C2
可以在自己所在的Cluster
消费到所有的消息。
当消息被写入
Pulsar
时,首先消息被持久化在local cluster
,之后异步的发送到其他cluster
。在没有链接问题的情况下,通常复制的latency
相近于网络的RTT
。
💖Pulsar的应用
- 作为普通的
Pub-Sub
模型的消息队列使用,类似于RocketMQ
- 支持
Function(Stream)
,整合到Stream
平台
👌Pulsar VS RocketMQ
对比 | RocketMQ | Pulsar |
---|---|---|
架构 | 单层架构,Broker服务也负责存储 | 存储和服务分离,Broker负责提供服务,BookKeeper提供存储能力 |
存储 | Master-Slave结构 | BookKeeper,高可用存储 |
多域部署 | 无 | GEO-REPLICATION |
订阅模式 | 集群消费、广播消费 | Exclusive、Shared、Failover三种模式 |
Stream | 不支持 | 支持 |
ACK | cumulative ack | individual & cumulative ack |
顺序消息 | 支持 | 支持 |
事务消息 | 支持 | 无 |
二级消息 | 支持 | 无 |
定时消息 | 支持 | 无 |
🐱🏍在生产环境的应用
- 是全球部署,在10+数据中心,完全网格复制能力
- 每天处理超过1000亿条已发布的消息
- 提供超过140万个主题
- 在整个服务中提供少于5毫秒的平均发布延迟
✨总结
主要是简单的介绍了
Pulsar
的概念和架构,最重要的是去理解“存储和服务”分离的两层架构。之后和Rocket
进行了对比,RocketMQ
提供了更多消息领域的能力比比如事务消息、定时消息等等,而Pulsar
在Streaming
方面做的更好一些。
最后感谢大家耐心观看完毕,留个点赞收藏是您对我最大的鼓励!
🎉最后
-
更多参考精彩博文请看这里:《陈永佳的博客》
-
喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!