"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
租戶和Namespace
上圖中Property即爲租戶,每個租戶下可以有多個Namespace,每個Namespace下有多個Topic。
Namespace是Pulsar中的操作單元,包括Topic是配置在Namespace級別的,包括多地域複製,消息過期策略等都是配置在Namespace上的。
訂閱模型
Pulsar提供了靈活的消息模型,支持三種訂閱類型:
分區
爲了解決吞吐等問題,Pulsar和Kafka一樣,採用了分區(Partition)的機制。
Pulsar提供了一些策略來處理消息到Partition的路由(MessageRouter):
不同於別的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成爲了stateless的組件,可以水平擴容(RocketMQ的Broker是包含存儲的,是有狀態的,Broker的擴容更像是「拆分」)。高可靠,一致性等通過BookKeeper去保證。
上圖是Pulsar Cluster的架構:
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。
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方便做的更好一些。