新一代MQ apache pulsar的架構(gòu)與核心概念

Pulsar基本架構(gòu)

  • Pulsar采用存儲(chǔ)計(jì)算分離的架構(gòu),pulsar使用了bookkeeper做消息的存儲(chǔ),bookkeeper保證了消息存儲(chǔ)的可靠性和高效性,bookkeeper為pulsar提供了存儲(chǔ)的擴(kuò)展能力
  • Pulsar使用zk做元數(shù)據(jù)存儲(chǔ)
  • 多租戶,pulsar最初的設(shè)計(jì)就是支持多租戶的
  • 命名空間:一個(gè)租戶可以有多個(gè)命名空間,一個(gè)topic屬于一個(gè)命名空間,pulsar中的配置都是以命名空間為單位配置的
image
  • Pulsar的broker用于處理消息的讀寫(xiě),broker中會(huì)有消息的本地緩存,因?yàn)槎鄶?shù)場(chǎng)景下,消息被寫(xiě)入后會(huì)立刻被消費(fèi),因此broker中持有的新消息的緩存能非常有效的提高性能和MQ的整體吞吐
image

相比kafka、rocketmq等MQ,pulsar基于bookkeeper的存儲(chǔ)計(jì)算分離架構(gòu),使得pulsar的消息存儲(chǔ)可以獨(dú)立于broker而擴(kuò)展。

ACK

當(dāng)一個(gè)消息被消費(fèi)者消費(fèi)后,pulsar會(huì)給broker發(fā)送一個(gè)ack,pulsar有三種消息的ack模式:

  • One by One:依次確認(rèn)每一個(gè)消息,保證確認(rèn)的順序
  • Cumulative:累積的方式確認(rèn),只需要確認(rèn)一條消息,用于表示這條消息以及之前的消息都已確認(rèn)
  • 每個(gè)消息獨(dú)立確認(rèn):shared消費(fèi)模式下可獨(dú)立確認(rèn)每一個(gè)消息

消息訂閱

Pulsar支持exclusive、shared和failover三種消息訂閱模式,這三種模式的示意圖如下:

image

Exclusive模式(獨(dú)占模式)是pulsar默認(rèn)的消息訂閱模式,在這種模式下,中能有一個(gè)consumer消息消息,一個(gè)訂閱關(guān)系中只能有一臺(tái)機(jī)器消費(fèi)每個(gè)topic,如果有多于一個(gè)consumer消費(fèi)此topic則會(huì)出錯(cuò),消費(fèi)示意圖如下:

image

Failover模式下,一個(gè)topic也是只有單個(gè)消費(fèi)消費(fèi)一個(gè)訂閱關(guān)系的消息,與exclusive模式不同之處在于,failover模式下,每個(gè)消費(fèi)者會(huì)被排序,當(dāng)前面的消費(fèi)者無(wú)法連接上broker后,消息會(huì)由下一個(gè)消費(fèi)者消費(fèi),消費(fèi)示意圖如下:

image

Shared模式(共享模式)下,消息可被多個(gè)consumer同時(shí)消費(fèi),這種模式下,無(wú)法保證消息的順序,并且無(wú)法使用one by one和cumulative的ack模式,消息通過(guò)roundrobin的方式投遞到每一個(gè)消費(fèi)者,消費(fèi)示意圖如下:

image

key_shared模式是shared模式的一種,不同的是它按key對(duì)消息做投遞,相同的key的消息會(huì)被投遞到同一個(gè)消費(fèi)者上,消費(fèi)示意圖如下:

image

消息分區(qū)

單個(gè)topic的消息一般是由單個(gè)broker處理,為了提高topic的消息處理能力,pulsar提供了partitioned topic的支持,與kafka和rocketmq一樣,每個(gè)partition由不同的broker處理,在消費(fèi)時(shí),單個(gè)partition可選擇exclusive, failover和shared模式

Partitioned topic實(shí)際上是由n(partition的數(shù)量)個(gè)內(nèi)部的topic組成的,每個(gè)內(nèi)部的topic由一個(gè)broker處理,每個(gè)broker可處理多個(gè)topic,當(dāng)消息發(fā)送到broker前,在producer端會(huì)通過(guò)routing mode將消息路由到某一個(gè)partition上,消息的生產(chǎn)與消費(fèi)示意圖如下:

image

消息的存儲(chǔ)與過(guò)期

默認(rèn)情況上,當(dāng)broker會(huì)立刻刪除所有收到了ack的消息,沒(méi)有被ack的消息會(huì)持久化存儲(chǔ),但是我們可以修改pulsar的行為,pulsar允許我們存儲(chǔ)已經(jīng)收到ack了的消息,也可以給未收到ack的消息設(shè)置過(guò)期時(shí)間(TTL)

消息去重

Pulsar支持在broker端對(duì)消息做去重,當(dāng)打開(kāi)消息去重后,重發(fā)的消息(重試等產(chǎn)生的)不會(huì)被重新存儲(chǔ),這個(gè)特性使得pulsar對(duì)流式計(jì)算引擎(例如flink)更加友好,流式計(jì)算引擎更容易實(shí)現(xiàn)exactly-once語(yǔ)義的計(jì)算任務(wù),消息去重的存儲(chǔ)示意圖如下:

image

消息存儲(chǔ)

Pulsar使用apache bookkeeper做消息存儲(chǔ),bookkeeper介紹:認(rèn)識(shí)BookKeeper

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容