您好,登錄后才能下訂單哦!
如何進(jìn)行下一代分布式消息隊列Apache Pulsar的分析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
Pulsar簡介
Apache Pulsar是一個企業(yè)級的分布式消息系統(tǒng),最初由Yahoo開發(fā)并在2016年開源,目前正在Apache基金會下孵化。Plusar已經(jīng)在Yahoo的生產(chǎn)環(huán)境使用了三年多,主要服務(wù)于Mail、Finance、Sports、 Flickr、 the Gemini Ads platform、 Sherpa以及Yahoo的KV存儲。
Pulsar之所以能夠稱為下一代消息隊列,主要是因為以下特性:
線性擴(kuò)展。能夠絲滑的擴(kuò)容到成百上千個節(jié)點(Kafka擴(kuò)容需要占用很多系統(tǒng)資源在節(jié)點間拷貝數(shù)據(jù),而Plusar完全不用)
高吞吐。已經(jīng)在Yahoo的生產(chǎn)環(huán)境中經(jīng)受了考驗,每秒數(shù)百萬消息
低延遲。在大規(guī)模的消息量下依然能夠保持低延遲(< 5ms)
持久化機(jī)制。Plusar的持久化機(jī)制構(gòu)建在Apache BookKeeper之上,提供了寫與讀之前的IO隔離
基于地理位置的復(fù)制。Plusar將多地域/可用區(qū)的復(fù)制作為首要特性支持。用戶只需配置好可用區(qū),消息就會被源源不斷的復(fù)制到其他可用區(qū)。當(dāng)某一個可用區(qū)掛掉或者發(fā)生網(wǎng)絡(luò)分區(qū),plusar會在之后不斷的重試。
部署方式的多樣化。既可以運行在裸機(jī),也支持目前例如Docker、K8S的一些容器化方案以及不同的云廠商,同時在本地開發(fā)時也只需要一行命令即可啟動整個環(huán)境。
Topic支持多種消費模式:exclusive、shared、failover
架構(gòu)概述
從最上層來看,一個Plusar單元由若干個集群組成,單元內(nèi)的集群可以互相之前復(fù)制數(shù)據(jù), plusar中通常有以下幾種組件:
Broker:負(fù)責(zé)處理Producer發(fā)來的消息并分發(fā)給消費者。通過一個全局的ZK集群來處理多種協(xié)作式任務(wù),例如說基于地理位置的復(fù)制。并將消息存儲到BookKeeper中,同時單個集群內(nèi)也需要有一套ZK集群,來存儲一些元數(shù)據(jù)。
BookKeeper集群: 內(nèi)部包含多個bookies,用于持久化消息。
ZooKeeper集
Broker
在Kafka和RocketMQ中,Broker負(fù)責(zé)消息數(shù)據(jù)的存儲以及consumer消費位移的存儲等,而Plusar中的broker和他們兩個有所不同,plusar中的broker是一個無狀態(tài)的節(jié)點,主要負(fù)責(zé)三件事情:
暴露REST接口用于執(zhí)行管理員的命令以及topic所有者的查詢等
一個用于節(jié)點間通訊的異步的TCP服務(wù)器,協(xié)議目前采用的是Google之前開源的Protocol Buffer
為了支持地域復(fù)制,broker會將自己 集群所在的消息發(fā)布到其他可用區(qū)。
消息會被先發(fā)布到BookKeeper中,然后會在Broker本地內(nèi)存中緩存一份,因此一般來說消息的讀取都會從從內(nèi)存中讀取,因此第一條中所說的查找topic所有者就是說,因為BookKeeper中的一個ledger只允許一個writer,因此我們可以調(diào)用rest接口獲取到某一個topic當(dāng)前的所有者。
BookKeeper
BookKeeper是一個可橫向擴(kuò)展的、錯誤容忍的、低延遲的分布式存儲服務(wù),BookKeeper中最基本的單位是記錄,實際上就一個字節(jié)數(shù)組,而記錄的數(shù)組稱之為ledger,BK會將記錄復(fù)制到多個bookies,存儲ledger的節(jié)點叫做bookies,從而獲得更高的可用性和錯誤容忍性。從設(shè)計階段BK就考慮到了各種故障,Bookies可以宕機(jī)、丟數(shù)據(jù)、臟數(shù)據(jù),但是主要整個集群中有足夠的Bookies服務(wù)的行為就是正確的。
在Pulsar中,每個分區(qū)topic是由若干個ledger組成的,而ledger是一個append-only的數(shù)據(jù)結(jié)構(gòu),只允許單個writer,ledger中的每條記錄會被復(fù)制到多個bookies中,一個ledger被關(guān)閉后(例如broker宕機(jī)了或者達(dá)到了一定的大小)就只支持讀取,而當(dāng)ledger中的數(shù)據(jù)不再需要的時候(例如所有的消費者都已經(jīng)消費了這個ledger中的消息)就會被刪除。
Bookkeeper的主要優(yōu)勢在于它可以保證在出現(xiàn)故障時在ledger的讀取一致性。因為ledger只能被同時被一個writer寫入,因為沒有競爭,BK可以更高效的實現(xiàn)寫入。在Broker宕機(jī)后重啟時,Plusar會啟動一個恢復(fù)的操作,從ZK中讀取最后一個寫入的Ledger并讀取最后一個已提交的記錄,然后所有的消費者也都被保證能看到同樣的內(nèi)容。
我們知道Kafka在0.8版本之前是將消費進(jìn)度存儲到ZK中的,但是ZK本質(zhì)上基于單個日志的中心服務(wù),簡單來講,ZK的性能不會隨著你增加更多的節(jié)點而線性增加,會只會相反減少,因為更多的節(jié)點意味著需要將日志同步到更多的節(jié)點,性能也會隨之下降,因此QPS也會受單機(jī)性能影響,因此0.8版本之后就將消費進(jìn)度存儲到了Kafka的Topic中,而RocketMQ最初的版本也類似,有幾種不同的實現(xiàn)例如ZK、數(shù)據(jù)庫等,目前版本采用的是存儲到本機(jī)文件系統(tǒng)中,而Plusar采用了和Kafka類似的思想,Plusar將消費進(jìn)度也存儲到了BK的ledger中。
元數(shù)據(jù)
Plusar中的元數(shù)據(jù)主要存儲到ZK中,例如不同可用區(qū)相關(guān)的配置會存在全局的ZK中,集群內(nèi)部的ZK用于存儲例如某個topic的數(shù)據(jù)寫入到了那些Ledger、Broker目前的一些埋點數(shù)據(jù)等等。
Plusar核心概念
Topic
發(fā)布訂閱系統(tǒng)中最核心的概念是topic,簡單來說,topic可以理解為一個管道,producer可以往這個管道丟消息,consumer可以從這個管道的另一端讀取消息,但是這里可以有多個consumer同時從這個管道讀取消息。
每個topic可以劃分為多個分區(qū),同一個topic下的不同分區(qū)所包含的消息都是不同的。每個消息在被添加到一個分區(qū)后都會分配一個唯一的offset,在同一個分區(qū)內(nèi)消息是有序的,因此客戶端可以根據(jù)比如說用戶ID進(jìn)行一個哈希取模從而使得整個用戶的消息都發(fā)往整個分區(qū),從而一定程度上避免race condition的問題。
通過分區(qū),將大量的消息分散到不同的節(jié)點處理從而獲得高吞吐。默認(rèn)情況下,plusar的topic都是非分區(qū)的,但是支持通過cli或者接口創(chuàng)建一定分區(qū)數(shù)目的topic。
默認(rèn)情況下Plusar會自動均衡Producer和Consumer,但有時候客戶端想要根據(jù)自己的業(yè)務(wù)規(guī)則也進(jìn)行路由,Plusar默認(rèn)支持以下幾種規(guī)則:單分區(qū)、輪詢、哈希、自定義(即自己實現(xiàn)相關(guān)接口來定制路由規(guī)則)
消費模式
消費決定了消息具體是如何被分發(fā)到消費者的,Plusar支持幾種不同的消費模式: exclusive、shared、failover。圖示如下:
Exclusive: 一個topic只能被一個消費者消費。Plusar默認(rèn)就是這個模式
Shared: 共享模式或者叫輪詢模式,多個消費者可以連接到同一個topic,消息被依次分發(fā)給消費者,當(dāng)一個消費者宕機(jī)或者主動斷開連接,那么發(fā)到那個消費者的還沒有ack的消息會得到重新調(diào)度分發(fā)給其他消費者。
Failover: 多個消費者可以連接同一個topic并按照字典序排序,第一個消費者會開始消費消息,稱之為master,當(dāng)master斷開連接,所有未ack和隊列中剩下的消息會分發(fā)給另一個消費者。
Plusar目前也支持另一種Reader接口,支持傳入一個消息ID,例如說Message.Earliest來從最早的消息開始消費。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。