說一說消息隊列

什麼是消息隊列

消息隊列(Message Queue,簡稱MQ),從字面上的意思來看,本質就是一個隊列,FIFO(先入先出),只不過隊列中存放的內容是Message而已。html

消息隊列的做用

消息隊列主要用於不一樣進程(Process)/線程(Thread)之間通訊。它主要解決兩個問題:git

  • 系統解耦:項目開始時,沒法肯定最終需求,不一樣進程間,添加一層,實現解耦,方便從此的擴展
  • 消息緩存:系統中,不一樣進程處理速度不一樣,MQ,能夠實現不一樣Process之間的緩衝,即寫入MQ的速度能夠儘量的塊,而處理消息的速度能夠適當調整。

消息隊列的特性

FIFOgithub

知足隊列的FIFO,先入先出策略編程

可靠性緩存

  • 冗餘:進程崩潰以後,數據並不會丟失,由於MQ多采用put-get-delete模式,即,僅當確認message被處理完以後,才從MQ中移除Message
  • 可恢復:MQ實現解耦,部分進程崩潰,不會拖累整個系統癱瘓。例如,進程B崩潰以後,進程A扔可向MQ添加Message,並等待進程B恢復

可擴展性負載均衡

  • 因爲實現解耦,能夠很容易調整,消息入隊速率,消息處理速率,增長新的進程……

可追蹤性異步

  • 數據流的階段性能定位:獲取用戶操做的各個階段(經過Message來標識),捕獲不一樣階段的耗時,可用於定位系統瓶頸

保證一致性分佈式

  • 保證MQ中一個message被處理一次,而且只能被處理一次。本質:獲取一個message後,這一message即被預約,同一進程不會再一次獲取這一Message;當且僅當進程處理完這一Message後,MQ纔會delete這個Message。不然,過一段時間後,這一Message自動解除被預約狀態,進程可以從新預約這個Message;

異步性性能

  • 不少場景下,MQ不會當即處理Message而是存儲Message,並在某一時刻再進行處理。

分佈式消息隊列

    說到分佈式就必然牽扯出一系列的話題,負載均衡、服務定位、通訊協議、序列化協議…… 不是一兩句話就能說明白的。在這裏我們只說有關分佈式消息隊列的概念。線程

分佈式隊列編程模型

分佈式隊列編程模型包含三類角色:發送者(Sender)、分佈式(Queue)、接收者(Receiver)。發送者和接收者分別指的是生產消息和接收消息的應用程序或服務。

點對點模型(Point-to-Point)

基礎模型中,只有一個發送這、一個接收者和一個分佈式隊列。以下圖:

EK5NGY80)HV$TZA@}L8TQ@F

 

 

 

 

 

生產者消費者模型(Producer-consumer)

若是發送這和接收者均可以有多個部署實例,甚至不一樣的類型;可是共用同一個隊列,就變成了標準的生產者消費者模型。在該模型中,三個角色通常稱之爲生產者(Producer)、分佈式隊列(Queue)、消費者(Consumer)。以下圖:

`_YC5{%UOZ@SNQ3Y)3]U)12

發佈訂閱模型(PubSub)

若是隻有一類發送者,發送者將產生的消息實體按照不一樣的主題(Topic)分發到不一樣的邏輯隊列。每種主題隊列對應一類接收者。這就變成了典型的發佈訂閱模型。在該模型,三個角色被稱之爲發佈者(Publisher)、分佈式隊列(Queue)、訂閱者(Subscriber),以下圖:

LL`V%4Q4UNUFG_S(3BS`O{I

MVC模型

若是發送者和接收者存在同一個實體中,可是共享一個分佈式隊列。這就像很經典的MVC模型。以下圖

W8G{)63ADK5L2CXAI0I4720

簡單的消息隊列實現


很少說,直接上代碼
image

最後,源碼下載

參考資料

消息隊列(Message Queue)基本概念
分佈式隊列編程:模型、實戰

相關文章
相關標籤/搜索