你爲什麼要用 Kafka,而不用 Pulsar?

Pulsar 是一款分佈式發佈 / 訂閱消息平臺,近兩年非常火,被稱爲下一代的消息流平臺,大有取代 Kafka 的勢頭。今天我們就來比較一下 Pulsar 跟 Kafka。

圖片來自 Pexels

Pulsar 源自 Yahoo,於 2016 年開源並捐獻給 Apache 基金會,並在 2018 年 9 月升級成爲 Apache 頂級項目。

Kafka 最初由 Linkedin 開發,並於 2010 年貢獻給了 Apache 基金會,之後成爲 Apache 頂級項目。

01

** 架構**

①Kafka

Kafka 架構由 Broker 和 Zookeeper 組成,如下圖:

注意:Kafka 2.8 版本可以不依賴 Zookeeper 獨立運行了。

②Pulsar

Pulsar 的架構如下:

Pulsar Broker 會在本地緩存消息,並且支持 TTL。

從上面的兩個架構圖我們看到,Kafka 和 Pulsar 有三點不同:

02

** 消息存儲模型**

①Kafka

Kafka 採用分區(Partition)的方式來保存 topic,模型圖如下:

每個 topic 都會在不同的 broker 保存多個分區副本,其中只有一個副本的分區是 leader 分區,供消費者使用。

如果某個 broker 宕機了,這個 broker 上的 leader 分區失效,需要在其他 broker 上重新進行選舉。

②Pulsar

跟 Kafka 不同的是,Pulsar 的消息存儲模型採用了分層的方式,如下圖:

第一層是 Topic,用來存儲 Producer 追加的 messages,Topic 下面是 ledger 層,保存了分片(Segment),分片裏面保存更小粒度的 ertries,entries 存儲一條條的 Message。

Bookkeeper 中,數據的最小操作單位是 Segment。Ledger 中的最後一個分片是最新寫入的分片,如上圖 Segment-2。

Segment-2 之前的所有分片已完成封裝,這些分片的數據是不會再發生變化的。

這樣增加或刪除一個 BookKeeper 節點,或者遷移長期存儲節點,都不會發生一致性問題。

03

** 消息消費模型**

①Kafka

Kafka 的消費模型是採用消費者組的模式,每一個分區只能給消費者組中的一個消費者消費。如下圖:

②Pulsar

Pulsar 的消費模型如下圖:

Pulsar 的 topic 是一種 partitioned topic,可以被保存到多個 broker,提高了 topic 的吞吐量。

Consumer 通過 Subscription 獲取消息,同一 Topic 的 Subscription 可以獲取到 Topic 數據的完整拷貝,這樣 Subscription 爲每一個 Consumer 分配一個 Cursor,Consumer 之間互不影響。

如下圖:

Pulsar 的消費模型有四種:

**獨佔模式(Exclusive):**同一個 topic 只能有一個消費者訂閱,如果多個消費者訂閱,就會出錯。

**災備模式(Failover):**同一個 topic 可以有多個消費者訂閱,但是隻能有一個消費者消費,其他訂閱的消費者作爲故障轉移的消費者,只有當前消費者出了故障纔可以進行消費當前的 topic。

如下圖:

**共享訂閱(Shared):**同一個 topic 可以由多個消費者訂閱和消費。消息通過 round robin 輪詢機制分發給不同的消費者,並且每個消息僅會被分發給一個消費者。

當消費者斷開,發送給它的沒有被消費的消息還會被重新分發給其它存活的消費者。

如下圖:

**Key_Shared:**消息和消費者都會綁定一個 key,消息只會發送給綁定同一個 key 的消費者。如果有新消費者建立連接或者有消費者斷開連接,就需要更新一些消息的 key。

如下圖:

04

** 多租戶**

①Pulsar

Pulsar 是一個多租戶系統,租戶可以跨集羣分佈,每個租戶都可以有單獨的認證和授權機制。租戶也是存儲配額、消息 TTL 和隔離策略的管理單元。

Pulsar 中 topic 的 URL 如下,可以看到租戶是最基本的管理單位:

persistent://tenant/namespace/topic

上面的 URL 可以看到,Pulsar 通過 tenant 和 namespace 來支持多租戶。

namespace 是一個術語,指租戶的管理單元。同一個 namespace 上設置的配置策略適用於在 namespace 中創建的所有 topic。

Pulsar 爲實例中的每個租戶分配:

②Kafka

Kafka 爲了控制客戶端對 broker 資源的限制,從 0.9 版本引入了配額(quotas)管理,強制客戶端請求使用配額。

目前 Kafka 支持兩種類型的配額:

生產者和消費者有可能以很高的速率生產和消費大量的請求,從而壟斷 broker 資源,導致網絡飽和,最終影響到其他客戶端和 broker 本身。使用配額可以防止這些問題,讓集羣體驗更好。

05

** 運維**

①集羣部署

Kafka 去除 Zookeeper 以後,部署是非常簡單的。而 Pulsar 目前還沒有去除 Zookeeper 的詳細計劃,而且需要使用到 BookKeeper 集羣,部署複雜不少。

②擴容

Pulsar 支持自動負載均衡,這對於增加 broker 節點和增加存儲節點都非常方便。

③雲原生支持

Pulsar 計算和存儲節點分離,對雲原生支持很好。Kafka 多數組件也支持雲原生。

④替換 broker

Pulsar 的 broker 節點是無狀態的,替換時不用考慮數據丟失。

06

** 社區**

Pulsar 社區發展非常迅速,StreamNative 還推出了 StreamNative Hub 來支持 Pulsar 社區建設。

但 Pulsar 畢竟是一個新型的消息中間件,文檔和社區都不太完善。在過去的一年多時間裏,Pulsar 在這方面做了很多的努力,包括舉辦全球峯會,創作視頻和培訓教程,邀請專業講師進行培訓。

使用 Pulsar 時,遇到的一些問題可能在網上找不到答案,需要查找源代碼來解決。這對於中小公司來說,無疑增加了使用成本。

而 Kafka 作爲非常成熟中間件,用戶遇到的問題也非常多,新用戶可以很方便地從網上找到答案。

07

** 總結**

Pulsar 作爲新型的雲原生分佈式消息流平臺,確實有很多優秀的設計理念。

在 Yahoo 內部支持應用服務平臺中 140 萬個 topic,日處理消息超過 1000 億條。騰訊的分佈式交易引擎 TDXA 也使用了 Pulsar,應用於騰訊的計費平臺。

Kafka 目前的使用場景最多的還是日誌大數據處理,對金融場景的應用比較少。

但這並不能說明 Pulsar 可以取代 Kafka,Kafka 用戶羣體龐大,社區和資源完善,而且在 2.8 版本中去除了 Zookeeper,部署非常容易。畢竟不是每家公司都需要 Yahoo 和騰訊這樣的集羣體量。

參考資料:

作者:jinjunzhu

編輯:陶家龍

出處:轉載自公衆號程序員 jinjunzhu

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/XUNfcDRa9ff3sIl68HzLjg