1 消息消費(fèi)
目前的消息流式架構(gòu)中,消息用例被分為兩類:隊(duì)列和流
Apache Pulsar將隊(duì)列和流統(tǒng)一為消息傳遞模型:producer-topic-subscription-consumer。主題(分區(qū))是用于發(fā)送消息的命名通道。每個(gè)主題分區(qū)都由存儲(chǔ)在Apache BookKeeper中的分布式日志支持。發(fā)布者發(fā)布的每條消息僅存儲(chǔ)在主題分區(qū)上一次,復(fù)制以存儲(chǔ)在多個(gè)bookies(BookKeeper服務(wù)器)上,并且可以根據(jù)消費(fèi)者的需要多次消費(fèi)使用。主題是消費(fèi)真相的來(lái)源,盡管消息僅在主題分區(qū)上存儲(chǔ)一次,但是可以有不同的方式來(lái)消費(fèi)這些消息。消費(fèi)者被組合在一起以消費(fèi)消息。每組消費(fèi)者都是對(duì)主題的訂閱,每個(gè)消費(fèi)者群體都可以擁有自己的消費(fèi)方式 - 獨(dú)占,共享或故障轉(zhuǎn)移 - 這些消費(fèi)群體可能會(huì)有所不同。這在一個(gè)模型和API中結(jié)合了隊(duì)列和流,它的設(shè)計(jì)和實(shí)現(xiàn)目標(biāo)是不影響性能和引入成本開銷,同時(shí)還為用戶提供了很多靈活性,以最適合當(dāng)前用例的方式使用消息。
-
獨(dú)占訂閱(流)
獨(dú)占訂閱
在任何給定時(shí)間內(nèi),消費(fèi)者中只有一個(gè)消費(fèi)者消費(fèi)主題分區(qū)。上圖說(shuō)明了獨(dú)占訂閱的示例。有一個(gè)有訂閱A的活動(dòng)消費(fèi)者A-0消息m0到m4按順序傳送并由A-0消費(fèi)。如果另一個(gè)消費(fèi)者A-1想要附加到訂閱A,則不允許這樣做。
-
故障轉(zhuǎn)移訂閱(流)
故障轉(zhuǎn)移訂閱
使用故障轉(zhuǎn)移訂閱,多個(gè)消費(fèi)者可以附加到同一訂閱。但是,對(duì)于給定的主題分區(qū),將選擇一個(gè)使用者作為該主題分區(qū)的主使用者,其他消費(fèi)者將被指定為故障轉(zhuǎn)移消費(fèi)者,當(dāng)主消費(fèi)者斷開連接時(shí),分區(qū)將被重新分配給其中一個(gè)故障轉(zhuǎn)移消費(fèi)者,而新分配的消費(fèi)者將成為新的主消費(fèi)者。發(fā)生這種情況時(shí),所有未確認(rèn)的消息都將傳遞給新的主消費(fèi)者,這類似于Apache Kafka中的使用者分區(qū)重新平衡。上圖說(shuō)明了故障轉(zhuǎn)移訂閱,消費(fèi)者B-0和B-1訂閱B消費(fèi)消息.B-0是主消費(fèi)者并接收所有消息,B-1是故障轉(zhuǎn)移消費(fèi)者,如果消費(fèi)者B-0出現(xiàn)故障,將接管消費(fèi)。
-
共享訂閱(隊(duì)列)
共享訂閱
使用共享訂閱,可以將所有的消費(fèi)者附加到同一訂閱。消息以多個(gè)消費(fèi)者的循環(huán)嘗試分發(fā)形式傳遞,并且任何給定的消息僅傳遞給一個(gè)消費(fèi)者。當(dāng)消費(fèi)者斷??開連接時(shí),所有傳遞給它并且未被確認(rèn)的消息將被重新安排,以便發(fā)送給該訂閱上剩余的消費(fèi)者。上圖說(shuō)明了共享訂閱。消費(fèi)者C-1,C-2和C-3都在同一主題分區(qū)上消費(fèi)消息。每個(gè)消費(fèi)者接收大約1/3的消息。如果您想提高消費(fèi)率,您可以在不增加分區(qū)數(shù)量的情況下為更多的消費(fèi)者提供相同的訂閱(盡可能多的消費(fèi)者)。
總結(jié):
獨(dú)占和故障轉(zhuǎn)移訂閱僅允許每個(gè)訂閱每個(gè)主題分區(qū)僅有一個(gè)消費(fèi)者。它們按分區(qū)順序使用消息。它們最適用于需要嚴(yán)格排序的流用例。共享訂閱允許每個(gè)主題分區(qū)有多個(gè)消費(fèi)者,同一訂閱中的每個(gè)消費(fèi)者僅接收發(fā)布到主題分區(qū)的一部分消息。共享訂閱最適用于不需要排序的并且可以擴(kuò)展超出分區(qū)數(shù)量的使用者數(shù)量的隊(duì)列用例。
2 擴(kuò)展
Pulsar中的subscription(訂閱)實(shí)際上與Apache Kafka中的消費(fèi)者群體相同。創(chuàng)建訂閱具有高度可擴(kuò)展性且非常低廉的??梢愿鶕?jù)需要?jiǎng)?chuàng)建任意數(shù)量的訂閱,對(duì)同一主題的不同訂閱不必具有相同的訂閱類型。這意味著可以在同一主題上有20個(gè)消費(fèi)者的故障轉(zhuǎn)移訂閱或有20個(gè)消費(fèi)者的共享訂閱。如果共享訂閱處理事件的速度很慢,則可以在不更改分區(qū)數(shù)的情況下向共享訂閱添加更多消費(fèi)者。下圖描繪了一個(gè)包含3個(gè)訂閱A,B和C的主題,并說(shuō)明了消息如何從生產(chǎn)者流向消費(fèi)者。



