你爲什麼要用 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 有三點不同:
-
Pulsar 採用分層架構,將計算和存儲相分離,存儲使用 BookKeeper 集羣,計算使用 Broker 集羣,Broker 需要內置 BookKeeper 客戶端。
-
Pulsar 的部署和架構更加複雜,但是也更具有伸縮性。
-
Pulsar 在最新版本中依然不能脫離 Zookeeper 獨立運行。
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 支持兩種類型的配額:
-
網絡帶寬配額,用來定義 byte-rate 閾值(從 0.9 版本開始)
-
請求速率配額,將 CPU 利用率閾值定義爲網絡和 I/O 線程的百分比(從 0.11 開始)
生產者和消費者有可能以很高的速率生產和消費大量的請求,從而壟斷 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 和騰訊這樣的集羣體量。
參考資料:
-
quotas:http://kafka.apache.org/documentation/#design_quotas
-
pulsar:http://pulsar.apache.org/docs/zh-CN/next/concepts-messaging/
-
segmentfault:https://segmentfault.com/a/1190000023605433
-
_StreamNative:https://www.cnblogs.com/StreamNative/p/14624039.html
_ -
騰訊計費平臺:https://cloud.tencent.com/developer/article/1492260
作者:jinjunzhu
編輯:陶家龍
出處:轉載自公衆號程序員 jinjunzhu
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/XUNfcDRa9ff3sIl68HzLjg