消息隊列介紹

本文將介紹大名鼎鼎的消息隊列(MQ)的原理,應用場景和常見問題。

日常開發中,可能會經常遇到這幾類問題:

  1. 系統中批量更新(增,刪,改)功能接口,如果業務比較複雜,加之數據量龐大,這類同步操作是很耗時的,這時候需要進行異步處理
  2. 電子商務網站在促銷活動時,會在短時間內高併發,需要削平高峯期的併發事務
  3. 爲了提高系統的可擴展性,希望各個模塊之間不存在直接調用,開發低耦合的系統,對各個模塊之間進行解耦

以上場景,都可以使用消息隊列有效解決。

什麼是消息隊列?

消息(Message)是指在應用間傳送的數據(比如字符串,json等),消息隊列(Message Queue,簡稱MQ)是一個古老的計算機術語,UNIX進程間通信就用到了消息隊列技術:一個進程把數據寫入某個特定隊列中,其它隊列讀取特定隊列中的數據實現異步通信。而現在我們所說的MQ通常指的是獨立的消息隊列中間件,利用高效可靠的消息傳遞機制進行與平臺無關的數據交流,並基於數據通信來進行分佈式系統的集成。

傳遞模式

消息隊列一般有兩種傳遞模式:

  1. 點對點(Point to Point,簡稱PTP):消息生產者發送消息到隊列,消費者從隊列中接收消息。消息被消費以後,queue中不再存儲,queue支持存在多個消費者,但是一個消息只能被一個消費者消費。
  2. 發佈 / 訂閱(Pub / Sub):發佈訂閱(一對多)廣播形式,消息發佈者將消息發佈到某個主題(Topic),消息訂閱者從主題中訂閱消息(得到消息的拷貝),一個消息可以同時被多個消費者訂閱,並會被所有訂閱者消費。

組成

  1. Broker: 消息服務器,作爲server提供消息核心服務
  2. Producer:消息生產者,業務的發起方,生產消息傳輸給broker
  3. Consumer:消息消費者,業務處理方,負責從broker獲取消息並進行業務邏輯處理
  4. Topic:主題,Pub/sub模式下 消息統一匯聚地,不同生產者向topic發送消息,由MQ服務器分發到不同訂閱者,實現消息的廣播。
  5. Queue:隊列,PTP模式下,特定生產者向特定隊列發送消息,消費者訂閱特定的queue完成指定消息的接收與消費。
  6. Message:消息體,根據不同通信協議定義的固定格式編碼數據包,來封裝業務數據,實現消息的傳輸。

消息隊列的作用

介紹幾個消息隊列的重要作用:

  1. 解耦:傳統的軟件開發模式,各個模塊之間相互調用,數據共享,每個模塊都要時刻關注其他模塊的是否更改或者是否掛掉等等,使用消息隊列,可以避免模塊之間直接調用,將所需共享的數據放在消息隊列中,對於新增業務模塊,只要對該類消息感興趣,即可訂閱該類消息,對原有系統和業務沒有任何影響,降低了系統各個模塊的耦合度,提高了系統的可擴展性
  2. 異步:消息隊列提供了異步處理機制,在很多時候應用不想也不需要立即處理消息,允許應用把一些消息放入消息中間件中,並不立即處理它,在之後需要的時候再慢慢處理。
  3. 削峯:在訪問了驟增的場景下,需要保證應用系統的平穩性,但是這樣突發流量並不常見,如果以這類峯值的標準而投放資源的話,那無疑是巨大的浪費,使用消息隊列能夠使關鍵組件支撐突發訪問壓力,不會因爲突發的超負荷請求而完全崩潰。消息隊列的容量可以配置的很大,如果採用磁盤存儲消息,則幾乎等於“無限”容量,這樣一來,高峯期的消息可以被積壓起來,在隨後的時間內進行平滑的處理完成,而不至於讓系統短時間內無法承載而導致崩潰,在電商網站的秒殺搶購這種突發性流量很強的業務場景中,消息隊列的強大緩衝能力可以很好的起到削峯作用。

消息隊列技術選型

現在有很多主流的消息中間件,包括:ActiveMQ, RabbitMQ,Kafka, RocketMQ,Redis。選型時要結合具體的應用場景和自身的業務需求,從功能、性能、運維、可靠性+可用性等維度進行多重考量。

ActiveMQ

Apache出品,Java開發,目前所佔的市場份額不多。

RabbitMQ

Erlang語言實現AMQP協議的消息中間件,併發能力很強,性能及其好,延時很低(達到微妙級),特點:可靠性,可用性,擴展性,功能豐富。

Kafka

LinkedIn使用Scala開發的分佈式,多分區,多副本且基於zookeeper協調的分佈式消息系統,提供了超高的吞吐量,毫秒級延遲,極高的可用性和可靠性。

RocketMQ

阿里出品,Java開發,高吞吐,高可用,適合大規模分佈式應用,經過多次雙十一的洗禮,實力不容小覷。

所謂的消息中間件大道至簡:一發一存一消費,沒有最好的消息中間件,只有最合適的消息中間件。

帶來的問題

引入消息隊列後,我們需要考慮哪些問題呢?

1. 消息堆積

這是一個很常見的問題,如果消息消費的時間太久,或者服務器故障,導致消息堆積。

2. 消息丟失

消息堆積一個處理方案就是給消息加上超時時間判定,這樣就會衍生一個問題,當消息堆積,處理完成之後,就會存在一定消息的丟失,或者服務器宕機也會導致消息丟失,需要針對此類問題做好應對方案。

3. 消息準確消費

保證消息被準確消費,且不存在重複消費的問題。

以上。

最後,祝大家新年快樂!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章