掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
作者:聞數(shù)起舞 2021-02-01 07:20:51
開發(fā)
架構(gòu)
開發(fā)工具
Kafka 最近,我一直在研究 Pulsar 及其與 Kafka 的比較。通過快速搜索,你會看到這兩個最著名的開源消息傳遞系統(tǒng)之間正在進(jìn)行的"戰(zhàn)爭"。

最近,我一直在研究 Pulsar 及其與 Kafka 的比較。通過快速搜索,你會看到這兩個最著名的開源消息傳遞系統(tǒng)之間正在進(jìn)行的"戰(zhàn)爭"。
圖片來自 Pexels
作為 Kafka 的用戶,我著實對 Kafka 的某些問題感到困惑,但 Pulsar 卻讓人眼前一亮、令我非常興奮。所以最后,我設(shè)法花了一些時間了解背景資料,并且做了很多研究。
在本文中,我將重點介紹 Pulsar 的優(yōu)勢,并說明 Pulsar 勝于 Kafka 的理由。讓我們開始!
Kafka 基礎(chǔ)知識
Kafka 是消息傳遞系統(tǒng)之王。它由 LinkedIn 于 2011 年創(chuàng)建,并在 Confluent 的支持下得到了廣泛的傳播。
Confluent 已向開源社區(qū)發(fā)布了許多新功能和附加組件,例如用于模式演化的 Schema Registry,用于從其他數(shù)據(jù)源輕松流式傳輸?shù)?Kafka Connect 等。
數(shù)據(jù)庫到 Kafka,Kafka Streams 進(jìn)行分布式流處理,最近使用 KSQL 對 Kafka topic 執(zhí)行類似 SQL 的查詢等等。
Kafka 快速,易于安裝,非常受歡迎,可用于廣泛的范圍或用例。從開發(fā)人員的角度來看,盡管 Apache Kafka 一直很友好,但在操作運(yùn)維方面卻是一團(tuán)糟。
因此,讓我們回顧一下 Kafka 的一些痛點:
Kafka 演示[2]
Kakfa的諸多痛點如下:
如您所見,大多數(shù)問題與操作運(yùn)維方面有關(guān)。盡管安裝起來相對容易,但 Kafka 難以管理和調(diào)優(yōu)。而且,它也缺乏應(yīng)有的靈活和彈性。
Pulsar 基礎(chǔ)知識
Pulsar 由 Yahoo!在 2013 年創(chuàng)建,并于 2016 年捐贈給 Apache 基金會。Pulsar 現(xiàn)在是 Apache 軟件基金會的頂級項目。
Yahoo!、Verizon、Twitter 等公司已在生產(chǎn)中使用它來處理成千上萬消息。它具有運(yùn)行成本低、靈活等特性。Pulsar 旨在解決 Kafka 的大部分難題,使其更易于擴(kuò)展。
Pulsar 非常靈活:它既可以應(yīng)用于像 Kafka 這樣的分布式日志應(yīng)用場景,也可以應(yīng)用于像 RabbitMQ 這樣的純消息傳遞系統(tǒng)場景。
它支持多種類型的訂閱、多種交付保證、保留策略以及處理模式演變的方法,以及其他諸多特性。
Pulsar 架構(gòu)圖[4]
Pulsar 的特性如下:
存儲和消息傳遞的分離解決了擴(kuò)展、重新平衡和維護(hù)集群的許多問題。它還提高了可靠性,幾乎不可能丟失數(shù)據(jù)。
Pulsar 特性列表[5]
Pulsar 入門
Pulsar 入門非常容易,使用前提是安裝 JDK。
①下載 Pulsar 并解壓縮(備注:目前 Apache Pulsar 最新版本為 2.7.0):
- $ 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 文件后,將文件復(fù)制到 Pulsar 目錄中的 Connectors 目錄。
④啟動 Pulsar!
- $ bin/pulsar standalone
Pulsar 提供了一個稱為 Pulsar-Client 的 CLI 工具,我們可以使用它與集群進(jìn)行交互。
生產(chǎn)消息:
- $ bin/pulsar-client produce my-topic --messages "hello-pulsar"
消費(fèi)消息:
- $ bin/pulsar-client consume my-topic -s "first-subscription"
Akka 流示例
舉一個客戶端示例,我們在 Akka 上使用 Pulsar4s。
首先,我們需要創(chuàng)建一個 Source 來消費(fèi)數(shù)據(jù)流,所需要的只是一個函數(shù),該函數(shù)將按需創(chuàng)建消費(fèi)者并查找消息 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 的一個實例,該對象提供了一種"關(guān)閉"方法,可用于停止消費(fèi)消息?,F(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[6]:
- object Example {
- import com.sksamuel.pulsar4s.{ConsumerConfig, MessageId, ProducerConfig, PulsarClient, Subscription, Topic}
- import org.apache.pulsar.client.api.Schema
- implicit val system: ActorSystem = ActorSystem()
- implicit val materializer: ActorMaterializer = ActorMaterializer()
- implicit val schema: Schema[Array[Byte]]= Schema.BYTES
- val client = PulsarClient("pulsar://localhost:6650")
- val intopic = Topic("persistent://sample/standalone/ns1/in")
- val outtopic = Topic("persistent://sample/standalone/ns1/out")
- val consumerFn = () => client.consumer(ConsumerConfig(topics = Seq(intopic), subscriptionName = Subscription("mysub")))
- val producerFn = () => client.producer(ProducerConfig(outtopic))
- val control = source(consumerFn, Some(MessageId.earliest))
- .map { consumerMessage => ProducerMessage(consumerMessage.data) }
- .to(sink(producerFn)).run()
- Thread.sleep(10000)
- control.stop()
- }
Pulsar Function 示例
Pulsar Function 處理來自一個或多個 topic 的消息,對其進(jìn)行轉(zhuǎn)換并將結(jié)果輸出到另一個 topic:
Pulsar Function[7]
可以在兩個接口之間進(jìn)行選擇以編寫函數(shù):
只需編寫一個簡單的函數(shù)即可使用語言原生接口轉(zhuǎn)換消息:
- def process(input):
- return "{}!".format(input)
用 Python 編寫的這個簡單函數(shù)只是向所有傳入的字符串添加一個感嘆號,并將結(jié)果字符串發(fā)布到 topic。
使用 SDK 需要導(dǎo)入依賴項,例如在 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ā)布無服務(wù)器功能并將其部署到集群,可以使用 Pulsar-Admin CL;如果使用 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 Function 的一個重要功能是用戶可以在發(fā)布該函數(shù)時設(shè)置交付保證:
- $ bin/pulsar-admin functions create \
- --name my-effectively-once-function \
- --processing-guarantees EFFECTIVELY_ONCE
有以下選擇:
Pulsar 的優(yōu)勢
與 Kafka 相比,讓我們回顧下 Pulsar 的主要優(yōu)勢:
Pulsar 的劣勢
Pulsar 并不完美,Pulsar 也存在一些問題:
不過,上面的情況都在得到快速改善,目前 Pulsar 也逐漸被越來越多的公司和組織使用。
Apache Pulsar 商業(yè)支持公司 StreamNative 也推出了 StreamNative Cloud,Apache Pulsar 正在快速成長,我們都可以看到令人欣喜的變化。
Confluent 曾發(fā)布博客對比 Pulsar 和 Kafka ,但請注意,這些問題可能有偏見。
Pulsar 使用場景
Pulsar 可用于廣泛的場景:
什么時候應(yīng)該考慮 Pulsar?
如果在云端,請注意考慮基于云的解決方案。云提供商擁有涵蓋某些場景的不同服務(wù)。
例如,對于隊列消息,云提供商提供了許多服務(wù),比如 Google pub / sub;對于分布式日志,有 Confluent 云或 AWS Kinesis;StreamNative 也提供了基于 Pulsar 的云端服務(wù)。
云提供商還提供了非常好的安全性。Pulsar 的優(yōu)勢在于可以在一個平臺上提供許多功能。
一些團(tuán)隊可能將其用作微服務(wù)的消息傳遞系統(tǒng),而另一些團(tuán)隊則將其用作數(shù)據(jù)處理的分布式日志。
結(jié)論
我是 Kafka 的忠實粉絲,我對 Pulsar 如此感興趣的原因是:競爭驅(qū)動創(chuàng)新。
Kafka 是一種成熟,富有彈性且經(jīng)過考驗的產(chǎn)品,在世界范圍內(nèi)獲得了巨大成功,無法想象大多數(shù)公司沒有它會怎樣。
但是我確實看到 Kafka 成為其自身成功的受害者,由于需要支持許多大型公司導(dǎo)致巨大的增長減慢了功能開發(fā)的速度、移除 ZooKeeper 依賴項等重要功能花費(fèi)的時間太長,這為諸如 Pulsar 等工具蓬勃發(fā)展創(chuàng)造了空間。
Pulsar 雖然年輕卻勢頭很猛,在將 Pulsar 納入組織之前,需進(jìn)行分析、基準(zhǔn)測試、研究并進(jìn)行 POC。
從小處著手,在將 Kafka 遷移到 Pulsar 之前進(jìn)行概念驗證,并在決定進(jìn)行完全遷移之前評估影響。
引用鏈接:
https://itnext.io/pulsar-advantages-over-kafka-7e0c2affe2d6
https://talks.rmoff.net/pZC6Za/slides
https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27846330
https://pulsar.apache.org/docs/en/concepts-architecture-overview/
https://pulsar.apache.org/
https://github.com/sksamuel/pulsar4s/blob/master/pulsar4s-akka-streams/src/test/scala/com/sksamuel/pulsar4s/akka/streams/Example.scala
https://pulsar.apache.org/docs/en/functions-overview/
https://medium.com/swlh/performance-comparison-between-apache-pulsar-and-kafka-latency-79fb0367f407
作者:聞數(shù)起舞
編輯:陶家龍
出處:轉(zhuǎn)載自 Java 高級架構(gòu),原中文版本由聞數(shù)起舞翻譯自 Lewis Fairweather 的文章《Pulsar Advantages Over Kafka》[1],文章轉(zhuǎn)載時有改動。
網(wǎng)頁標(biāo)題:我為什么放棄Kafka,選擇Pulsar?
URL鏈接:http://uogjgqi.cn/article/dpjhjhh.html

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