一文簡單理解pulsar和優(yōu)于kafka的兩個痛點(diǎn)

broker負(fù)責(zé)處理和負(fù)載均衡從producer接收到的消息。 broker也負(fù)責(zé)分發(fā)消息給consumer。 broker也負(fù)責(zé)和pulsar的配置存儲同步,以應(yīng)對多變的協(xié)調(diào)任務(wù)。 broker負(fù)責(zé)將消息存儲到BookKeeper集群中。 broker也依賴zookeeper集群,負(fù)責(zé)元數(shù)據(jù)存儲,集群配置,協(xié)調(diào)任務(wù)。 broker是無狀態(tài)的,跟kafka的broker不同之處就是broker本書不會負(fù)責(zé)數(shù)據(jù)存儲,數(shù)據(jù)存儲是交給了BookKeeper。 等等
消息持久化投遞-衍生出來的目的就是為了保證那些未確認(rèn)送達(dá)的消息被再次消費(fèi)處理的需求。
能讓Pulsar創(chuàng)建多個獨(dú)立的日志,這種獨(dú)立的日志就是ledgers. 隨著時間的推移,Pulsar會為Topic創(chuàng)建多個ledgers。
為按條目復(fù)制的順序數(shù)據(jù)提供了非常高效的存儲。
保證了多系統(tǒng)掛掉時ledgers的讀取一致性。
提供不同的Bookies之間均勻的IO分布的特性。
容量和吞吐量都能水平擴(kuò)展。并且容量可以通過在集群內(nèi)添加更多的Bookies立刻提升。
Bookies被設(shè)計(jì)成可以承載數(shù)千的并發(fā)讀寫的ledgers。使用多個磁盤設(shè)備,一個用于日志,另一個用于一般存儲,這樣Bookies可以將讀操作的影響和對于寫操作的延遲分隔開。
除了消息數(shù)據(jù),cursors也會被持久化入BookKeeper。Cursors是消費(fèi)端訂閱消費(fèi)的位置。BookKeeper讓Pulsar可以用一種可擴(kuò)展的方式存儲消費(fèi)位置。

著重介紹下ledger
Pulsar Broker可以創(chuàng)建ledeger,添加內(nèi)容到ledger和關(guān)閉ledger。
當(dāng)一個ledger被關(guān)閉后,除非明確的要寫數(shù)據(jù)或者是因?yàn)閷懭肫鲯斓魧?dǎo)致ledger關(guān)閉,這個ledger只會以只讀模式打開。
最后,當(dāng)ledger中的條目不再有用的時候,整個legder可以被刪除(ledger分布是跨Bookies的)。
讀一致性。由于ledger只能被一個進(jìn)程(也就是寫入器進(jìn)程)寫入,這樣這個進(jìn)程就不會在寫入時不會有沖突,從而保證了寫入的高效。在一次故障之后,ledger會啟動一個恢復(fù)進(jìn)程來確定ledger的最終狀態(tài)并確認(rèn)提交到日志的是哪一個條。這就保證了所有l(wèi)edger讀進(jìn)程讀取到相同的內(nèi)容。
Managed ledgers 。
由于BookKeeper提供了單一的日志抽象,在ledger的基礎(chǔ)上pulsar提供了一個叫做managed ledger的庫,用于表示單個topic的存儲層。managed ledger即消息流的抽象,有一個寫入器進(jìn)程不斷在流結(jié)尾添加消息,并且有多個cursors消費(fèi)這個流,每個cursor有自己的消費(fèi)位置。
一個managed ledger在內(nèi)部用多個BookKeeper ledgers保存數(shù)據(jù),這么做有兩個原因:
在故障之后,原有的某個ledger不難再寫了,需要創(chuàng)建一個新的。
ledger在所有cursors消費(fèi)完它所保存的消息之后就可以被刪除了,這樣可以實(shí)現(xiàn)ledgers的定期翻滾從頭寫。
配置和仲裁存儲:
存儲租戶,命名域和其他需要全局一致的配置項(xiàng)。
每個集群有自己獨(dú)立的zookeeper保存集群內(nèi)部的配置和協(xié)調(diào)信息,例如歸屬信息,broker負(fù)載報(bào)告,BookKeeper ledger信息(這個是BookKeeper自身的依賴)等等。
Pulsar 通過“訂閱”,抽象出了統(tǒng)一的: producer-topic-subscription-consumer 消費(fèi)模型。Pulsar 的消息模型既支持隊(duì)列模型,也支持流模型。
生產(chǎn)者沒啥好介紹的,重點(diǎn)介紹一下,消費(fèi)者的訂閱模式。pulsar也有topic的概念,每個topic對應(yīng)著BookKeeper中的一個分布式日志。生產(chǎn)者發(fā)送消息到指定topic,然后bookKeeper會講消息存儲到多個節(jié)點(diǎn)上。topic的消息可以被反復(fù)訂閱。
跟kafka一樣,一個topic可以被多個消費(fèi)者組消費(fèi),不同的是pulsar的每個消費(fèi)者組可以擁有自己不同的消費(fèi)方式:獨(dú)占(Exclusive),故障切換(Failover)或共享(Share)。
獨(dú)占訂閱(Stream 流模型)
一個消費(fèi)者組
有且僅有一個消費(fèi)者消費(fèi)topic的消息。任何新加消費(fèi)者都不被允許。獨(dú)占模式消費(fèi)者體現(xiàn)互斥性。

故障切換(Stream 流模型)
多個消費(fèi)者可以添加到同一個消費(fèi)者組訂閱中,但是一個訂閱中的所有消費(fèi)者,只能有一個活躍的消費(fèi)者作為主消費(fèi)者。其他消費(fèi)者是備胎型消費(fèi)者。
順序性和安全性有點(diǎn)保證。

共享訂閱(Queue 隊(duì)列模型)
該模式同一個訂閱組可以按照需要掛在多個消費(fèi)者。topic中的所有消息以循環(huán)分發(fā)的形式發(fā)送給訂閱組內(nèi)的多個消費(fèi)者,一個消息僅傳遞給一個消費(fèi)者。
當(dāng)消費(fèi)者斷開連接時,所有傳遞給它但是未被確認(rèn)(ack)的消息將被重新分配和組織,以便發(fā)送給該訂閱上剩余的剩余消費(fèi)者。

無順序性。
kafka集群容量受限于做弱的機(jī)器最小的磁盤,當(dāng)然這種不均衡很少發(fā)生,企業(yè)中kafka的機(jī)器配置往往最硬的。
kafka擴(kuò)容感覺管理過kafka的朋友都應(yīng)該體會過其復(fù)雜,擴(kuò)容難點(diǎn):
