MQ系列:訊息中介軟體執行原理
1 關於訊息中介軟體
1.1 什麼是訊息中介軟體?
訊息中介軟體是指在分散式系統中完成訊息的傳送和接收的基礎軟體。
訊息中介軟體也可以稱訊息佇列(Message Queue / MQ),用高效可靠的訊息傳遞機制進行與平臺無關的資料交流,並基於資料通訊來進行分散式系統的整合。通過提供訊息傳遞和訊息佇列模型,可以在分散式環境下擴充套件程序的通訊。
簡而言之,網際網路場景中經常使用訊息中介軟體進行訊息路由、訂閱釋出、非同步處理等操作,來緩解系統的壓力。
1.2 它解決了我們哪些痛點?
1、解耦: 比如說系統A會交給系統B去處理一些事情,但是A不想直接跟B有關聯,避免耦合太強,就可以通過在A,B中間加入訊息佇列,A將要任務的事情交給訊息佇列 ,B訂閱訊息佇列來執行任務。
這種場景很常見,比如A是訂單系統,B是庫存系統,可以通過訊息佇列把削減庫存的工作交予B系統去處理。如果A系統同時想讓B、C、D...多個系統處理問題的時候,這種優勢就更加明顯了。
2、有序性: 先進先出原理,先來先處理,比如一個系統處理某件事需要很長一段時間,但是在處理這件事情時候,有其他人也發出了請求,可以把請求放在訊息隊裡,一個一個來處理。
對資料的順序性和一致性有強需求的業務,比如同一張銀行卡同時被多個入口使用,需要保證入賬出賬的順序性,避免出現數據不一致。
3、訊息路由: 按照不同的規則,將佇列中訊息傳送到不同的其他佇列中
通過訊息佇列將不同染色的請求傳送到不同的服務去操作。這樣達成了流量按照業務拆分的目的。
4、非同步處理: 處理一項任務的時候,有3個步驟A、B、C,需要先完成A操作, 然後做B、C 操作。任務執行成功與否強依賴A的結果,但不依賴B、C 的結果。
如果我們使用序列的執行方式,那處理任務的週期就會變長,系統的整體吞吐能力也會降低(在同一個系統中做非同步其實也是比較大的開銷),所以使用訊息佇列是比較好的辦法。
登入操作就是典型的場景:A:執行登入並得到結果、B:記錄登入日誌、C:將使用者資訊和Token寫入快取。 執行完A就可以從登入頁跳到首頁了,B、C讓服務慢慢去消化,不阻塞當前操作。
5、削峰: 將峰值期間的操作削減,比如A同學的整個操作流程包含12個步驟,後續的11個步驟是不需要強關注結果的資料,可以放在訊息佇列中。
2 訊息中介軟體的執行原理
2.1 訊息中介軟體的組成
Broker: 訊息伺服器,作為Server提供訊息核心服務
Producer: 訊息生產者,業務的發起方,負責生產訊息傳輸給broker,
Consumer: 訊息消費者,業務的處理方,負責從broker獲取訊息並進行業務邏輯處理
Topic: 主題,釋出/訂閱模式下的訊息統一彙集地,不同生產者向topic傳送訊息,由MQ伺服器分發到不同的訂閱者,實現訊息的廣播
Queue: 佇列,PTP模式下,特定生產者向特定queue傳送訊息,消費者訂閱特定的queue完成指定訊息的接收
Message: 訊息體,根據不同通訊協議定義的固定格式進行編碼的資料包,來封裝業務資料,實現訊息的傳輸
這邊以kafka為例子,這是典型的叢集模式,Kafka通過Zookeeper管理叢集配置,選舉leader,以及在Consumer Group發生變化時進行rebalance。Producer使用push模式將訊息釋出到broker,Consumer使用pull模式從broker訂閱並消費訊息。
- producer 負責生產訊息
- consumer 負責消費訊息
- broker 訊息伺服器,提供訊息核心的處理工作
- zookeeper 用於生產者和消費者的註冊與發現
2.2 訊息中介軟體的模式分類
2.2.1 PTP點對點
使用queue作為通訊載體,訊息生產者生產訊息傳送到queue中,然後訊息消費者從queue中取出並且消費訊息。
訊息被消費以後,queue中不再儲存,所以訊息消費者不可能消費到已經被消費的訊息。 Queue支援存在多個消費者,但是對一個訊息而言,只會有一個消費者可以消費。
點對點模式包含三個角色:
- 訊息佇列(Queue)
- 傳送者(Sender)
- 接收者(Receiver)
每個訊息都被髮送到一個特定的佇列,接收者從佇列中獲取訊息。佇列保留著訊息,可以放在記憶體 中也可以持久化,直到他們被消費或超時。
特點:
- 每個訊息只有一個消費者(Consumer)(即一旦被消費,訊息就不再在訊息佇列中)
- 傳送者和接收者之間在時間上沒有依賴性
- 接收者在成功接收訊息之後需向佇列應答成功
- 利用FIFO先進先出的特性,可以保證訊息的順序性。
2.2.2 Pub/Sub釋出訂閱(廣播)
使用topic作為通訊載體,訊息生產者(釋出)將訊息釋出到topic中,同時有多個訊息消費者(訂閱)消費該訊息。和點對點方式不同,釋出到topic的訊息會被所有訂閱者消費。
queue實現了負載均衡,將producer生產的訊息傳送到訊息佇列中,由多個消費者消費。但一個訊息只能被一個消費者接受,當沒有消費者可用時,這個訊息會被儲存直到有一個可用的消費者。
釋出訂閱模型包含三個角色:
- 主題(Topic)
- 釋出者(Publisher)
- 訂閱者(Subscriber)
多個釋出者將訊息傳送到Topic,系統將這些訊息傳遞給多個訂閱者。
特點:
- 每個訊息可以有多個消費者:和點對點方式不同,釋出訊息可以被所有訂閱者消費
- 釋出者和訂閱者之間有時間上的依賴性。
- 針對某個主題(Topic)的訂閱者,它必須建立一個訂閱者之後,才能消費釋出者的訊息。
- 為了消費訊息,訂閱者必須保持執行的狀態。
2.3 訊息中介軟體的優勢
系統解耦:互動系統之間沒有直接的呼叫關係,只是通過訊息傳輸,故系統侵入性不強,耦合度低。
提高系統響應時間:例如原來的一套邏輯,可將緊急重要(需要立刻響應)的業務放到該呼叫方法中,響應要求不高的使用訊息佇列,放到MQ佇列中,供消費者處理。
為大資料處理架構提供服務:通過訊息作為整合,大資料的背景下,訊息佇列還與實時處理架構整合,為資料處理提供效能支援。
2.4 訊息中介軟體常用協議
AMQP協議、MQTT協議、STOMP協議、XMPP協議、其他基於TCP/IP自定義的協議訊息中介軟體的組成
2.4.1 AMQP
AMQP即Advanced Message Queuing Protocol,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。訊息中介軟體主要用於元件之間的解耦,訊息的傳送者無需知道訊息使用者的存在,反之亦然。AMQP 的主要特徵是面向訊息、佇列、路由(包括點對點和釋出/訂閱)、可靠性、安全。
優點:可靠、通用。
2.4.2 MQTT
MQTT(Message Queuing Telemetry Transport,訊息佇列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。該協議支援所有平臺,幾乎可以把所有聯網物品和外部連線起來,被用來當做感測器和致動器(比如通過Twitter讓房屋聯網)的通訊協議。
優點:格式簡潔、佔用頻寬小、移動端通訊、PUSH、嵌入式系統
2.4.3 STOMP
STOMP(Streaming Text Orientated Message Protocol)是流文字定向訊息協議,是一種為MOM(Message Oriented Middleware,面向訊息的中介軟體)設計的簡單文字協議。STOMP提供一個可互操作的連線格式,允許客戶端與任意STOMP訊息代理(Broker)進行互動。
優點:命令模式(非topic\queue模式)
2.4.4 XMPP
XMPP(可擴充套件訊息處理現場協議,Extensible Messaging and Presence Protocol)是基於可擴充套件標記語言(XML)的協議,多用於即時訊息(IM)以及線上現場探測。適用於伺服器之間的準即時操作。核心是基於XML流傳輸,這個協議可能最終允許因特網使用者向因特網上的其他任何人傳送即時訊息,
即使其作業系統和瀏覽器不同。
優點:通用公開、相容性強、可擴充套件、安全性高,但XML編碼格式佔用頻寬大
2.5 主流的訊息中介軟體
常見的訊息中介軟體包括:RabbitMQ、RocketMQ、kafka 等,後面我們會有一篇專門對這幾種中介軟體的能力和技術引數做一項完整的對比,並給出不同業務場景下的技術選型建議。