分布式通信:發布訂閱
什么是發布訂閱?
遠程呼叫的核心是在網路服務層封裝了通信協議、序列化、傳輸等操作,讓用戶呼叫遠程服務如同進行本地呼叫一樣,
這種通信方式雖然也是設定成異步的,但是因為行程之間是直接互動的,所以當行程比較多時,會導致行程維護通信的復雜度非常高,且一個行程通信介面改變,與其通信的行程都會受到影響,
為了解決這個問題,我們需要設計專門的異步通信模式,包括訊息發布訂閱和訊息佇列兩種方式,
發布訂閱的三要素:
- 生產者,負責產生資料放到訊息中心,
- 消費者,向訊息中心訂閱自己感興趣的訊息,
- 訊息中心,當發布者推送資料到訊息中心后,訊息中心根據消費者訂閱情況將資料推送給對應的訂閱者,
兩種訊息系統模式
訊息系統包括兩種典型模式:
- 點對點模式,生產者將訊息發送到訊息中心,然后消費者從訊息中心取出對應的訊息進行消費,訊息被消費后,訊息中心不再存盤該訊息,這樣其他消費者無法再消費該訊息,點對點模式雖然支持多個消費者,但是一個訊息只能被一個消費者消費,不允許重復消費,
- 發布訂閱模式,生產者可以發送訊息到訊息中心,而訊息中心通常以主題(Topic)進行劃分,每條訊息都會有相應的主題,訊息會被存盤到自己所屬的主題中,訂閱該主題的所有消費者都可以獲得該訊息進行消費,
點對點模式中的一個訊息,只能被一個消費者消費,發布訂閱模式中的一個訊息,可以被多個消費者消費,
發布訂閱模式的關鍵特征:
- 實作了系統解耦,易于維護,
- 實作了異步執行,避免高負載,
Kafka發布訂閱原理
Kafka是一種典型的發布訂閱訊息系統,它的架構包括三部分:
- 生產者(Producer),負責發布訊息到訊息中心,
- 消費者(Consumer),向訊息中心訂閱自己感興趣的訊息,獲得資料后進行資料處理,
- 訊息中心(Broker),負責存盤生產者發布的訊息和管理消費者訂閱資訊,根據消費者訂閱資訊,將訊息推送給消費者,
Kafka的架構如如下所示,

上圖中還包括ZooKeeper集群,它用來協調和管理Broker和Consumer,實作Broker和Consumer的解耦,并未系統提高可靠性保證,Consumer和Broker啟動時都會向ZooKeeper進行注冊,由ZooKeeper進行統一管理和協調,
ZooKeeper會存盤一些元資料資訊,比如對于Broker,會存盤主題對應哪些磁區,每個磁區的存盤位置等,對于Consumer,會存盤xiaofeizu中包含哪些Consumer,每個Consumer回負責消費哪些磁區等,
Kafka Broker
為了解決訊息存盤的負載均衡和系統可靠性,Kafka引入了主題和磁區的概念,
主題是一個邏輯概念,指訊息型別或者資料型別,
磁區指一個主題的內容可以被劃分成多個集合,分布在不同的Broker上,不同的Broker在不同的節點上,
磁區設計帶來的好處:
- 實作負載均衡,
- 實作訊息備份(我們可以設定Replicates),
Kafka Consumer
Kafka中的消費組,指的是多個消費者的一個集合,一個消費組中的消費者共同消費主題訊息,并且主題中每個訊息只可以由消費組中的某一個消費者進行消費,
引入消費組可以解決單個消費者消費訊息效率過低的問題,
觀察者模式和發布訂閱模式
觀察者負責監控被觀察者的狀態變更,如果被觀察者的狀態發生改變,那么觀察者根據狀態的變更執行相關操作,觀察者模式定義了被觀察者和觀察者的直接互動或者通信關系,
發布訂閱模式中存在發布者、訂閱者和訊息中心,訂閱者需要向訊息中心指定自己對哪些資料感興趣,發布者推送的資料放入訊息中心后,訊息中心根據訂閱者訂閱資訊推送資料,發布者與訂閱者之間引入了訊息中心,實作的是間接通信,
觀察者模式采用了直接通信,觀察者與被觀察者通信時延低一些,但它們的依賴關系比較強,不管是被觀察者還是觀察者的邏輯或介面有更改,另外一個都會受到影響,而發布者和訂閱者模式采用間接通信,引入訊息中心,相對比較厚重,且通信時延高一些,但實作了訂閱者和發布者的解耦,
發布訂閱中的訊息傳遞模式
發布訂閱中的訊息傳遞有兩種模式:
- 拉模式:消費者主動去拉取訊息,
- 推模式:訊息中心推送訊息給消費者,
推模式中,訊息中心需要考慮消費者的消費能力,不能把消費者壓垮了,但從訊息中心的角度看,這樣可以控制訊息的消費速度,調控積壓訊息,
拉模式中,消費者自己控制訊息消費速度,但有可能會導致訊息中心中訊息擠壓,會有訊息丟失或者訊息中心不可用的風險,
作者:李潘 出處:http://wing011203.cnblogs.com/ 本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544569.html
標籤:其他
上一篇:02Python輸入輸出
下一篇:關于MRP運行的BADIs
