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

2021-01-08 51CTO

介紹

最近,我一直在研究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!

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

下載連接器(可選):

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

下載nar文件後,將文件複製到pulsar目錄中的connectors目錄 啟動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 \ --py ~/router.py \ --classname router.RoutingFunction \ --tenant public \ --namespace default \ --name route-fruit-veg \ --inputs persistent://public/default/basket-items 

Pulsar Functions的一個重要功能是您可以在發布該函數時設置交付保證:

$ bin/pulsar-admin functions create \ --name my-effectively-once-function \ --processing-guarantees EFFECTIVELY_ONCE 

有以下選擇:

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遷移之前進行概念驗證,並在決定進行完全遷移之前先評估影響。

【責任編輯:

趙寧寧

TEL:(010)68476606】

點讚 0

相關焦點

  • 譯文|LogDevice 與 Apache Pulsar 之間的對比
    原文連結: https://www.splunk.com/en_us/blog/it/comparing-logdevice-and-apache-pulsar.html 閱讀本文需要大約 8 分鐘。Facebook 已經發布開源 LogDevice[1]。
  • 大白話+13張圖解 Kafka
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言應大部分的小夥伴的要求,在Yarn之前先來一個kafka的小插曲,輕鬆愉快。
  • 雲原生消息平臺之王:Apache Pulsar
    我個人認為把它分成不同的抽象層更容易理解Apache Pulsar的架構設計,所以這就是我在這篇文章中要做的事情。接下來我們按照下圖,一層一層的進行分析。最後,有一些類似於kafka Topic的分區(Partition)。區別在於Apache Pulsar中的分區也是Topic。就像kafka一樣,生產者可以輪詢、hash或者明確指定分區來發送消息。以上都是對上層概念的一些介紹,下面我們將進行深入的研究。
  • Kafka 基本原理(8000 字小結)
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫上一周,師長發了篇:大白話+13張圖解 Kafka,大部分覺得講的很好,但是又有槓粉問了,咋地,還不夠清晰啊,有沒有更清晰的給看下。
  • Kafka快速入門秘籍:背景介紹,應用場景分析、核心架構分析
    在講實戰前,我們還是有必要講解下理論的,理論為輔,實戰為主,在實戰的基礎上,再深入理解理論,底層原理,底層源碼。下篇文章或者視頻,我們將帶你看官網學習kafka環境搭建、kafka基本用法、kafka的容錯性測試,在掌握知識的同時,還能順便學習下英文。
  • Pulsar Manger 0.2.0 正式發布, Apache Pulsar 的管理端
    - 支持使用後端處理靜態文件,這樣用戶可以直接啟動整個的 pulsar-manager 服務,不需要配置代理。- 為 docker 支持 JWT 配置- 在 pulsar-manager 上支持訂閱和取消訂閱。
  • Kafka這些名詞都說不出所以然,您竟然敢說自己精通kafka
    01kafka架構Kafka 運行在一個由一臺或多臺伺服器組成的集群上,並且分區可以跨集群分布kafka架構Producer: 消息生產者,向 Kafka Broker 發消息的客戶端。這個原理與Elasticsearch的架構原理類似,其實ES底層,也是大量基於os cache,實現了海量數據的高性能檢索的。
  • 譯文|Pulsar Schema Registry
    原文首發於:https://www.splunk.com/en_us/blog/it/the-pulsar-schema-registry.html在使用流數據時,我們通常只能使用原始字節流。原始字節流非常靈活,因此適用於數據傳輸。
  • 架構師多如過江之鯽,但你真的了解架構師這個工種嗎?
    擅長網際網路的高並發、高可用的分布式系統架構設計,組建並帶領團隊完成項目的訂單從零到數百萬量級的突破。對大中型複雜系統的需求分析、抽象、架構設計、拆分、服務化設計及整合也比較擅長,有多年證券、電信等傳統業務系統實戰經驗。什麼是架構師?
  • 架構師的工作都幹些什麼?!想做架構師必看!
    先給本文中架構師做個定義:第一,能力上達到(似乎是廢話),第二,公司肯承認,不僅能給架構師的頭銜,更能按架構師的標準發工資。對於程式設計師來說,架構師是職業發展的一道坎,如果跨過去了,後面就前途無量了,否則可能一直得做著代碼coding的事情。本文將從「如何升級」和「平時工作內容」兩方面,說下我對架構師的認識。
  • kafka極簡教程
    Apache kafka是消息中間件的一種,我發現很多人不知道消息中間件是什麼,在開始學習之前,我這邊就先簡單的解釋一下什麼是消息中間件,只是粗略的講解,目前kafka已經可以做更多的事情。再比如生產者很強勁(大交易量的情況),生產者1秒鐘生產100個雞蛋,消費者1秒鐘只能吃50個雞蛋,那要不了一會,消費者就吃不消了(消息堵塞,最終導致系統超時),消費者拒絕再吃了,」雞蛋「又丟失了,這個時候我們放個籃子在它們中間,生產出來的雞蛋都放到籃子裡,消費者去籃子裡拿雞蛋,這樣雞蛋就不會丟失了,都在籃子裡,而這個籃子就是」kafka「。
  • Apache Pulsar 引入 Cloud Storage Sink 連接器:實現數據上雲
    越來越多的企業選擇將數據存儲到雲平臺中。對於大部分軟體體系結構而言,「數據上雲」至關重要。將數據遷移上雲,有助於降低企業採購軟硬體的成本,減少監控、管理工作,提供較大存儲容量。
  • 前端架構師是打雜的麼?前端架構師的核心工作是什麼?
    , 但此刻我突然發現了其中的共性, 這種發現讓我忍不住上來擼篇文章和大家做個分享正文多年以前, 我從不理解架構師, 到從事前端架構, 到自己產生了一些理解, 期間也寫了不少關於架構, 關於前端架構的文章, 但總感覺還是過於抽象包括我和團隊的同學交流, 總覺得缺點什麼, 這種抽象和實際的架構工作之間還少了一層
  • 架構師勸退指南
    這是很多程式設計師的疑問,最近看到Kai Niklas講架構師的一篇文章,其中的真知灼見引起了我的強烈共鳴,尤其是後面的非技術部分。翻譯過來(略有刪減),分享給大家。英文文章請點擊」閱讀原文「。我事先給一位同學看了一下,他說:當個架構師太難了吧,又要精通技術,還得會溝通,平衡,營銷 我還是爭取做個技術專家吧!
  • 利用flume+kafka+storm+mysql構建大數據實時系統
    數據流向圖實時日誌分析系統架構簡介系統主要分為四部分:在我們系統中由kafka來接收。啟動步驟安裝好storm,flume,kafka之後開始項目部署啟動(在部署啟動之前最好按照安裝文檔進行storm kafka flume各個組件測試)。
  • kafka使用原理介紹
    - 同步異步:Producer採用異步push方式,極大提高Kafka系統的吞吐率(可以通過參數控制是採用同步還是異步方式)。- 實時數據與離線數據:kafka既支持離線數據也支持實時數據,因為kafka的message持久化到文件,並可以設置有效期,因此可以把kafka作為一個高效的存儲來使用,可以作為離線數據供後面的分析。當然作為分布式實時消息系統,大多數情況下還是用於實時的數據處理的,但是當cosumer消費能力下降的時候可以通過message的持久化在淤積數據在kafka。
  • 你是一名軟體架構師嗎?
    將軟體架構從軟體設計和開發中區分開來的關鍵因素包括:規模的上升、抽象層次的上升, 以及做出正確的設計決策帶來的影響的上升等等。軟體架構就在於能有一個全局視角、能具備更大的視野,理解軟體系統作為一個整體是如何工作的。這些因素對區分軟體開發和軟體架構也許有幫助,但還是無法解釋一些人如何從開發轉到了架構。
  • 講真,應該選擇RabbitMQ還是Kafka?
    作為一個有豐富經驗的微服務系統架構師,經常有人問我,應該選擇 RabbitMQ 還是 Kafka?的確,在一些案例場景下選擇 RabbitMQ 還是 Kafka 沒什麼差別,但是這兩種技術在底層實現方面是有許多差異的。不同的場景需要不同的解決方案,選錯一個方案能夠嚴重的影響你對軟體的設計,開發和維護的能力。這篇文章會先介紹一下基本的異步消息模式,然後再介紹一下 RabbitMQ 和 Kafka 以及他們的內部結構信息。
  • 「架構師專題」雲原生時代,架構師需具備的十大核心能力(上)
    10 年多的工作歷程,讓我有幸經歷了大範圍的技術演變,特別是雲計算和雲原生技術從朦朧到普及,對工程師和架構師的要求也發生了不少變化。趁著自己入職 11 周年的日子,結合我自己在百度的成長曆程,總結下我認為在雲計算特別是雲原生時代,對軟體架構師的核心能力要求,希望幫助大家在通往架構師的路上少走彎路。
  • 論架構師的自我修養
    或者說,在一個團隊中,實際的最終決策者,就是事實上的架構師。無論他被賦予什麼樣的頭銜。在一個團隊中,我們總能找到這樣的角色(無論他做得是不是稱職),而一個優秀的架構師,就是通常能夠做出「較多」正確決策的人。架構師的工作是什麼?