1. 程式人生 > >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
順序訊息 支援 支援
事務訊息 支援
二級訊息 支援
定時訊息 支援

總結

主要是簡單的介紹了Pulsar的概念和架構,最重要的是去理解“儲存和服務”分離的兩層架構。之後和Rocket進行了對比,RocketMQ提供了更多訊息領域的能力比比如事務訊息、定時訊息等等,而Pulsar在Streaming方便做的更好一些。


丞一

丞一

中介軟體技術專家 at 螞蟻金服丞一,目前就職於螞蟻金服,熱衷於研究分散式系統相關的技術;微信公眾號:MessageQueue,歡迎交流;