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 |
順序消息 | ||
事務消息 | ||
二級消息 | ||
定時消息 |
總結
主要是簡單的介紹了Pulsar的概念和架構,最重要的是去了解“存儲和服務”分離的兩層架構。之後和Rocket進行了對比,RocketMQ提供了更多消息領域的能力比比如事務消息、定時消息等等,而Pulsar在Streaming友善做的更好一些。
如果本文對您有幫助,點一下右下角的“推薦”