架構師的選擇,Pulsar還是Kafka?

2021-01-13 JAVA高級架構
介紹

最近,我一直在研究Pulsar及其與Kafka的比較。快速搜索將顯示兩個最著名的開源消息傳遞系統之間存在當前的"戰爭"。

作為Kafka的用戶,我確實對Kafka的某些問題感到困惑,並且我對Pulsar感到非常失望。所以最後,我設法花了一些時間進行研究,並且做了很多研究。在本文中,我將重點介紹Pulsar的優勢,並為您提供一些理由,使您對比Kafka來考慮它。但是,請在產品使用,支持,社區,文檔等方面明確一點;Kafka顯然超過了Pulsar,並且只有在本文中討論的大多數優點都適合您的用例的情況下,才考慮使用Pulsar。讓我們開始!

Kafka基礎知識

Kafka是消息傳遞系統之王。它由LinkedIn於2011年創建,並在Confluent的支持下得到了廣泛的傳播。Confluent已向開源社區發布了許多新功能和附加組件,例如用於模式演化的Schema Registry,用於從其他數據源輕鬆流式傳輸的Kafka Connect等。資料庫到Kafka,Kafka Streams進行分布式流處理,最近使用KSQL對Kafka主題執行類似SQL的查詢等等。它還具有用於許多系統的許多連接器,有關更多詳細信息,請查看Confluent Platform。

Kafka快速,易於安裝,非常受歡迎,可用於廣泛的範圍或用例。從開發人員的角度來看,儘管Apache Kafka一直很友好,但在操作上卻是一團糟。因此,讓我們回顧一下Kafka的一些痛點。

> Kafka example. Source: https://talks.rmoff.net/pZC6Za/slides

Kafka的問題

· 擴展Kafka十分棘手,這是由於代理還存儲數據的耦合體系結構所致。剝離另一個代理意味著它必須複製主題分區和副本,這非常耗時。

· 沒有與租戶完全隔離的本地多租戶。

· 存儲可能會變得非常昂貴,儘管可以長時間存儲數據,但是由於成本問題,很少使用它。

· 萬一副本不同步,有可能丟失消息。

· 必須提前計劃和計算代理,主題,分區和副本的數量(以適應計劃的未來使用量增長),以避免擴展問題,這非常困難。

· 如果僅需要消息傳遞系統,則使用偏移量可能會很複雜。

· 集群重新平衡會影響相連的生產者和消費者的性能。

· MirrorMaker Geo複製機制存在問題。像Uber這樣的公司已經創建了自己的解決方案來克服這些問題。

如您所見,大多數問題與操作方面有關。儘管安裝起來相對容易,但Kafka難以管理和調整。而且,它還沒有像它可能的那樣靈活和有彈性。

Pulsar基礎知識

Pulsar由Yahoo在2013年創建,並於2016年捐贈給Apache基金會。Pulsar現在是Apache的頂級項目。Yahoo,Verizon,Twitter等公司在生產中使用它來處理數百萬條消息。它具有許多功能,並且非常靈活。它聲稱比Kafka更快,因此運行成本更低。它旨在解決Kafka的大部分難題,使其更易於擴展。

Pulsar非常靈活;它可以像Kafka這樣的分布式日誌,也可以像RabbitMQ這樣的純消息傳遞系統。它具有多種類型的訂閱,幾種交付保證,保留策略以及幾種處理模式演變的方法。它還有很多功能……

> Pulsar architecture: https://pulsar.apache.org/docs/en/concepts-architecture-overview/

Pulsar的特性

· 由於內置了多租戶,因此不同的團隊可以使用相同的集群並將其隔離。這解決了許多管理難題。它支持隔離,身份驗證,授權和配額。

· 多層體系結構:Pulsar將所有主題數據存儲在由Apache BookKeeper支持的專業數據層中,作為數據分類帳。存儲和消息傳遞的分離解決了擴展,重新平衡和維護集群的許多問題。它還提高了可靠性,幾乎不可能丟失數據。另外,在讀取數據時,可以直接連接到Bookeeper,而不會影響實時攝取。例如,可以使用Presto對主題執行SQL查詢,類似於KSQL,但請放心,這不會影響實時數據處理。

· 虛擬主題。由於採用n層體系結構,因此對主題的數量沒有限制,主題及其存儲是分離的。還可以創建非持久性主題。

· N層存儲。Kafka的一個問題是,存儲可能變得昂貴。因此,它很少用於存儲"冷"數據,並且消息經常被刪除。並且仍然向客戶展示透明視圖;客戶端可以從時間開始讀取,就像所有消息都存在於日誌中一樣。

·Pulsar函數。易於部署,輕量級計算過程,對開發人員友好的API,無需運行自己的流處理引擎(如Kafka)。

· 安全性:它具有內置的代理,多租戶安全性,可插入身份驗證等等。

· 快速重新平衡。分區分為易於重新平衡的段。

· 伺服器端重複數據刪除和無效欄位。無需在客戶端中執行此操作,也可以在壓縮期間執行重複數據刪除。

· 內置架構註冊表。支持多種策略,非常易於使用。

· 地理複製和內置發現。將群集複製到多個區域非常容易。

· 集成的負載均衡器和Prometheus指標。

· 多重集成:Kafka,RabbitMQ等。

· 支持許多程式語言,例如GoLang,Java,Scala,Node,Python…

· 客戶端不需要知道分片和數據分區,這是在伺服器端透明進行的。

> List of features: https://pulsar.apache.org/

如您所見,Pulsar具有許多有趣的功能。

Pulsar 動手

開始使用Pulsar非常容易。確保已安裝JDK!

· 下載Pulsar並解壓縮:

$ wget https://archive.apache.org/dist/pulsar/pulsar-2.6.1/apache-pulsar-2.6.1-bin.tar.gz

2.下載連接器(可選):

$ wget https://archive.apache.org/dist/pulsar/pulsar-2.6.1/connectors/{connector}-2.6.1.nar

3.下載nar文件後,將文件複製到pulsar目錄中的connectors目錄

4.啟動Pulsar!

$ bin/pulsar standalone

Pulsar提供了一個稱為pulsar-client的CLI工具,我們可以使用它與集群進行交互。

產生消息:

$ bin/pulsar-client produce my-topic --messages "hello-pulsar"

閱讀消息:

$ bin/pulsar-client consume my-topic -s "first-subscription"

Akka流示例

作為一個客戶示例,讓我們在Akka上使用Pulsar4s!

首先,我們需要創建一個Source來使用數據流,所需要的只是一個函數,該函數將按需創建使用者並查找消息ID:

val topic = Topic("persistent://standalone/mytopic")
val consumerFn = () => client.consumer(ConsumerConfig(topic, subscription))

然後,我們傳遞consumerFn函數來創建源:

import com.sksamuel.pulsar4s.akka.streams._
val pulsarSource = source(consumerFn, Some(MessageId.earliest))

Akka源的物化值是Control的一個實例,該對象提供了一種"關閉"方法,可用於停止使用消息。現在,我們可以像往常一樣使用Akka Streams處理數據。

要創建一個接收器:

val topic = Topic("persistent://standalone/mytopic")
val producerFn = () => client.producer(ProducerConfig(topic))
import com.sksamuel.pulsar4s.akka.streams._
val pulsarSink = sink(producerFn)

完整示例摘自Pulsar4s:

Pulsar函數示例

Pulsar函數處理來自一個或多個主題的消息,對其進行轉換並將結果輸出到另一個主題:

> Pulsar Functions. Source: https://pulsar.apache.org/docs/en/functions-overview/

可以在兩個接口之間進行選擇以編寫函數:

· 語言本機界面:不需要特定於Pulsar的庫或特殊的依賴項。無法訪問上下文。僅支持Java和Python。

· Pulsar Function SDK:可用於Java / Python / Go,並提供更多功能,包括訪問上下文對象。

使用語言本機接口非常容易,您只需編寫一個簡單的函數即可轉換消息:

def process(input):
return "{}!".format(input)


用Python編寫的這個簡單函數只是向所有傳入的字符串添加一個感嘆號,並將結果字符串發布到主題。

要使用SDK,您需要導入依賴項,例如在Go中,我們將編寫:

package main
import (
"context"
"fmt"
"github.com/apache/pulsar/pulsar-function-go/pf"
)


func HandleRequest(ctx context.Context, in []byte) error {
fmt.Println(string(in) + "!")
return nil
}


func main() {
pf.Start(HandleRequest)
}


要發布無伺服器功能並將其部署到集群,我們使用pulsar-admin CLI,如果使用Python,我們將使用:

$ bin/pulsar-admin functions create \






Pulsar Functions的一個重要功能是您可以在發布該函數時設置交付保證:
$ bin/pulsar-admin functions create \


有以下選擇:


Pulsar的優勢

讓我們回顧一下與Kafka相比的主要優勢:

· 更多功能:Pulsar函數,多租戶,架構註冊表,n層存儲,多種使用模式和持久性模式等。

· 更大的靈活性:3種訂閱類型(獨佔,共享和故障轉移),您可以在一個訂閱上收聽多個主題。持久性選項:非持久(快速),持久,壓縮(每個消息僅最後一個鍵)。可以選擇交付保證,它具有伺服器端重複數據刪除和無效字樣。許多保留政策和TTL。

· 無需提前定義擴展需求。

· 支持排隊和流媒體。因此它可以像RabbitMQ或Kafka。

· 由於存儲與代理分離,因此擴展性更好。重新平衡更快,更可靠。

· 易於操作:得益於去耦和n層存儲。管理員REST API也很棒。

· 與Presto的SQL集成,可直接查詢存儲而不會影響代理。

· 藉助n層自動存儲選項,可以更便宜地存儲。

· 更快:許多基準測試在各種情況下都表現出更好的性能。Pulsar聲稱具有較低的延遲和更好的擴展功能。但是,這正受到Confluent的挑戰,因此,請帶著鹽味做,並自己制定基準。

· Pulsar Functions將無伺服器計算帶到您的消息傳遞平臺。

· 集成架構註冊表支持輕鬆的架構演變

· 集成的負載平衡器和Prometheus指標。

· 地理複製效果更好,更易於設置。Pulsar還內置了發現能力。

· 可以創建的主題數量沒有限制。

· 與Kafka兼容,易於集成。

Pulsar的問題

Pulsar並不完美,Kafka之所以流行是有原因的,它做一件事並且做得很好。Pulsar試圖解決太多領域,但沒有超越任何一個領域。讓我們總結一下Pulsar的一些問題:

· 受歡迎程度:Pulsar不那麼受歡迎。它缺乏支持,文檔和實際使用情況。對於大型組織而言,這是一個主要問題。

· 由於n層體系結構,它需要更多組件:Bookkeeper。

· 在平臺內沒有對流應用程式的適當支持。Pulsar函數與Kafka Streams不同,它們更簡單,並且不用於實時流處理。您無法進行有狀態處理。

· 與Kafka相比,插件和客戶端更少。此外,掌握Pulsar技能的人較少,因此需要在內部學習。

· 它在雲中的支持較少。Confluent具有託管雲產品。

Confluent在Pulsar和Kafka之間進行了比較,可以在其中進行更多的詳細說明。該博客還回答了有關Kafka與Pulsar的一些問題,但請注意,這些問題可能有偏見。

Pulsar使用案例

Pulsar可用於廣泛的用例:

· 發布/訂閱隊列消息傳遞

· 分布式日誌

· 事件源壁架,用於永久性事件存儲

· 微服務

· SQL分析

· 無伺服器功能

什麼時候應該考慮Pulsar

· 需要像RabbitMQ這樣的隊列,也需要像Kafka這樣的流處理程序。

· 需要簡單的地理複製。

· 多租戶是必須具備的,並且想確保每個團隊的訪問權限。

· 需要將所有消息保留很長時間,並且不想將其卸載到另一個存儲中。

· 性能對你至關重要,基準測試表明Pulsar提供了更低的延遲和更高的吞吐量。

· 在本地運行,沒有設置Kafka的經驗,但具有Hadoop經驗。

請注意,如果在雲中,請考慮基於雲的解決方案。雲提供商擁有涵蓋某些用例的不同服務。例如,對於隊列消息傳遞,雲提供商提供了許多服務,例如Google pub / sub。對於分布式日誌,有Confluent雲或AWS Kinesis。雲提供商還提供了非常好的安全性。Pulsar的優勢在於可以在一個平臺上提供許多功能。一些團隊可能將其用作微服務的消息傳遞系統,而另一些團隊則將其用作數據處理的分布式日誌。

結論

我是Kafka的忠實粉絲,這就是為什麼我對Pulsar如此感興趣。競爭是好的,它驅動創新。

Kafka是一種成熟,富有彈性且經過戰鬥考驗的產品,在世界範圍內獲得了巨大成功。沒有它,我無法想像任何公司。但是,我確實看到Kafka成為其自身成功的受害者,巨大的增長減慢了功能開發的速度,因為它們需要支持這麼多大型公司。刪除ZooKeeper依賴項等重要功能花費的時間太長。這為諸如Pulsar等工具蓬勃發展創造了空間。解決Kafka的一些問題並添加更多功能。

但是,Pulsar仍然很不成熟,在投入生產之前,我會格外小心。在將Pulsar納入你的組織之前,進行分析,進行基準測試,研究並編寫概念證明。從小處著手,在從Kafka遷移之前進行概念驗證,並在決定進行完全遷移之前先評估影響。

作者:聞數起舞
連結:https://0x9.me/cYZFN

相關焦點

  • 大白話+13張圖解 Kafka
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言應大部分的小夥伴的要求,在Yarn之前先來一個kafka的小插曲,輕鬆愉快。
  • Kafka這些名詞都說不出所以然,您竟然敢說自己精通kafka
    01kafka架構Kafka 運行在一個由一臺或多臺伺服器組成的集群上,並且分區可以跨集群分布kafka架構Producer: 消息生產者,向 Kafka Broker 發消息的客戶端這個原理與Elasticsearch的架構原理類似,其實ES底層,也是大量基於os cache,實現了海量數據的高性能檢索的。
  • 大牛嘔心力作——Kafka開發實戰,助你徜徉大數據時代
    而這時,kafka的出現算是解決了這個問題。Kafka的核心功能是什麼?一言以蔽之,高性能的消息發送與高性能的消息消費。接下來咱們就進入kafka世界,深入實戰探討kafka實戰開發。kafka實戰本書是涵蓋ApacheKafka各方面的具有實踐指導意義的工具書和參考書。作者結合典型的使用場景,對Katka 整個技術體系進行了較為全面的講解,以便讀者能夠舉一反三,直接應用於實踐。同時,本書還對Kafka的設計原理及其流式處理組件進行了較深人的探討,並給出了詳實的案例。
  • Kafka架構原理,也就這麼回事!
    【51CTO.com原創稿件】本文主要講解 Kafka 是什麼、Kafka 的架構包括工作流程和存儲機制,以及生產者和消費者。Kafka 存儲的消息來自任意多被稱為 Producer 生產者的進程。
  • 「架構師專題」雲原生時代,架構師需具備的十大核心能力(上)
    10 年多的工作歷程,讓我有幸經歷了大範圍的技術演變,特別是雲計算和雲原生技術從朦朧到普及,對工程師和架構師的要求也發生了不少變化。趁著自己入職 11 周年的日子,結合我自己在百度的成長曆程,總結下我認為在雲計算特別是雲原生時代,對軟體架構師的核心能力要求,希望幫助大家在通往架構師的路上少走彎路。
  • 「架構師專題」雲原生時代,架構師需具備的十大核心能力(下)
    10 年多的工作歷程,讓我有幸經歷了大範圍的技術演變,特別是雲計算和雲原生技術從朦朧到普及,對工程師和架構師的要求也發生了不少變化。趁著自己入職 11 周年的日子,結合我自己在百度的成長曆程,總結下我認為在雲計算特別是雲原生時代,對軟體架構師的核心能力要求,希望幫助大家在通往架構師的路上少走彎路。
  • 一文詳解 SparkStreaming 如何整合 Kafka!附代碼可實踐
    常用命令啟動kafka/export/servers/kafka/bin/kafka-server-start.sh -daemon /export/servers/kafka/config/server.properties停止
  • 15 年架構設計經驗:我眼中的那些優秀架構師
    後來,在和他進一步溝通的過程中,我發出了這樣的感慨:一個工程師,如果不能從架構師的角度思考問題,帶領團隊,整體完成一個系統的架構設計與開發,就永遠也不會了解如何做一個架構師。而如果他不去做一個架構師,又永遠沒有機會帶領一個團隊,完成一個系統的架構設計與開發。 這裡似乎形成一個死循環。能否解開呢?
  • 基於Canal和Kafka實現MySQL的Binlog近實時同步
    作者:Throwablejuejin.im/post/5e6a6746f265da575c16d678前提近段時間,業務系統架構基本完備,數據層面的建設比較薄弱,因為筆者目前工作重心在於搭建一個小型的數據平臺。
  • 第二屆華東架構師大會
    第二屆華東架構師大會即將於2013年10月27日在上海華納風格酒店如意廳舉行,此次峰會由上海著名網際網路技術社區—Think技術社區舉辦。 距離上次的首屆華東架構師大會只有一年之遙,幾個月前的PHP峰會還歷歷在目,現在我們又開始風風火火的籌備著今年10月份的架構師大會。
  • 實戰|Kafka + Flink + Redis 的電商大屏實時計算案
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫來源:LittleMagiccloud.tencent.com/developer/article/1558372本篇涉及到主要技術為
  • 阿里P8架構師,嘔心48小時整理的分布式系統實戰筆記
    前言現在的架構很多,各種各樣的,如高並發架構、異地多活架構、容器化架構、微服務架構、高可用架構、彈性化架構等,還有和這些架構相關的管理型的技術方法,如 DevOps、應用監控、自動化運維、SOA 服務治理、去 IOE 等等,還有很多。那什麼是分布式系統?
  • 為什麼大部分人做不了架構師?這2點是關鍵
    問題的尺度上,可以大到國家戰略問題、經濟問題、民生問題,也可以小到一隻鋼筆如何均勻地吐墨;時間上,可以是當下的問題,也可以是預期以後會發生的問題;架構不是一成不變的,它只適合於特定的場景。過去的架構不一定適合現在,當下的架構不一定能預測未來。二、什麼是架構師?架構師是一個角色,定義角色其實是定義職責,架構師的職責是:識別並定義問題,創建、選擇或調整架構,從而找到最優的方案,解決問題。
  • 如何成為更好的軟體架構師?這篇3.8K star的文章值得一看
    幾天前,高級架構師 Justin Miller 在 GitHub 上創建項目,介紹自己關於「如何成為更好的軟體架構師」的想法。該項目發布一天即獲得 1.4K star,現在已有 3.8K star 量。
  • 《九星天辰訣》發飆的蝸牛 任首席世界觀架構師
    《九星天辰訣》發飆的蝸牛 任首席世界觀架構師小說、電視劇改編網遊的先例已是不勝枚舉,但大多「雷聲大,雨點小」,原本優質的IP成了各種改編網遊的遮羞布,也讓眾多粉絲、玩家感到心塞。終於,讓人氣小說《九星天辰訣》作者「發飆的蝸牛」真的發飆了,他在微博炸毛吐槽,不留絲毫情面,言辭頗為激烈。
  • Kafka 集群在馬蜂窩大數據平臺的優化與應用擴展
    客戶端的對 offset 的管理依賴 zookeeper, 對 zookeeper 的使用過重, 增加運維的複雜度監控指標不完善:如 topic、partition、broker 的數據 size 指標, 同時 kafka manager 等監控工具對低版本 kafka 支持不好
  • 精工脈衝星全金屬旋蓋計算機手錶——Seiko pulsar Y739
    其實早在八十年代,seiko與alba,和pulsar基本都有共通的型號,機芯完全相同而外形有點小差別,機身分別印刻著不同的品牌。對於很多喜歡全天候佩戴手錶的人,在日常洗澡與雨中作業的時候就需要防水性能相對較高的手錶。在有一段時候比較沉迷於計算機數顯的時候,卡西歐一系列合蓋的計算機手錶還是讓我感到不是特別踏實。
  • AMD首席遊戲解決方案架構師專訪:RDNA2架構傳奇的延續
    Frank Azor    就此問題,我們也對Frank Azor——AMD首席遊戲解決方案架構師進行了媒體專訪。會上,Frank Azor為玩家和用戶們解答了更多關於全新RDNA2架構關於遊戲解決方面的設計細節。
  • IBM高級架構師結合Java多線程和Socket,帶你實戰微服務架構
    微服務架構的概念,現在對於大家應該都不陌生,無論使用 Apache Dubbo、還是 Spring Cloud,都可以去嘗試微服務,把複雜而龐大的業務系統拆分成一些更小粒度且獨立部署的 Rest 服務。但是你了解微服務的發展背景嗎?接下來,咱們一塊深入微服務的發展背景,也幫大家夯實一下微服務架構的技術發展。
  • 軟體測試架構師入門首要基礎知識是什麼呢?軟體產品質量模型
    對於軟體測試架構師來說,參與項目首先需要深入理解知識就是:軟體產品質量模型。 為什麼要把軟體質量模型的知識作為首要知識呢?大家都知道,軟體測試的一個最重要的目標是什麼呢?驗證產品的質量是否滿足客戶的需求。那測試的基礎是什麼呢?