訊息佇列總結

2022-09-09 20:39:23 字數 2122 閱讀 3501

我們可以把訊息佇列看作是乙個存放訊息的容器,當我們需要使用訊息的時候,直接從容器中取出訊息供自己使用即可。

訊息佇列是分布式系統中重要的元件之一。使用訊息佇列主要是為了通過非同步處理提高系統效能和削峰、降低系統耦合性。

我們知道佇列 queue 是一種先進先出的資料結構,所以消費訊息時也是按照順序來消費的。

通常來說,使用訊息佇列能為我們的系統帶來下面三點好處:

通過非同步處理提高系統效能(減少響應所需時間)。

削峰/限流

降低系統耦合性。

如果在面試的時候你被面試官問到這個問題的話,一般情況是你在你的簡歷上涉及到訊息佇列這方面的內容,這個時候推薦你結合你自己的專案來回答。

《大型**技術架構》第四章和第七章均有提到訊息佇列對應用效能及擴充套件性的提公升。

通過非同步處理提高系統效能

將使用者的請求資料儲存到訊息佇列之後就立即返回結果。隨後,系統再對訊息進行消費。

因為使用者請求資料寫入訊息佇列之後就立即返回給使用者了,但是請求資料在後續的業務校驗、寫資料庫等操作中可能失敗。因此,使用訊息佇列進行非同步處理之後,需要適當修改業務流程進行配合,比如使用者在提交訂單之後,訂單資料寫入訊息佇列,不能立即返回使用者訂單提交成功,需要在訊息佇列的訂單消費者進**正處理完該訂單之後,甚至出庫後,再通過電子郵件或簡訊通知使用者訂單成功,以免交易糾紛。這就類似我們平時手機訂火車票和電影票。

先將短時間高併發產生的事務訊息儲存在訊息佇列中,然後後端服務再慢慢根據自己的能力去消費這些訊息,這樣就避免直接把後端服務打垮掉。

舉例:在電子商務一些秒殺、**活動中,合理使用訊息佇列可以有效抵禦**活動剛開始大量訂單湧入對系統的衝擊。如下圖所示:

削峰使用訊息佇列還可以降低系統耦合性。我們知道如果模組之間不存在直接呼叫,那麼新增模組或者修改模組就對其他模組影響較小,這樣系統的可擴充套件性無疑更好一些。還是直接上圖吧:

解耦生產者(客戶端)傳送訊息到訊息佇列中去,接受者(服務端)處理訊息,需要消費的系統直接去訊息佇列取訊息進行消費即可而不需要和其他系統有耦合,這顯然也提高了系統的擴充套件性。

訊息佇列使利用發布-訂閱模式工作,訊息傳送者(生產者)發布訊息,乙個或多個訊息接受者(消費者)訂閱訊息。 從上圖可以看到訊息傳送者(生產者)和訊息接受者(消費者)之間沒有直接耦合,訊息傳送者將訊息傳送至分布式訊息佇列即結束對訊息的處理,訊息接受者從分布式訊息佇列獲取該訊息後進行後續處理,並不需要知道該訊息從何而來。對新增業務,只要對該類訊息感興趣,即可訂閱該訊息,對原有系統和業務沒有任何影響,從而實現**業務的可擴充套件性設計。

訊息接受者對訊息進行過濾、處理、包裝後,構造成乙個新的訊息型別,將訊息繼續傳送出去,等待其他訊息接受者訂閱該訊息。因此基於事件(訊息物件)驅動的業務架構可以是一系列流程。

另外,為了避免訊息佇列伺服器宕機造成訊息丟失,會將成功傳送到訊息佇列的訊息儲存在訊息生產者伺服器上,等訊息真正被消費者伺服器處理後才刪除訊息。在訊息佇列伺服器宕機後,生產者伺服器會選擇分布式訊息佇列伺服器集群中的其他伺服器發布訊息。

備註: 不要認為訊息佇列只能利用發布-訂閱模式工作,只不過在解耦這個特定業務環境下是使用發布-訂閱模式的。除了發布-訂閱模式,還有點對點訂閱模式(乙個訊息只有乙個消費者),我們比較常用的是發布-訂閱模式。另外,這兩種訊息模型是 jms 提供的,amqp 協議還提供了 5 種訊息模型。

系統可用性降低: 系統可用性在某種程度上降低,為什麼這樣說呢?在加入 mq 之前,你不用考慮訊息丟失或者說 mq 掛掉等等的情況,但是,引入 mq 之後你就需要去考慮了!

系統複雜性提高: 加入 mq 之後,你需要保證訊息沒有被重複消費、處理訊息丟失的情況、保證訊息傳遞的順序性等等問題!

一致性問題: 我上面講了訊息佇列可以實現非同步,訊息佇列帶來的非同步確實可以提高系統響應速度。但是,萬一訊息的真正消費者並沒有正確消費訊息怎麼辦?這樣就會導致資料不一致的情況了!

linux訊息佇列總結

1.訊息佇列簡介 實現linux程序通訊的方式有5種 訊號 singal 管道 pipe 訊息佇列 message 訊號量 semaphore 每種程序通訊方式實現方式和功能不一樣,帶來適用的場景也有所不同,訊息佇列是鍊錶佇列,它通過核心提供乙個struct msqid ds msgque msgm...

RabbitMQ訊息佇列總結

這段時間在做乙個分布式開發 用到了訊息佇列 以下總結 rabbitmq 是乙個訊息 這主要的原理十分簡單,就是通過接受和 訊息。你可以把它想象成郵局 當你將乙個包裹送到郵局,你會相信郵遞員先生最終會將郵件送到接件人手上。rabbitmq就好比乙個郵箱,郵局或郵遞員。郵局和rabbitmq兩種主要的不...

訊息佇列 訊息佇列

輪詢排程 一次性分發所有訊息,保證訊息平均分配,不管消費者是否能正常消費 訊息應答 保證消費端能確實消費,不丟失 公平 乙個乙個分發所有訊息,在保證分發到的執行緒確認回覆後,才分發下個訊息給下個空閒的消費者,訊息持久化 保證佇列中的訊息不丟失,包括3要素 交換器 訊息佇列 訊息都必須宣告持久化 發布...