大伙評(píng)評(píng)理,Kafka與Pulsar 誰更牛?
Apache Kafka(簡(jiǎn)稱Kafka)是由LinkedIn公司開發(fā)的分布式消息流平臺(tái),于2011年開源。Kafka是使用Scala和Java編寫的,當(dāng)下已成為最流行的分布式消息流平臺(tái)之一。Kafka基于發(fā)布/訂閱模式,具有高吞吐、可持久化、可水平擴(kuò)展、支持流數(shù)據(jù)處理等特性。
Apache Pulsar(簡(jiǎn)稱Pulsar)是雅虎開發(fā)的“下一代云原生分布式消息流平臺(tái)”,于2016年開源,目前也在快速發(fā)展中。Pulsar集消息、存儲(chǔ)、輕量化函數(shù)式計(jì)算為一體,采用計(jì)算與存儲(chǔ)分離架構(gòu)設(shè)計(jì),支持多租戶、持久化存儲(chǔ)、多機(jī)房跨區(qū)域數(shù)據(jù)復(fù)制,具有強(qiáng)一致性、高吞吐、低延時(shí)及高可擴(kuò)展性等流數(shù)據(jù)存儲(chǔ)特性。
Kafka與Pulsar都是優(yōu)秀的分布式消息流平臺(tái),它們都提供了以下基礎(chǔ)功能:
(1) 消息系統(tǒng):Kafka與Pulsar都可以實(shí)現(xiàn)基于發(fā)布/訂閱模式的消息系統(tǒng),消息系統(tǒng)可以實(shí)現(xiàn)由消息驅(qū)動(dòng)的程序—生產(chǎn)者負(fù)責(zé)產(chǎn)生并發(fā)送消息到消息系統(tǒng),消息系統(tǒng)將消息投遞給消費(fèi)者,消費(fèi)者收到消息后,執(zhí)行自己的邏輯。
這種消息驅(qū)動(dòng)機(jī)制具有以下優(yōu)點(diǎn):
- 系統(tǒng)解耦:生產(chǎn)者與消費(fèi)者邏輯解耦,互不干預(yù)。如果需要對(duì)消息添加新的處理邏輯,則只需要添加新的消費(fèi)者即可,非常方便。
- 流量削峰:消息系統(tǒng)作為消息緩沖區(qū),以低成本將上游服務(wù)(生產(chǎn)者)的流量洪峰緩存起來,下游服務(wù)(消費(fèi)者)按照自身處理能力從消息隊(duì)列中讀取數(shù)據(jù)并進(jìn)行處理,避免下游服務(wù)由于大量的請(qǐng)求流量而崩潰。
- 數(shù)據(jù)冗余:消息系統(tǒng)將數(shù)據(jù)緩存起來,直到數(shù)據(jù)被處理,避免下游服務(wù)由于崩潰下線、網(wǎng)絡(luò)阻塞等原因無法及時(shí)處理數(shù)據(jù)而導(dǎo)致數(shù)據(jù)丟失。
(2) 存儲(chǔ)系統(tǒng):Kafka與Pulsar可以存儲(chǔ)大量數(shù)據(jù),并且客戶端控制自己讀取數(shù)據(jù)的位置,所以它們也可以作為存儲(chǔ)系統(tǒng),存儲(chǔ)大量歷史數(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ù)源對(duì)接。為此,Kafka提供了Kafka Connect模塊,Pulsar提供了Pulsar IO模塊,它們都可以構(gòu)建實(shí)時(shí)流數(shù)據(jù)管道。
(4) 流計(jì)算應(yīng)用:流計(jì)算應(yīng)用不斷地從Kafka與Pulsar中獲取流數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行處理,最后將處理結(jié)果輸出到Kafka與Pulsar中(或其他系統(tǒng))。流計(jì)算應(yīng)用通常需要根據(jù)業(yè)務(wù)需求對(duì)流數(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ù)。
Kafka與Pulsar都具有(或追求)以下特性
- 高吞吐、低延遲:它們都具有高吞吐量處理大規(guī)模消息流的能力,并且能夠低延遲處理消息。這也是大多數(shù)消息流平臺(tái)追求的目標(biāo)。
- 持久化、一致性:Kafka與Pulsar都支持將消息持久化存儲(chǔ),并提供數(shù)據(jù)備份(副本)功能,保證數(shù)據(jù)安全及數(shù)據(jù)一致性,它們都是優(yōu)秀的分布式存儲(chǔ)系統(tǒng)。
- 高可擴(kuò)展性(伸縮性):Kafka與Pulsar都是分布式系統(tǒng),會(huì)將數(shù)據(jù)分片存儲(chǔ)在一組機(jī)器組成的集群中,并支持對(duì)集群進(jìn)行擴(kuò)容,從而支持大規(guī)模的數(shù)據(jù)。
- 故障轉(zhuǎn)移(容錯(cuò)):Kafka與Pulsar支持故障轉(zhuǎn)移,即集群中某個(gè)節(jié)點(diǎn)因故障下線后,并不會(huì)影響集群的正常運(yùn)行,這也是優(yōu)秀的分布式系統(tǒng)的必備功能。
Kafka與Pulsar雖然提供的基礎(chǔ)功能類似,但它們的設(shè)計(jì)、架構(gòu)、實(shí)現(xiàn)并不相同,本書將深入分析Kafka與Pulsar如何實(shí)現(xiàn)一個(gè)分布式、高擴(kuò)展、高吞吐、低延遲的消息流平臺(tái)。另外,本書也會(huì)介紹Kafka與Pulsar中連接器、流計(jì)算引擎等功能的應(yīng)用實(shí)踐。
Kafka與Pulsar涉及的基礎(chǔ)概念
將Kafka與Pulsar都視為一個(gè)簡(jiǎn)單的消息系統(tǒng),消息流轉(zhuǎn)流程如下圖所示。
圖中展示了消息系統(tǒng)中的4個(gè)基本概念。它們?cè)贙afka與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)有新用戶注冊(cè)時(shí),用戶服務(wù)都會(huì)將一個(gè)消息發(fā)送到該主題中,消息內(nèi)容為“新用戶注冊(cè)”。當(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ǔ)概念
(1) 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ù)。
(2) 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集群。
(3) 分區(qū)Partition:Kafka定義了分區(qū)的概念,一個(gè)主題由一個(gè)或多個(gè)分區(qū)組成,Kafka將一個(gè)主題的消息劃分到不同的分區(qū),并將不同分區(qū)存儲(chǔ)到不同的Broker,從而實(shí)現(xiàn)分布式存儲(chǔ)(典型的數(shù)據(jù)分片思想),每個(gè)分區(qū)都有對(duì)應(yīng)的下標(biāo),下標(biāo)從0開始。
(4) 副本Replica:Kafka中每個(gè)分區(qū)都有一個(gè)或多個(gè)副本,其中有1個(gè)leader副本,0個(gè)或多個(gè)follow副本,每個(gè)副本都保存了該分區(qū)全部的內(nèi)容。Kafka會(huì)將一個(gè)分區(qū)的不同副本保存到不同的Broker節(jié)點(diǎn)中,以保證數(shù)據(jù)的安全。本書后面會(huì)詳細(xì)分析Kafka副本同步機(jī)制。
(5) AR(Assigned Replicas):分區(qū)的副本列表,即一個(gè)分區(qū)所有副本所在Broker的列表。
(6) ISR:分區(qū)中所有與leader副本保持一定程度同步(即不能落后太多)的副本會(huì)組成ISR(In-Sync Replicas)集合。ISR集合中包括leader副本,可以將其理解為已同步副本(不一定完全同步,但不會(huì)落后太多)。
(7) 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ā)送的消息并成功存儲(chǔ)這些消息后,返回成功響應(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ǔ)償操作,如重新投遞消息。該場(chǎng)景下消費(fèi)者通常需要將消費(fèi)成功的消息位置(或者消息Id等)發(fā)送給Broker,并且Broker需要存儲(chǔ)這些消費(fèi)成功的位置,以便后續(xù)消費(fèi)者重啟后從該位置繼續(xù)消費(fèi)。該場(chǎng)景也是我們關(guān)注的重點(diǎn)。
在Kafka中,每個(gè)消息都存在一個(gè)偏移量offset,如果將一個(gè)Kafka主題理解為一個(gè)簡(jiǎn)單的消息數(shù)組,那么可以將消息偏移量理解為該消息在該數(shù)組中的索引。消費(fèi)者會(huì)將最新消費(fèi)成功的消息的下一個(gè)偏移量發(fā)送給Broker(代表該偏移量前面的消息都已經(jīng)消費(fèi)成功),Broker會(huì)存儲(chǔ)這些偏移量,以記錄消費(fèi)者的最新消費(fèi)位置。為了方便描述,本書后面將消費(fèi)者提交ACK信息中的偏移量稱為ACK偏移量。
另外,Kafka與Pulsar都使用ZooKeeper存儲(chǔ)元數(shù)據(jù),完成分布式協(xié)作等操作,ZooKeeper是一種分布式協(xié)作服務(wù),專注于協(xié)作多個(gè)分布式進(jìn)程之間的活動(dòng),可以幫助開發(fā)人員專注于應(yīng)用程序的核心邏輯,而不必?fù)?dān)心應(yīng)用程序的分布式特性。
下圖展示了Kafka集群的基礎(chǔ)架構(gòu):
下面介紹Pulsar的基礎(chǔ)概念
(1) 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ù)。
(2) 非分區(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)部主題簡(jiǎn)稱為內(nèi)部主題),每一個(gè)內(nèi)部主題都與一個(gè)Broker綁定,這樣一個(gè)分區(qū)主題可以將消息發(fā)送到多個(gè)Broker,避免Pulsar單個(gè)主題的性能受限于單個(gè)Broker節(jié)點(diǎn)。
(3) Broker:Pulsar集群中的服務(wù)節(jié)點(diǎn)。需要注意,Pulsar由于采用計(jì)算、存儲(chǔ)分離的架構(gòu),因此Pulsar Broker節(jié)點(diǎn)只負(fù)責(zé)計(jì)算,并不負(fù)責(zé)存儲(chǔ),Pulsar Broker節(jié)點(diǎn)會(huì)完成數(shù)據(jù)檢驗(yàn)、負(fù)載均衡等工作,并將消息轉(zhuǎn)發(fā)給Bookie節(jié)點(diǎn)。
(4) Bookie:Pulsar利用BookKeeper服務(wù)實(shí)現(xiàn)存儲(chǔ)功能,BookKeeper中的節(jié)點(diǎn)被稱為Bookie節(jié)點(diǎn)。BookKeeper框架是一個(gè)分布式日志存儲(chǔ)服務(wù)框架,本書后面會(huì)詳細(xì)分析它。Pulsar中的Bookie節(jié)點(diǎn)負(fù)責(zé)完成消息存儲(chǔ)工作。
(5) Ledger:BookKeeper的數(shù)據(jù)集合,生產(chǎn)者會(huì)將數(shù)據(jù)寫入Ledger,而消費(fèi)者從Ledger中讀取數(shù)據(jù)。為了數(shù)據(jù)安全,BookKeeper會(huì)將一個(gè)Ledger的數(shù)據(jù)存儲(chǔ)到多個(gè)Bookie節(jié)點(diǎn)中,實(shí)現(xiàn)數(shù)據(jù)備份。
(6) Entry:Ledger中的數(shù)據(jù)單元,Ledger中的每個(gè)數(shù)據(jù)都是一個(gè)Entry??梢詫edger理解為一個(gè)賬本,Entry則是賬本中的一個(gè)條目。
(7) 租戶、命名空間:Pulsar定義了租戶、命名空間的概念,Pulsar是一個(gè)多租戶系統(tǒng),它給不同的租戶分配不同的資源,并保證不同租戶之間的數(shù)據(jù)相互隔離,互不干預(yù),這樣可以支持多團(tuán)隊(duì)、多用戶同時(shí)使用一個(gè)Pulsar服務(wù)。每個(gè)租戶還可以創(chuàng)建多個(gè)命名空間,命名空間為主題的邏輯分組。可以將Pulsar理解為一個(gè)大房子,每個(gè)租戶是房子里的一個(gè)房間,并且這個(gè)房間的空間劃分為不同的區(qū)域(命名空間),不同區(qū)域存放不同的物件。例如,用戶服務(wù)可以創(chuàng)建一個(gè)租戶“user”,存儲(chǔ)用戶服務(wù)的消息。該租戶可以按自己的業(yè)務(wù)場(chǎng)景,創(chuàng)建多個(gè)命名空間,存放不同的主題,如下圖所示。
(8) Cluster集群:Pulsar為集群定義了一個(gè)Cluster概念,每個(gè)Pulsar Broker節(jié)點(diǎn)都運(yùn)行在一個(gè)Cluster集群下,不同的Cluster集群之間可以相互復(fù)制數(shù)據(jù),從而實(shí)現(xiàn)跨地域復(fù)制。
(9) ACK機(jī)制:與Kafka類似,Pulsar同樣需要完成“Broker存儲(chǔ)消息后返回成功響應(yīng)給生產(chǎn)者”“消費(fèi)者成功處理消息后發(fā)送ACK給Broker”。Pulsar中的每個(gè)消息都有一個(gè)消息Id,Pulsar消費(fèi)者會(huì)將消費(fèi)成功的消息Id作為ACK請(qǐng)求內(nèi)容發(fā)送給Broker。
下圖展示了Pulsar集群的基礎(chǔ)架構(gòu)。
? ?