兩個(gè)優(yōu)秀的分布式消息流平臺:Kafka與Pulsar
??點(diǎn)擊“博文視點(diǎn)Broadview”,獲取更多書訊

本文向讀者介紹兩個(gè)優(yōu)秀的分布式消息流平臺:Kafka與Pulsar。
Apache Kafka(簡稱Kafka)是由LinkedIn公司開發(fā)的分布式消息流平臺,于2011年開源。Kafka是使用Scala和Java編寫的,當(dāng)下已成為最流行的分布式消息流平臺之一。Kafka基于發(fā)布/訂閱模式,具有高吞吐、可持久化、可水平擴(kuò)展、支持流數(shù)據(jù)處理等特性。
Apache Pulsar(簡稱Pulsar)是雅虎開發(fā)的“下一代云原生分布式消息流平臺”,于2016年開源,目前也在快速發(fā)展中。Pulsar集消息、存儲、輕量化函數(shù)式計(jì)算為一體,采用計(jì)算與存儲分離架構(gòu)設(shè)計(jì),支持多租戶、持久化存儲、多機(jī)房跨區(qū)域數(shù)據(jù)復(fù)制,具有強(qiáng)一致性、高吞吐、低延時(shí)及高可擴(kuò)展性等流數(shù)據(jù)存儲特性。
Kafka與Pulsar都是優(yōu)秀的分布式消息流平臺,它們都提供了以下基礎(chǔ)功能:
(1)消息系統(tǒng):Kafka與Pulsar都可以實(shí)現(xiàn)基于發(fā)布/訂閱模式的消息系統(tǒng),消息系統(tǒng)可以實(shí)現(xiàn)由消息驅(qū)動的程序—生產(chǎn)者負(fù)責(zé)產(chǎn)生并發(fā)送消息到消息系統(tǒng),消息系統(tǒng)將消息投遞給消費(fèi)者,消費(fèi)者收到消息后,執(zhí)行自己的邏輯。
這種消息驅(qū)動機(jī)制具有以下優(yōu)點(diǎn):
系統(tǒng)解耦:生產(chǎn)者與消費(fèi)者邏輯解耦,互不干預(yù)。如果需要對消息添加新的處理邏輯,則只需要添加新的消費(fèi)者即可,非常方便。
流量削峰:消息系統(tǒng)作為消息緩沖區(qū),以低成本將上游服務(wù)(生產(chǎn)者)的流量洪峰緩存起來,下游服務(wù)(消費(fèi)者)按照自身處理能力從消息隊(duì)列中讀取數(shù)據(jù)并進(jìn)行處理,避免下游服務(wù)由于大量的請求流量而崩潰。
數(shù)據(jù)冗余:消息系統(tǒng)將數(shù)據(jù)緩存起來,直到數(shù)據(jù)被處理,避免下游服務(wù)由于崩潰下線、網(wǎng)絡(luò)阻塞等原因無法及時(shí)處理數(shù)據(jù)而導(dǎo)致數(shù)據(jù)丟失。
(2)存儲系統(tǒng):Kafka與Pulsar可以存儲大量數(shù)據(jù),并且客戶端控制自己讀取數(shù)據(jù)的位置,所以它們也可以作為存儲系統(tǒng),存儲大量歷史數(shù)據(jù)。
(3)實(shí)時(shí)流數(shù)據(jù)管道:Kafka與Pulsar可以構(gòu)建實(shí)時(shí)流數(shù)據(jù)管道,流數(shù)據(jù)管道從MySQL、MongoDB等數(shù)據(jù)源加載數(shù)據(jù)到Kafka與Pulsar中,其他系統(tǒng)或應(yīng)用就可以穩(wěn)定地從Kafka與Pulsar中獲取數(shù)據(jù),而不需要再與MySQL等數(shù)據(jù)源對接。為此,Kafka提供了Kafka Connect模塊,Pulsar提供了Pulsar IO模塊,它們都可以構(gòu)建實(shí)時(shí)流數(shù)據(jù)管道。
(4)流計(jì)算應(yīng)用:流計(jì)算應(yīng)用不斷地從Kafka與Pulsar中獲取流數(shù)據(jù),并對數(shù)據(jù)進(jìn)行處理,最后將處理結(jié)果輸出到Kafka與Pulsar中(或其他系統(tǒng))。流計(jì)算應(yīng)用通常需要根據(jù)業(yè)務(wù)需求對流數(shù)據(jù)進(jìn)行復(fù)雜的數(shù)據(jù)變換,如流數(shù)據(jù)聚合或者join等。為此,Kafka提供了Kafka Streams模塊,Pulsar提供了Pulsar Functions模塊,它們都可以實(shí)現(xiàn)流計(jì)算應(yīng)用。另外,Kafka與Pulsar也可以與流行的Spark、Flink等分布式計(jì)算引擎結(jié)合,構(gòu)建實(shí)時(shí)流應(yīng)用,實(shí)時(shí)處理大規(guī)模數(shù)據(jù)。
高吞吐、低延遲:它們都具有高吞吐量處理大規(guī)模消息流的能力,并且能夠低延遲處理消息。這也是大多數(shù)消息流平臺追求的目標(biāo)。 持久化、一致性:Kafka與Pulsar都支持將消息持久化存儲,并提供數(shù)據(jù)備份(副本)功能,保證數(shù)據(jù)安全及數(shù)據(jù)一致性,它們都是優(yōu)秀的分布式存儲系統(tǒng)。
高可擴(kuò)展性(伸縮性):Kafka與Pulsar都是分布式系統(tǒng),會將數(shù)據(jù)分片存儲在一組機(jī)器組成的集群中,并支持對集群進(jìn)行擴(kuò)容,從而支持大規(guī)模的數(shù)據(jù)。
故障轉(zhuǎn)移(容錯(cuò)):Kafka與Pulsar支持故障轉(zhuǎn)移,即集群中某個(gè)節(jié)點(diǎn)因故障下線后,并不會影響集群的正常運(yùn)行,這也是優(yōu)秀的分布式系統(tǒng)的必備功能。
Kafka與Pulsar雖然提供的基礎(chǔ)功能類似,但它們的設(shè)計(jì)、架構(gòu)、實(shí)現(xiàn)并不相同,本書將深入分析Kafka與Pulsar如何實(shí)現(xiàn)一個(gè)分布式、高擴(kuò)展、高吞吐、低延遲的消息流平臺。另外,本書也會介紹Kafka與Pulsar中連接器、流計(jì)算引擎等功能的應(yīng)用實(shí)踐。

圖中展示了消息系統(tǒng)中的4個(gè)基本概念。它們在Kafka與Pulsar中都存在,并且含義相同。
消息Message:Kafka與Pulsar中的數(shù)據(jù)實(shí)體。
生產(chǎn)者Producer:發(fā)布消息的應(yīng)用。
消費(fèi)者Consumer:訂閱消息的應(yīng)用。
主題Topic:Kafka與Pulsar將某一類消息劃分到一個(gè)主題,主題是消息的邏輯分組,不同主題的消息互不干預(yù)。
下面結(jié)合一個(gè)例子說明上述概念。假如存在一個(gè)用戶服務(wù),該用戶服務(wù)創(chuàng)建了一個(gè)主題“userTopic”,每當(dāng)有新用戶注冊時(shí),用戶服務(wù)都會將一個(gè)消息發(fā)送到該主題中,消息內(nèi)容為“新用戶注冊”。當(dāng)前有兩個(gè)服務(wù)訂閱了該主題的消息:權(quán)益服務(wù)和權(quán)限服務(wù)。權(quán)益服務(wù)收到消息后,負(fù)責(zé)給新用戶創(chuàng)建權(quán)益。權(quán)限服務(wù)收到消息后,負(fù)責(zé)給新用戶分配權(quán)限。該例子中的消息即用戶服務(wù)發(fā)送的數(shù)據(jù)實(shí)體,生產(chǎn)者是用戶服務(wù)。消費(fèi)者是權(quán)益服務(wù)與權(quán)限服務(wù)。ka的基礎(chǔ)概念
下面介紹Kafka的一些基礎(chǔ)概念。
Kafka消費(fèi)組:Kafka將多個(gè)消費(fèi)者劃分到一個(gè)邏輯分組中,該分組即一個(gè)消費(fèi)組。這個(gè)概念比較重要,結(jié)合上面的例子進(jìn)行說明,在Kafka中,權(quán)益服務(wù)所有的消費(fèi)者都可以加入一個(gè)權(quán)益消費(fèi)組rightsGroup,而權(quán)限服務(wù)所有的消費(fèi)者都可以加入一個(gè)權(quán)限消費(fèi)組guthorityGroup。不同消費(fèi)者之間消費(fèi)消息互不干預(yù)。
Broker:Kafka服務(wù)節(jié)點(diǎn),可以將Broker理解為一個(gè)Kafka的服務(wù)節(jié)點(diǎn)或者服務(wù)進(jìn)程(下面將其統(tǒng)稱為Broker節(jié)點(diǎn)),多個(gè)Broker節(jié)點(diǎn)可以組成一個(gè)Broker集群。
分區(qū)Partition:Kafka定義了分區(qū)的概念,一個(gè)主題由一個(gè)或多個(gè)分區(qū)組成,Kafka將一個(gè)主題的消息劃分到不同的分區(qū),并將不同分區(qū)存儲到不同的Broker,從而實(shí)現(xiàn)分布式存儲(典型的數(shù)據(jù)分片思想),每個(gè)分區(qū)都有對應(yīng)的下標(biāo),下標(biāo)從0開始。
副本Replica:Kafka中每個(gè)分區(qū)都有一個(gè)或多個(gè)副本,其中有1個(gè)leader副本,0個(gè)或多個(gè)follow副本,每個(gè)副本都保存了該分區(qū)全部的內(nèi)容。Kafka會將一個(gè)分區(qū)的不同副本保存到不同的Broker節(jié)點(diǎn)中,以保證數(shù)據(jù)的安全。本書后面會詳細(xì)分析Kafka副本同步機(jī)制。
AR(Assigned Replicas):分區(qū)的副本列表,即一個(gè)分區(qū)所有副本所在Broker的列表。
ISR:分區(qū)中所有與leader副本保持一定程度同步(即不能落后太多)的副本會組成ISR(In-Sync Replicas)集合。ISR集合中包括leader副本,可以將其理解為已同步副本(不一定完全同步,但不會落后太多)。
ACK機(jī)制:ACK(消息確認(rèn))機(jī)制是消息系統(tǒng)中的一個(gè)很重要的機(jī)制,消息系統(tǒng)ACK機(jī)制與HTTP的ACK機(jī)制非常類似。消息系統(tǒng)ACK機(jī)制可以分為兩部分:
mBroker收到生產(chǎn)者發(fā)送的消息并成功存儲這些消息后,返回成功響應(yīng)(可以將該成功響應(yīng)理解為一種ACK)給生產(chǎn)者,這時(shí)生產(chǎn)者可以認(rèn)為消息已經(jīng)發(fā)送成功,否則生產(chǎn)者可能需要做一些補(bǔ)償操作,如重發(fā)消息。
m消費(fèi)者收到Broker投遞的消息并成功處理后,返回消費(fèi)成功響應(yīng)給Broker,Broker收到這些消費(fèi)成功響應(yīng)后,可以認(rèn)為消費(fèi)者已經(jīng)成功消費(fèi)了消息,否則Broker可能需要做一些補(bǔ)償操作,如重新投遞消息。該場景下消費(fèi)者通常需要將消費(fèi)成功的消息位置(或者消息Id等)發(fā)送給Broker,并且Broker需要存儲這些消費(fèi)成功的位置,以便后續(xù)消費(fèi)者重啟后從該位置繼續(xù)消費(fèi)。該場景也是我們關(guān)注的重點(diǎn)。
在Kafka中,每個(gè)消息都存在一個(gè)偏移量offset,如果將一個(gè)Kafka主題理解為一個(gè)簡單的消息數(shù)組,那么可以將消息偏移量理解為該消息在該數(shù)組中的索引。消費(fèi)者會將最新消費(fèi)成功的消息的下一個(gè)偏移量發(fā)送給Broker(代表該偏移量前面的消息都已經(jīng)消費(fèi)成功),Broker會存儲這些偏移量,以記錄消費(fèi)者的最新消費(fèi)位置。為了方便描述,本書后面將消費(fèi)者提交ACK信息中的偏移量稱為ACK偏移量。
另外,Kafka與Pulsar都使用ZooKeeper存儲元數(shù)據(jù),完成分布式協(xié)作等操作,ZooKeeper是一種分布式協(xié)作服務(wù),專注于協(xié)作多個(gè)分布式進(jìn)程之間的活動,可以幫助開發(fā)人員專注于應(yīng)用程序的核心邏輯,而不必?fù)?dān)心應(yīng)用程序的分布式特性。本書后面會詳細(xì)分析ZooKeeper為Kafka與Pulsar提供了哪些服務(wù)。Kafka 2.8開始提供KRaft模塊,支持Kafka脫離ZooKeeper獨(dú)立運(yùn)行部署,本書后面也會詳細(xì)分析該模塊的設(shè)計(jì)與實(shí)現(xiàn)。
下圖展示了Kafka集群的基礎(chǔ)架構(gòu)。

下面介紹Pulsar的基礎(chǔ)概念
Pulsar訂閱組:Pulsar可以將多個(gè)消費(fèi)者綁定到一個(gè)訂閱組中,類似于Kafka的消費(fèi)組。同樣使用前面“用戶服務(wù)”的例子進(jìn)行說明,在Pulsar中,權(quán)益服務(wù)所有的消費(fèi)者都可以綁定一個(gè)權(quán)益訂閱組rightsSubscription,而權(quán)限服務(wù)所有的消費(fèi)者都可以綁定一個(gè)權(quán)限訂閱組guthoritySubscription,不同訂閱組之間消費(fèi)消息互不干預(yù)。
非分區(qū)主題、分區(qū)主題:Kafka中每個(gè)分區(qū)都與一個(gè)Broker綁定,而Pulsar中每個(gè)主題都與一個(gè)Broker綁定,某主題的消息固定發(fā)送給相應(yīng)的Broker節(jié)點(diǎn)。而Pulsar中也有“分區(qū)主題”的概念,分區(qū)主題由一組非分區(qū)的內(nèi)部主題組成(下面將Pulsar中組成分區(qū)主題的非分區(qū)內(nèi)部主題簡稱為內(nèi)部主題),每一個(gè)內(nèi)部主題都與一個(gè)Broker綁定,這樣一個(gè)分區(qū)主題可以將消息發(fā)送到多個(gè)Broker,避免Pulsar單個(gè)主題的性能受限于單個(gè)Broker節(jié)點(diǎn)。
Broker:Pulsar集群中的服務(wù)節(jié)點(diǎn)。需要注意,Pulsar由于采用計(jì)算、存儲分離的架構(gòu),因此Pulsar Broker節(jié)點(diǎn)只負(fù)責(zé)計(jì)算,并不負(fù)責(zé)存儲,Pulsar Broker節(jié)點(diǎn)會完成數(shù)據(jù)檢驗(yàn)、負(fù)載均衡等工作,并將消息轉(zhuǎn)發(fā)給Bookie節(jié)點(diǎn)。
Bookie:Pulsar利用BookKeeper服務(wù)實(shí)現(xiàn)存儲功能,BookKeeper中的節(jié)點(diǎn)被稱為Bookie節(jié)點(diǎn)。BookKeeper框架是一個(gè)分布式日志存儲服務(wù)框架,本書后面會詳細(xì)分析它。Pulsar中的Bookie節(jié)點(diǎn)負(fù)責(zé)完成消息存儲工作。
Ledger:BookKeeper的數(shù)據(jù)集合,生產(chǎn)者會將數(shù)據(jù)寫入Ledger,而消費(fèi)者從Ledger中讀取數(shù)據(jù)。為了數(shù)據(jù)安全,BookKeeper會將一個(gè)Ledger的數(shù)據(jù)存儲到多個(gè)Bookie節(jié)點(diǎn)中,實(shí)現(xiàn)數(shù)據(jù)備份。
Entry:Ledger中的數(shù)據(jù)單元,Ledger中的每個(gè)數(shù)據(jù)都是一個(gè)Entry。可以將Ledger理解為一個(gè)賬本,Entry則是賬本中的一個(gè)條目。
租戶、命名空間:Pulsar定義了租戶、命名空間的概念,Pulsar是一個(gè)多租戶系統(tǒng),它給不同的租戶分配不同的資源,并保證不同租戶之間的數(shù)據(jù)相互隔離,互不干預(yù),這樣可以支持多團(tuán)隊(duì)、多用戶同時(shí)使用一個(gè)Pulsar服務(wù)。每個(gè)租戶還可以創(chuàng)建多個(gè)命名空間,命名空間為主題的邏輯分組??梢詫ulsar理解為一個(gè)大房子,每個(gè)租戶是房子里的一個(gè)房間,并且這個(gè)房間的空間劃分為不同的區(qū)域(命名空間),不同區(qū)域存放不同的物件。例如,用戶服務(wù)可以創(chuàng)建一個(gè)租戶“user”,存儲用戶服務(wù)的消息。該租戶可以按自己的業(yè)務(wù)場景,創(chuàng)建多個(gè)命名空間,存放不同的主題,如下圖所示。

Cluster集群:Pulsar為集群定義了一個(gè)Cluster概念,每個(gè)Pulsar Broker節(jié)點(diǎn)都運(yùn)行在一個(gè)Cluster集群下,不同的Cluster集群之間可以相互復(fù)制數(shù)據(jù),從而實(shí)現(xiàn)跨地域復(fù)制。
ACK機(jī)制:與Kafka類似,Pulsar同樣需要完成“Broker存儲消息后返回成功響應(yīng)給生產(chǎn)者”“消費(fèi)者成功處理消息后發(fā)送ACK給Broker”。Pulsar中的每個(gè)消息都有一個(gè)消息Id,Pulsar消費(fèi)者會將消費(fèi)成功的消息Id作為ACK請求內(nèi)容發(fā)送給Broker。
下圖展示了Pulsar集群的基礎(chǔ)架構(gòu)。

本文介紹了Kafka與Pulsar的起源發(fā)展與系統(tǒng)特性,以及Kafka與Pulsar中最基本的核心概念。如果還想學(xué)習(xí)更多,《深入理解Kafka與Pulsar:消息流平臺的實(shí)踐與剖析》這本書中會詳細(xì)介紹這些概念的具體含義與作用,也會逐漸補(bǔ)充Kafka與Pulsar中其他的關(guān)鍵概念,如果讀者對某個(gè)概念不太理解,也可以先帶著疑問閱讀本書。
想要深入了解Kafka與Pulsar嗎?
快來看看這本書吧!

▊《深入理解Kafka與Pulsar:消息流平臺的實(shí)踐與剖析》
梁國斌 著
詳細(xì)介紹Kafka與Pulsar的使用方式
深入分析Kafka與Pulsar的實(shí)現(xiàn)原理
本書詳細(xì)介紹了Kafka與Pulsar的使用方式,并深入分析了它們的實(shí)現(xiàn)機(jī)制。通過閱讀本書,讀者可以快速入門和使用Kafka與Pulsar,并深入理解它們的實(shí)現(xiàn)原理。
本書通過大量實(shí)踐示例介紹了Kafka與Pulsar的使用方式,包括管理腳本與客戶端(生產(chǎn)者、消費(fèi)者)的使用方式、關(guān)鍵的配置項(xiàng)、ACK提交方式等基礎(chǔ)應(yīng)用,以及安全機(jī)制、跨地域復(fù)制機(jī)制、連接器/流計(jì)算引擎、常用監(jiān)控管理平臺等高級應(yīng)用。這些內(nèi)容可以幫助讀者深入掌握Kafka與Pulsar的使用方式,并完成日常管理工作。另外,本書深入分析了Kafka與Pulsar的實(shí)現(xiàn)原理,包括客戶端(生產(chǎn)者、消費(fèi)者)的設(shè)計(jì)與實(shí)現(xiàn)、Broker網(wǎng)絡(luò)模型、主題(分區(qū))分配與負(fù)載均衡機(jī)制,以及磁盤存儲與性能優(yōu)化方案、數(shù)據(jù)同步機(jī)制、擴(kuò)容與故障轉(zhuǎn)移機(jī)制。最后,本書介紹了Kafka與Pulsar的事務(wù)機(jī)制,并深入分析了Kafka事務(wù)的實(shí)現(xiàn)及Kafka的分布式協(xié)作組件KRaft模塊。這部分內(nèi)容可以幫助讀者輕松理解Kafka與Pulsar的架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)原理。
粉絲福利
限時(shí)優(yōu)惠掃碼或點(diǎn)擊閱讀原文
下單半價(jià)
快快掃碼搶購
審核:陳歆懿
如果喜歡本文 歡迎 在看丨留言丨分享至朋友圈 三連 熱文推薦
▼點(diǎn)擊閱讀原文,了解本書詳情~
