消息隊列介紹


本文將介紹大名鼎鼎的消息隊列(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. 消息准確消費

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

推薦大家的項目開發中使用消息隊列,並不是“殺雞焉用牛刀”的問題,而是未雨綢繆,隨着項目不斷發展,你終將從消息隊列中獲益。
以上。

最后,祝大家新年快樂!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM