掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
作者:聞數(shù)起舞 2020-11-14 11:23:18
開發(fā)
開發(fā)工具
Kafka 在本文中,我將重點介紹Pulsar的優(yōu)勢,并為您提供一些理由,使您對比Kafka來考慮它。

介紹
最近,我一直在研究Pulsar及其與Kafka的比較。 快速搜索將顯示兩個最著名的開源消息傳遞系統(tǒng)之間存在當前的"戰(zhàn)爭"。
作為Kafka的用戶,我確實對Kafka的某些問題感到困惑,并且我對Pulsar感到非常失望。所以最后,我設法花了一些時間進行研究,并且做了很多研究。在本文中,我將重點介紹Pulsar的優(yōu)勢,并為您提供一些理由,使您對比Kafka來考慮它。但是,請在產(chǎn)品使用,支持,社區(qū),文檔等方面明確一點;Kafka顯然超過了Pulsar,并且只有在本文中討論的大多數(shù)優(yōu)點都適合您的用例的情況下,才考慮使用Pulsar。讓我們開始!
Kafka基礎知識
Kafka是消息傳遞系統(tǒng)之王。它由LinkedIn于2011年創(chuàng)建,并在Confluent的支持下得到了廣泛的傳播。Confluent已向開源社區(qū)發(fā)布了許多新功能和附加組件,例如用于模式演化的Schema Registry,用于從其他數(shù)據(jù)源輕松流式傳輸?shù)腒afka Connect等。數(shù)據(jù)庫到Kafka,Kafka Streams進行分布式流處理,最近使用KSQL對Kafka主題執(zhí)行類似SQL的查詢等等。它還具有用于許多系統(tǒng)的許多連接器,有關更多詳細信息,請查看Confluent Platform。
Kafka快速,易于安裝,非常受歡迎,可用于廣泛的范圍或用例。 從開發(fā)人員的角度來看,盡管Apache Kafka一直很友好,但在操作上卻是一團糟。 因此,讓我們回顧一下Kafka的一些痛點。
> Kafka example. Source: https://talks.rmoff.net/pZC6Za/slides
Kafka的問題
如您所見,大多數(shù)問題與操作方面有關。 盡管安裝起來相對容易,但Kafka難以管理和調(diào)整。 而且,它還沒有像它可能的那樣靈活和有彈性。
Pulsar基礎知識
Pulsar由Yahoo在2013年創(chuàng)建,并于2016年捐贈給Apache基金會。Pulsar現(xiàn)在是Apache的頂級項目。Yahoo,Verizon,Twitter等公司在生產(chǎn)中使用它來處理數(shù)百萬條消息。它具有許多功能,并且非常靈活。它聲稱比Kafka更快,因此運行成本更低。它旨在解決Kafka的大部分難題,使其更易于擴展。
Pulsar非常靈活; 它可以像Kafka這樣的分布式日志,也可以像RabbitMQ這樣的純消息傳遞系統(tǒng)。 它具有多種類型的訂閱,幾種交付保證,保留策略以及幾種處理模式演變的方法。 它還有很多功能……
> Pulsar architecture: https://pulsar.apache.org/docs/en/concepts-architecture-overview/
Pulsar的特性
> 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
- $ bin/pulsar standalone
Pulsar提供了一個稱為pulsar-client的CLI工具,我們可以使用它與集群進行交互。
產(chǎn)生消息:
- $ bin/pulsar-client produce my-topic --messages "hello-pulsar"
閱讀消息:
- $ bin/pulsar-client consume my-topic -s "first-subscription"
Akka流示例
作為一個客戶示例,讓我們在Akka上使用Pulsar4s!
首先,我們需要創(chuàng)建一個Source來使用數(shù)據(jù)流,所需要的只是一個函數(shù),該函數(shù)將按需創(chuàng)建使用者并查找消息ID:
- val topic = Topic("persistent://standalone/mytopic")
- val consumerFn = () => client.consumer(ConsumerConfig(topic, subscription))
然后,我們傳遞consumerFn函數(shù)來創(chuàng)建源:
- import com.sksamuel.pulsar4s.akka.streams._
- val pulsarSource = source(consumerFn, Some(MessageId.earliest))
Akka源的物化值是Control的一個實例,該對象提供了一種"關閉"方法,可用于停止使用消息。 現(xiàn)在,我們可以像往常一樣使用Akka Streams處理數(shù)據(jù)。
要創(chuàng)建一個接收器:
- val topic = Topic("persistent://standalone/mytopic")
- val producerFn = () => client.producer(ProducerConfig(topic))
- import com.sksamuel.pulsar4s.akka.streams._
- val pulsarSink = sink(producerFn)
完整示例摘自Pulsar4s:
Pulsar函數(shù)示例
Pulsar函數(shù)處理來自一個或多個主題的消息,對其進行轉(zhuǎn)換并將結(jié)果輸出到另一個主題:
> Pulsar Functions. Source: https://pulsar.apache.org/docs/en/functions-overview/
可以在兩個接口之間進行選擇以編寫函數(shù):
使用語言本機接口非常容易,您只需編寫一個簡單的函數(shù)即可轉(zhuǎn)換消息:
- def process(input):
- return "{}!".format(input)
用Python編寫的這個簡單函數(shù)只是向所有傳入的字符串添加一個感嘆號,并將結(jié)果字符串發(fā)布到主題。
要使用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)
- }
要發(fā)布無服務器功能并將其部署到集群,我們使用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的一個重要功能是您可以在發(fā)布該函數(shù)時設置交付保證:
- $ bin/pulsar-admin functions create \
- --name my-effectively-once-function \
- --processing-guarantees EFFECTIVELY_ONCE
有以下選擇:
Pulsar的優(yōu)勢
讓我們回顧一下與Kafka相比的主要優(yōu)勢:
Pulsar的問題
Pulsar并不完美,Kafka之所以流行是有原因的,它做一件事并且做得很好。 Pulsar試圖解決太多領域,但沒有超越任何一個領域。 讓我們總結(jié)一下Pulsar的一些問題:
Confluent在Pulsar和Kafka之間進行了比較,可以在其中進行更多的詳細說明。 該博客還回答了有關Kafka與Pulsar的一些問題,但請注意,這些問題可能有偏見。
Pulsar使用案例
Pulsar可用于廣泛的用例:
什么時候應該考慮Pulsar
請注意,如果在云中,請考慮基于云的解決方案。云提供商擁有涵蓋某些用例的不同服務。例如,對于隊列消息傳遞,云提供商提供了許多服務,例如Google pub / sub。對于分布式日志,有Confluent云或AWS Kinesis。云提供商還提供了非常好的安全性。Pulsar的優(yōu)勢在于可以在一個平臺上提供許多功能。一些團隊可能將其用作微服務的消息傳遞系統(tǒng),而另一些團隊則將其用作數(shù)據(jù)處理的分布式日志。
結(jié)論
我是Kafka的忠實粉絲,這就是為什么我對Pulsar如此感興趣。競爭是好的,它驅(qū)動創(chuàng)新。
Kafka是一種成熟,富有彈性且經(jīng)過戰(zhàn)斗考驗的產(chǎn)品,在世界范圍內(nèi)獲得了巨大成功。 沒有它,我無法想象任何公司。 但是,我確實看到Kafka成為其自身成功的受害者,巨大的增長減慢了功能開發(fā)的速度,因為它們需要支持這么多大型公司。 刪除ZooKeeper依賴項等重要功能花費的時間太長。 這為諸如Pulsar等工具蓬勃發(fā)展創(chuàng)造了空間。 解決Kafka的一些問題并添加更多功能。
但是,Pulsar仍然很不成熟,在投入生產(chǎn)之前,我會格外小心。在將Pulsar納入你的組織之前,進行分析,進行基準測試,研究并編寫概念證明。從小處著手,在從Kafka遷移之前進行概念驗證,并在決定進行完全遷移之前先評估影響。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流