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中的配置都是以命名空間為單位配置的
- Pulsar的broker用于處理消息的讀寫禁舷,broker中會(huì)有消息的本地緩存彪杉,因?yàn)槎鄶?shù)場(chǎng)景下,消息被寫入后會(huì)立刻被消費(fèi)榛了,因此broker中持有的新消息的緩存能非常有效的提高性能和MQ的整體吞吐
相比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三種消息訂閱模式,這三種模式的示意圖如下:
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)示意圖如下:
Failover模式下,一個(gè)topic也是只有單個(gè)消費(fèi)消費(fèi)一個(gè)訂閱關(guān)系的消息玉掸,與exclusive模式不同之處在于刃麸,failover模式下,每個(gè)消費(fèi)者會(huì)被排序司浪,當(dāng)前面的消費(fèi)者無法連接上broker后泊业,消息會(huì)由下一個(gè)消費(fèi)者消費(fèi),消費(fèi)示意圖如下:
Shared模式(共享模式)下啊易,消息可被多個(gè)consumer同時(shí)消費(fèi)吁伺,這種模式下,無法保證消息的順序租谈,并且無法使用one by one和cumulative的ack模式箱蝠,消息通過roundrobin的方式投遞到每一個(gè)消費(fèi)者,消費(fèi)示意圖如下:
key_shared模式是shared模式的一種垦垂,不同的是它按key對(duì)消息做投遞,相同的key的消息會(huì)被投遞到同一個(gè)消費(fèi)者上牙瓢,消費(fèi)示意圖如下:
消息分區(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ì)通過routing mode將消息路由到某一個(gè)partition上揭绑,消息的生產(chǎn)與消費(fèi)示意圖如下:
消息的存儲(chǔ)與過期
默認(rèn)情況上,當(dāng)broker會(huì)立刻刪除所有收到了ack的消息郎哭,沒有被ack的消息會(huì)持久化存儲(chǔ)他匪,但是我們可以修改pulsar的行為,pulsar允許我們存儲(chǔ)已經(jīng)收到ack了的消息夸研,也可以給未收到ack的消息設(shè)置過期時(shí)間(TTL)
消息去重
Pulsar支持在broker端對(duì)消息做去重邦蜜,當(dāng)打開消息去重后,重發(fā)的消息(重試等產(chǎn)生的)不會(huì)被重新存儲(chǔ)亥至,這個(gè)特性使得pulsar對(duì)流式計(jì)算引擎(例如flink)更加友好悼沈,流式計(jì)算引擎更容易實(shí)現(xiàn)exactly-once語義的計(jì)算任務(wù),消息去重的存儲(chǔ)示意圖如下:
消息存儲(chǔ)
Pulsar使用apache bookkeeper做消息存儲(chǔ)姐扮,bookkeeper介紹:認(rèn)識(shí)BookKeeper