掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Apache Kafka(簡稱Kafka)是由LinkedIn公司開發(fā)的分布式消息流平臺,于2011年開源。Kafka是使用Scala和Java編寫的,當下已成為最流行的分布式消息流平臺之一。Kafka基于發(fā)布/訂閱模式,具有高吞吐、可持久化、可水平擴展、支持流數(shù)據(jù)處理等特性。

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供十堰鄖陽網(wǎng)站建設(shè)、十堰鄖陽做網(wǎng)站、十堰鄖陽網(wǎng)站設(shè)計、十堰鄖陽網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、十堰鄖陽企業(yè)網(wǎng)站模板建站服務,10年十堰鄖陽做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
Apache Pulsar(簡稱Pulsar)是雅虎開發(fā)的“下一代云原生分布式消息流平臺”,于2016年開源,目前也在快速發(fā)展中。Pulsar集消息、存儲、輕量化函數(shù)式計算為一體,采用計算與存儲分離架構(gòu)設(shè)計,支持多租戶、持久化存儲、多機房跨區(qū)域數(shù)據(jù)復制,具有強一致性、高吞吐、低延時及高可擴展性等流數(shù)據(jù)存儲特性。
Kafka與Pulsar都是優(yōu)秀的分布式消息流平臺,它們都提供了以下基礎(chǔ)功能:
(1) 消息系統(tǒng):Kafka與Pulsar都可以實現(xiàn)基于發(fā)布/訂閱模式的消息系統(tǒng),消息系統(tǒng)可以實現(xiàn)由消息驅(qū)動的程序—生產(chǎn)者負責產(chǎn)生并發(fā)送消息到消息系統(tǒng),消息系統(tǒng)將消息投遞給消費者,消費者收到消息后,執(zhí)行自己的邏輯。
這種消息驅(qū)動機制具有以下優(yōu)點:
(2) 存儲系統(tǒng):Kafka與Pulsar可以存儲大量數(shù)據(jù),并且客戶端控制自己讀取數(shù)據(jù)的位置,所以它們也可以作為存儲系統(tǒng),存儲大量歷史數(shù)據(jù)。
(3) 實時流數(shù)據(jù)管道:Kafka與Pulsar可以構(gòu)建實時流數(shù)據(jù)管道,流數(shù)據(jù)管道從MySQL、MongoDB等數(shù)據(jù)源加載數(shù)據(jù)到Kafka與Pulsar中,其他系統(tǒng)或應用就可以穩(wěn)定地從Kafka與Pulsar中獲取數(shù)據(jù),而不需要再與MySQL等數(shù)據(jù)源對接。為此,Kafka提供了Kafka Connect模塊,Pulsar提供了Pulsar IO模塊,它們都可以構(gòu)建實時流數(shù)據(jù)管道。
(4) 流計算應用:流計算應用不斷地從Kafka與Pulsar中獲取流數(shù)據(jù),并對數(shù)據(jù)進行處理,最后將處理結(jié)果輸出到Kafka與Pulsar中(或其他系統(tǒng))。流計算應用通常需要根據(jù)業(yè)務需求對流數(shù)據(jù)進行復雜的數(shù)據(jù)變換,如流數(shù)據(jù)聚合或者join等。為此,Kafka提供了Kafka Streams模塊,Pulsar提供了Pulsar Functions模塊,它們都可以實現(xiàn)流計算應用。另外,Kafka與Pulsar也可以與流行的Spark、Flink等分布式計算引擎結(jié)合,構(gòu)建實時流應用,實時處理大規(guī)模數(shù)據(jù)。
Kafka與Pulsar雖然提供的基礎(chǔ)功能類似,但它們的設(shè)計、架構(gòu)、實現(xiàn)并不相同,本書將深入分析Kafka與Pulsar如何實現(xiàn)一個分布式、高擴展、高吞吐、低延遲的消息流平臺。另外,本書也會介紹Kafka與Pulsar中連接器、流計算引擎等功能的應用實踐。
將Kafka與Pulsar都視為一個簡單的消息系統(tǒng),消息流轉(zhuǎn)流程如下圖所示。
圖中展示了消息系統(tǒng)中的4個基本概念。它們在Kafka與Pulsar中都存在,并且含義相同。
下面結(jié)合一個例子說明上述概念。假如存在一個用戶服務,該用戶服務創(chuàng)建了一個主題“userTopic”,每當有新用戶注冊時,用戶服務都會將一個消息發(fā)送到該主題中,消息內(nèi)容為“新用戶注冊”。當前有兩個服務訂閱了該主題的消息:權(quán)益服務和權(quán)限服務。權(quán)益服務收到消息后,負責給新用戶創(chuàng)建權(quán)益。權(quán)限服務收到消息后,負責給新用戶分配權(quán)限。該例子中的消息即用戶服務發(fā)送的數(shù)據(jù)實體,生產(chǎn)者是用戶服務。消費者是權(quán)益服務與權(quán)限服務。ka的基礎(chǔ)概念
(1) Kafka消費組:Kafka將多個消費者劃分到一個邏輯分組中,該分組即一個消費組。這個概念比較重要,結(jié)合上面的例子進行說明,在Kafka中,權(quán)益服務所有的消費者都可以加入一個權(quán)益消費組rightsGroup,而權(quán)限服務所有的消費者都可以加入一個權(quán)限消費組guthorityGroup。不同消費者之間消費消息互不干預。
(2) Broker:Kafka服務節(jié)點,可以將Broker理解為一個Kafka的服務節(jié)點或者服務進程(下面將其統(tǒng)稱為Broker節(jié)點),多個Broker節(jié)點可以組成一個Broker集群。
(3) 分區(qū)Partition:Kafka定義了分區(qū)的概念,一個主題由一個或多個分區(qū)組成,Kafka將一個主題的消息劃分到不同的分區(qū),并將不同分區(qū)存儲到不同的Broker,從而實現(xiàn)分布式存儲(典型的數(shù)據(jù)分片思想),每個分區(qū)都有對應的下標,下標從0開始。
(4) 副本Replica:Kafka中每個分區(qū)都有一個或多個副本,其中有1個leader副本,0個或多個follow副本,每個副本都保存了該分區(qū)全部的內(nèi)容。Kafka會將一個分區(qū)的不同副本保存到不同的Broker節(jié)點中,以保證數(shù)據(jù)的安全。本書后面會詳細分析Kafka副本同步機制。
(5) AR(Assigned Replicas):分區(qū)的副本列表,即一個分區(qū)所有副本所在Broker的列表。
(6) ISR:分區(qū)中所有與leader副本保持一定程度同步(即不能落后太多)的副本會組成ISR(In-Sync Replicas)集合。ISR集合中包括leader副本,可以將其理解為已同步副本(不一定完全同步,但不會落后太多)。
(7) ACK機制:ACK(消息確認)機制是消息系統(tǒng)中的一個很重要的機制,消息系統(tǒng)ACK機制與HTTP的ACK機制非常類似。消息系統(tǒng)ACK機制可以分為兩部分:
在Kafka中,每個消息都存在一個偏移量offset,如果將一個Kafka主題理解為一個簡單的消息數(shù)組,那么可以將消息偏移量理解為該消息在該數(shù)組中的索引。消費者會將最新消費成功的消息的下一個偏移量發(fā)送給Broker(代表該偏移量前面的消息都已經(jīng)消費成功),Broker會存儲這些偏移量,以記錄消費者的最新消費位置。為了方便描述,本書后面將消費者提交ACK信息中的偏移量稱為ACK偏移量。
另外,Kafka與Pulsar都使用ZooKeeper存儲元數(shù)據(jù),完成分布式協(xié)作等操作,ZooKeeper是一種分布式協(xié)作服務,專注于協(xié)作多個分布式進程之間的活動,可以幫助開發(fā)人員專注于應用程序的核心邏輯,而不必擔心應用程序的分布式特性。
下圖展示了Kafka集群的基礎(chǔ)架構(gòu):
(1) Pulsar訂閱組:Pulsar可以將多個消費者綁定到一個訂閱組中,類似于Kafka的消費組。同樣使用前面“用戶服務”的例子進行說明,在Pulsar中,權(quán)益服務所有的消費者都可以綁定一個權(quán)益訂閱組rightsSubscription,而權(quán)限服務所有的消費者都可以綁定一個權(quán)限訂閱組guthoritySubscription,不同訂閱組之間消費消息互不干預。
(2) 非分區(qū)主題、分區(qū)主題:Kafka中每個分區(qū)都與一個Broker綁定,而Pulsar中每個主題都與一個Broker綁定,某主題的消息固定發(fā)送給相應的Broker節(jié)點。而Pulsar中也有“分區(qū)主題”的概念,分區(qū)主題由一組非分區(qū)的內(nèi)部主題組成(下面將Pulsar中組成分區(qū)主題的非分區(qū)內(nèi)部主題簡稱為內(nèi)部主題),每一個內(nèi)部主題都與一個Broker綁定,這樣一個分區(qū)主題可以將消息發(fā)送到多個Broker,避免Pulsar單個主題的性能受限于單個Broker節(jié)點。
(3) Broker:Pulsar集群中的服務節(jié)點。需要注意,Pulsar由于采用計算、存儲分離的架構(gòu),因此Pulsar Broker節(jié)點只負責計算,并不負責存儲,Pulsar Broker節(jié)點會完成數(shù)據(jù)檢驗、負載均衡等工作,并將消息轉(zhuǎn)發(fā)給Bookie節(jié)點。
(4) Bookie:Pulsar利用BookKeeper服務實現(xiàn)存儲功能,BookKeeper中的節(jié)點被稱為Bookie節(jié)點。BookKeeper框架是一個分布式日志存儲服務框架,本書后面會詳細分析它。Pulsar中的Bookie節(jié)點負責完成消息存儲工作。
(5) Ledger:BookKeeper的數(shù)據(jù)集合,生產(chǎn)者會將數(shù)據(jù)寫入Ledger,而消費者從Ledger中讀取數(shù)據(jù)。為了數(shù)據(jù)安全,BookKeeper會將一個Ledger的數(shù)據(jù)存儲到多個Bookie節(jié)點中,實現(xiàn)數(shù)據(jù)備份。
(6) Entry:Ledger中的數(shù)據(jù)單元,Ledger中的每個數(shù)據(jù)都是一個Entry。可以將Ledger理解為一個賬本,Entry則是賬本中的一個條目。
(7) 租戶、命名空間:Pulsar定義了租戶、命名空間的概念,Pulsar是一個多租戶系統(tǒng),它給不同的租戶分配不同的資源,并保證不同租戶之間的數(shù)據(jù)相互隔離,互不干預,這樣可以支持多團隊、多用戶同時使用一個Pulsar服務。每個租戶還可以創(chuàng)建多個命名空間,命名空間為主題的邏輯分組。可以將Pulsar理解為一個大房子,每個租戶是房子里的一個房間,并且這個房間的空間劃分為不同的區(qū)域(命名空間),不同區(qū)域存放不同的物件。例如,用戶服務可以創(chuàng)建一個租戶“user”,存儲用戶服務的消息。該租戶可以按自己的業(yè)務場景,創(chuàng)建多個命名空間,存放不同的主題,如下圖所示。
(8) Cluster集群:Pulsar為集群定義了一個Cluster概念,每個Pulsar Broker節(jié)點都運行在一個Cluster集群下,不同的Cluster集群之間可以相互復制數(shù)據(jù),從而實現(xiàn)跨地域復制。
(9) ACK機制:與Kafka類似,Pulsar同樣需要完成“Broker存儲消息后返回成功響應給生產(chǎn)者”“消費者成功處理消息后發(fā)送ACK給Broker”。Pulsar中的每個消息都有一個消息Id,Pulsar消費者會將消費成功的消息Id作為ACK請求內(nèi)容發(fā)送給Broker。
下圖展示了Pulsar集群的基礎(chǔ)架構(gòu)。
? ?

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