MQ(Message Queue)簡介

一、何為MQ?

MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用于諸如遠程過程調用的技術。排隊指的是應用程序通過隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。——百度百科

差不多能看懂,簡單來說,就跟人們排隊買票是一樣,只不過排隊的不是人,而是消息。

二、MQ概述

要讓消息隊列能有機動起來,那么一個完整的體系包括什么呢?首先是消息,然后是存放消息的隊列,接著就是管理隊列的管理器,以及管理器之間通信的信道:

1. 消息

在MQ中,我們把應用程序交由MQ傳輸的數據定義為消息,我們可以定義消息的內容并對消息進行廣義的理解,比如:用戶的各種類型的數據文件,某個應用向其它應用發出的處理請求等都可以作為消息。消息有兩部分組成:

  • 消息描述符(Message Discription或Message Header),描述消息的特征,如:消息的優先級、生命周期、消息Id等;
  • 消息體(Message Body),即用戶數據部分。

MQ中,消息分為兩種類型:

  • 非永久性(non-persistent)消息
  • 久性(persistent)消息

非永久性消息是存儲在內存中的,它是為了提高性能而設計的,當系統掉電或MQ隊列管理器重新啟動時,將不可恢復。當用戶對消息的可靠性要求不高,而側重系統的性能表現時,可以采用該種類型的消息,如:當發布股票信息時,由于股票信息是不斷更新的,我們可能每若干秒就會發布一次,新的消息會不斷覆蓋舊的消息。永久性消息是存儲在硬盤上,并且紀錄數據日志的,它具有高可靠性,在網絡和系統發生故障等情況下都能確保消息不丟、不重。

此外,在MQ中,還有邏輯消息和物理消息的概念。利用邏輯消息和物理消息,我們可以將大消息進行分段處理,也可以將若干個本身完整的消息在應用邏輯上歸為一組進行處理。

2. 隊列

隊列是消息的安全存放地,隊列存儲消息直到它被應用程序處理。消息隊列以下述方式工作:

  • 程序A形成對消息隊列系統的調用,此調用告知消息隊列系統,消息準備好了投向程序B;
  • 消息隊列系統發送此消息到程序B駐留處的系統,并將它放到程序B的隊列中;
  • 適當時間后,程序B從它的隊列中讀此消息,并處理此信息。

由于采用了先進的程序設計思想以及內部工作機制,MQ能夠在各種網絡條件下保證消息的可靠傳遞,可以克服網絡線路質量差或不穩定的現狀,在傳輸過程中,如果通信線路出現故障或遠端的主機發生故障,本地的應用程序都不會受到影響,可以繼續發送數據,而無需等待網絡故障恢復或遠端主機正常后再重新運行。

在MQ中,隊列分為很多種類型,其中包括:

  • 本地隊列
  • 遠程隊列
  • 模板隊列
  • 動態隊列
  • 別名隊列
  • …………

本地隊列又分為普通本地隊列和傳輸隊列,普通本地隊列是應用程序通過API對其進行讀寫操作的隊列;傳輸隊列可以理解為存儲-轉發隊列,比如:我們將某個消息交給MQ系統發送到遠程主機,而此時網絡發生故障,MQ將把消息放在傳輸隊列中暫存,當網絡恢復時,再發往遠端目的地。

遠程隊列是目的隊列在本地的定義,它類似一個地址指針,指向遠程主機上的某個目的隊列,它僅僅是個定義,不真正占用磁盤存儲空間。

模板隊列和動態隊列是MQ的一個特色,它的一個典型用途是用作系統的可擴展性考慮。我們可以創建一個模板隊列,當今后需要新增隊列時,每打開一個模板隊列,MQ便會自動生成一個動態隊列,我們還可以指定該動態隊列為臨時隊列或者是永久隊列,若為臨時隊列我們可以在關閉它的同時將它刪除,相反,若為永久隊列,我們可以將它永久保留,為我所用。

3. 隊列管理器

隊列管理器是MQ系統中最上層的一個概念,由它為我們提供基于隊列的消息服務。

4. 通道

通道是MQ系統中隊列管理器之間傳遞消息的管道,它是建立在物理的網絡連接之上的一個邏輯概念,也是MQ產品的精華。在MQ中,主要有三大類通道類型:

  • 消息通道
  • MQI通道
  • Cluster通道

消息通道是用于在MQ的服務器和服務器之間傳輸消息的,需要強調指出的是,該通道是單向的,它又有發送(sender), 接收(receive), 請求者(requestor), 服務者(server)等不同類型,供用戶在不同情況下使用。MQI通道是MQ Client和MQ Server之間通訊和傳輸消息用的,與消息通道不同,它的傳輸是雙向的。群集(Cluster)通道是位于同一個MQ 群集內部的隊列管理器之間通訊使用的。

三、MQ工作原理

?

首先來看本地通訊的情況,應用程序A和應用程序B運行于同一系統A,它們之間可以借助消息隊列技術進行彼此的通訊:應用程序A向隊列1發送一條信息,而當應用程序B需要時就可以得到該信息。

其次是遠程通訊的情況,如果信息傳輸的目標改為在系統B上的應用程序C,這種變化不會對應用程序A產生影響,應用程序A向隊列2發送一條信息,系統A的MQ發現Q2所指向的目的隊列實際上位于系統B,它將信息放到本地的一個特殊隊列——傳輸隊列(Transmission Queue)。我們建立一條從系統A到系統B的消息通道,消息通道代理將從傳輸隊列中讀取消息,并傳遞這條信息到系統B,然后等待確認。只有MQ接到系統B成功收到信息的確認之后,它才從傳輸隊列中真正將該信息刪除。如果通訊線路不通,或系統B不在運行,信息會留在傳輸隊列中,直到被成功地傳送到目的地。這是MQ最基本而最重要的技術–確保信息傳輸,并且是一次且僅一次(once-and-only-once)的傳遞。

MQ提供了用于應用集成的松耦合的連接方法,因為共享信息的應用不需要知道彼此物理位置(網絡地址);不需要知道彼此間怎樣建立通信;不需要同時處于運行狀態;不需要在同樣的操作系統或網絡環境下運行。

四、MQ的通訊模式

MQ有四種通訊模式:

1. 點對點通訊

點對點方式是最為傳統和常見的通訊方式,它支持一對一、一對多、多對多、多對一等多種配置方式,支持樹狀、網狀等多種拓撲結構。

2. 多點廣播

MQ適用于不同類型的應用。其中重要的,也是正在發展中的是”多點廣播”應用,即能夠將消息發送到多個目標站點(Destination List)。可以使用一條MQ指令將單一消息發送到多個目標站點,并確保為每一站點可靠地提供信息。MQ不僅提供了多點廣播的功能,而且還擁有智能消息分發功能,在將一條消息發送到同一系統上的多個用戶時,MQ將消息的一個復制版本和該系統上接收者的名單發送到目標MQ系統。目標MQ系統在本地復制這些消息,并將它們發送到名單上的隊列,從而盡可能減少網絡的傳輸量。

3.發布/訂閱(Publish/Subscribe)模式

發布/訂閱功能使消息的分發可以突破目的隊列地理指向的限制,使消息按照特定的主題甚至內容進行分發,用戶或應用程序可以根據主題或內容接收到所需要的消息。

發布/訂閱功能使得發送者和接收者之間的耦合關系變得更為松散,發送者不必關心接收者的目的地址,而接收者也不必關心消息的發送地址,而只是根據消息的主題進行消息的收發。在MQ家族產品中,MQ Event Broker是專門用于使用發布/訂閱技術進行數據通訊的產品,它支持基于隊列和直接基于TCP/IP兩種方式的發布和訂閱。

4.群集(Cluster)

為了簡化點對點通訊模式中的系統配置,MQ提供Cluster(群集)的解決方案。群集類似于一個域(Domain),群集內部的隊列管理器之間通訊時,不需要兩兩之間建立消息通道,而是采用群集(Cluster)通道與其它成員通訊,從而大大簡化了系統配置。此外,群集中的隊列管理器之間能夠自動進行負載均衡,當某一隊列管理器出現故障時,其它隊列管理器可以接管它的工作,從而大大提高系統的高可靠性。

PS:在JMS標準中,有兩種消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)??

五、MQ的優點

過去幾年中,我們一直在使用、構建和宣傳消息隊列,我們認為它們是很令人敬畏的,這也不是什么秘密。我們相信對任何架構或應用來說,消息隊列都是一個至關重要的組件,下面是十個理由:

1. 解耦

在項目啟動之初來預測將來項目會碰到什么需求,是極其困難的。消息隊列在處理過程中間插入了一個隱含的、基于數據的接口層,兩邊的處理過程都要實現這一接口。這允許你獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。

2. 冗余

有時在處理數據的時候處理過程會失敗。除非數據被持久化,否則將永遠丟失。消息隊列把數據進行持久化直到它們已經被完全處理,通過這一方式規避了數據丟失風險。在被許多消息隊列所采用的”插入-獲取-刪除”范式中,在把一個消息從隊列中刪除之前,需要你的處理過程明確的指出該消息已經被處理完畢,確保你的數據被安全的保存直到你使用完畢。

3. 擴展性

因為消息隊列解耦了你的處理過程,所以增大消息入隊和處理的頻率是很容易的;只要另外增加處理過程即可。不需要改變代碼、不需要調節參數。擴展就像調大電力按鈕一樣簡單。

4. 靈活性 & 峰值處理能力

當你的應用上了Hacker News的首頁,你將發現訪問流量攀升到一個不同尋常的水平。在訪問量劇增的情況下,你的應用仍然需要繼續發揮作用,但是這樣的突發流量并不常見;如果為以能處理這類峰值訪問為標準來投入資源隨時待命無疑是巨大的浪費。使用消息隊列能夠使關鍵組件頂住增長的訪問壓力,而不是因為超出負荷的請求而完全崩潰。請查看我們關于峰值處理能力的博客文章了解更多此方面的信息。

5. 可恢復性

當體系的一部分組件失效,不會影響到整個系統。消息隊列降低了進程間的耦合度,所以即使一個處理消息的進程掛掉,加入隊列中的消息仍然可以在系統恢復后被處理。而這種允許重試或者延后處理請求的能力通常是造就一個略感不便的用戶和一個沮喪透頂的用戶之間的區別。

6. 送達保證

消息隊列提供的冗余機制保證了消息能被實際的處理,只要一個進程讀取了該隊列即可。在此基礎上,IronMQ提供了一個”只送達一次”保證。無論有多少進程在從隊列中領取數據,每一個消息只能被處理一次。這之所以成為可能,是因為獲取一個消息只是”預定”了這個消息,暫時把它移出了隊列。除非客戶端明確的表示已經處理完了這個消息,否則這個消息會被放回隊列中去,在一段可配置的時間之后可再次被處理。

7.排序保證

在許多情況下,數據處理的順序都很重要。消息隊列本來就是排序的,并且能保證數據會按照特定的順序來處理。

8.緩沖

在任何重要的系統中,都會有需要不同的處理時間的元素。例如,加載一張圖片比應用過濾器花費更少的時間。消息隊列通過一個緩沖層來幫助任務最高效率的執行–寫入隊列的處理會盡可能的快速,而不受從隊列讀的預備處理的約束。該緩沖有助于控制和優化數據流經過系統的速度。

9. 理解數據流

在一個分布式系統里,要得到一個關于用戶操作會用多長時間及其原因的總體印象,是個巨大的挑戰。消息系列通過消息被處理的頻率,來方便的輔助確定那些表現不佳的處理過程或領域,這些地方的數據流都不夠優化。

10. 異步通信

多時候,你不想也不需要立即處理消息。消息隊列提供了異步處理機制,允許你把一個消息放入隊列,但并不立即處理它。你想向隊列中放入多少消息就放多少,然后在你樂意的時候再去處理它們。

六、MQ的使用場景

光說不練嘴把式,到底MQ能做些什么?以下介紹消息隊列在實際應用中常用的使用場景。異步處理,應用解耦,流量削鋒和消息通訊四個場景。

1. 異步處理

場景說明:用戶注冊后,需要發注冊郵件和注冊短信。傳統的做法有串行的方式并行方式兩種。

  1. 串行方式

將注冊信息寫入數據庫成功后,發送注冊郵件,再發送注冊短信。以上三個任務全部完成后,返回給客戶端。?

?

  1. 并行方式

將注冊信息寫入數據庫成功后,發送注冊郵件的同時,發送注冊短信。以上三個任務完成后,返回給客戶端。與串行的差別是,并行的方式可以提高處理的時間。?

?

假設三個業務節點每個使用50毫秒鐘,不考慮網絡等其他開銷,則串行方式的時間是150毫秒,并行的時間可能是100毫秒。因為CPU在單位時間內處理的請求數是一定的,假設CPU1秒內吞吐量是100次。則串行方式1秒內CPU可處理的請求量是7次(1000/150)。并行方式處理的請求量是10次(1000/100)。

小結:如以上案例描述,傳統的方式系統的性能(并發量,吞吐量,響應時間)會有瓶頸。如何解決這個問題呢??
引入消息隊列,將不是必須的業務邏輯,異步處理。改造后的架構如下:?


按照以上約定,用戶的響應時間相當于是注冊信息寫入數據庫的時間,也就是50毫秒。注冊郵件,發送短信寫入消息隊列后,直接返回,因此寫入消息隊列的速度很快,基本可以忽略,因此用戶的響應時間可能是50毫秒。因此架構改變后,系統的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了兩倍。

2. 應用解耦

場景說明:用戶下單后,訂單系統需要通知庫存系統。傳統的做法是,訂單系統調用庫存系統的接口。如下圖:

?

?

傳統模式的缺點:

  • 假如庫存系統無法訪問,則訂單減庫存將失敗,從而導致訂單失敗;
  • 訂單系統與庫存系統耦合。

如何解決以上問題呢?引入應用消息隊列后的方案,如下圖:?


訂單系統:用戶下單后,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功。?
庫存系統:訂閱下單的消息,采用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操作。

假如,在下單時庫存系統不能正常使用。也不影響正常下單,因為下單后,訂單系統寫入消息隊列就不再關心其他的后續操作了。實現訂單系統與庫存系統的應用解耦。

3. 流量削鋒

流量削鋒也是消息隊列中的常用場景,一般在秒殺或團搶活動中使用廣泛。如,秒殺活動中,一般會因為流量過大,導致流量暴增,應用掛掉。

為解決這個問題,一般需要在應用前端加入消息隊列。這樣以來可以控制活動的人數,可以緩解短時間內高流量壓垮應用。


用戶的請求,服務器接收后,首先寫入消息隊列。假如消息隊列長度超過最大數量,則直接拋棄用戶請求或跳轉到錯誤頁面;秒殺業務根據消息隊列中的請求信息,再做后續處理。

4. 日志處理

日志處理是指將消息隊列用在日志處理中,比如Kafka的應用,解決大量日志傳輸的問題。架構簡化如下:?

日志采集客戶端,負責日志數據采集,定時寫受寫入Kafka隊列;?
Kafka消息隊列,負責日志數據的接收,存儲和轉發;?
日志處理應用:訂閱并消費kafka隊列中的日志數據;

?

以下是新浪kafka日志處理應用案例:《新浪技術分享:我們如何扛下32億條實時日志的分析處理》?


Kafka:接收用戶日志的消息隊列。?
Logstash:做日志解析,統一成JSON輸出給Elasticsearch。?
Elasticsearch:實時日志分析服務的核心技術,一個schemaless,實時的數據存儲服務,通過index組織數據,兼具強大的搜索和統計功能。?
Kibana:基于Elasticsearch的數據可視化組件,超強的數據可視化能力是眾多公司選擇ELK stack的重要原因。

5. 消息通訊

消息通訊是指,消息隊列一般都內置了高效的通信機制,因此也可以用在純的消息通訊。比如實現點對點消息隊列,或者聊天室等。

點對點通訊:


客戶端A和客戶端B使用同一隊列,進行消息通訊。

聊天室通訊:


客戶端A,客戶端B,客戶端N訂閱同一主題,進行消息發布和接收。實現類似聊天室效果。

?


---------------------
作者:staybug
來源:CSDN
原文:https://blog.csdn.net/weixin_43994338/article/details/105883473
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284352.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284352.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284352.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【GlobalMapper精品教程】015:矢量面圖層的創建及數字化操作

本文講解在Globalmapper中文23.0中創建矢量面狀數據(政區數據),并進行面狀數據采集及編輯的詳細操作流程,數據為配套案例數據包中的data015.rar。 參考閱讀: ArcGIS實驗教程——實驗三:矢量數據采集與編輯(矢量化) 文章目錄 一、認識工具條1. 數字化(創建)工具條2. 選…

Blazor University (39)JavaScript 互操作 —— 更新 document title

原文鏈接:https://blazor-university.com/javascript-interop/calling-javascript-from-dotnet/updating-the-document-title/更新 document title源代碼[1]在創建 Blazor 布局[2]部分中,我們看到了 Blazor 應用程序如何存在于 HTML(或 cshtm…

IIS 日志文件位置

IIS 6 Log files location IIS 6中日志文件的位置%windir%\System32\LogFilesIIS 7 Log files location IIS的日志文件的位置%SystemDrive%\inetpub\logs\LogFiles用戶每打開一次網頁,iis 都會記錄用戶IP、訪問的網頁地址、訪問時間、訪問狀態等信息,這些…

APP測試流程和測試點

1 APP測試基本流程 1.1流程圖 1.2測試周期 測試周期可按項目的開發周期來確定測試時間,一般測試時間為兩三周(即15個工作日),根據項目情況以及版本質量可適當縮短或延長測試時間。正式測試前先向主管確認項目排期。 1.3測試資源 測…

39所強基計劃試點高校已全部公布招生簡章

截至目前(4月8日下午) 39所強基計劃試點高校 已全部公布招生簡章 各高校招生要求是什么? 招生專業有哪些? 什么時候報名? 一起來看 北京大學 招生對象及報名條件 各省(區、市)符合2022年全國普通高等學校招生統…

【ArcGIS錯誤異常100問】之001:License服務無法啟動權威解決辦法

測試環境: 操作系統:Windows10ArcGIS版本:10.X結果:通過測試 文章目錄1. 錯誤提示2. 問題分析3. 解決辦法3.1 關閉Windows Defender3.2 關閉系統防火墻3.3 刪除邁克菲(McAfee)殺毒軟件3.4 在系統服務中啟動…

Appium wait等待的三種方法

1、sleep()方法Thread.sleep(60000)強制等待60s2、隱式等待implicitlyWait()driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);全局等待30s不管元素是否已經加載1) 當使用了隱式等待執行測試的時候,如果WebDriver沒有在DOM中…

ASP.NET Core 技術內幕與項目實戰讀后感

前幾天拿到了楊中科老師的新書《ASP.NET Core 技術內幕與項目實戰》,迫不及待的“兩”口氣讀完了。用一句話來總結,這是一本寫給.NET開發者的非常實用的接地氣的好書,感覺有必要自發為這本書宣傳一波。楊老師在 .NET 開發者社區中的知名度非常…

avalon2學習教程15指令總結

avalon的指令在上一節已經全部介紹完畢,當然有的語焉不詳,如ms-js。本節主要總結我對這方面的思考與探索。 MVVM的成功很大一語分是來自于其指令,或叫綁定。讓操作視圖的功能交由形形式式的指令來代勞。VM,成了一個大管家。它只一…

【ArcGIS錯誤異常100問】之002:Error 000735 簡化容差:值是必需的(簡化線、簡化面工具)

測試環境: 操作系統:windows7ArcGIS版本:10.2結果:通過測試 文章目錄1. 錯誤提示2. 問題分析3. 解決辦法4. 問題驗證1. 錯誤提示 在ArcGIS中使用簡化面或者簡化線工具時,點擊確定會提示Error 000735:簡化容…

mybatis中mysql轉義講解

本文為博主原創,未經允許不得轉載: 在mybatis中寫sql的時候,遇到特殊字符在加載解析的時候,會進行轉義,所以在mybatis中 寫sql語句的時候,遇到特殊字符進行轉義處理。 需要注意的是,轉義的字符為…

用Python執行js文件代碼并獲取返回結果

js代碼(myjs.js): /** Title: This is a file for ……* Author: JackieZheng* Date: 2022-04-12 09:24:13* LastEditTime: 2022-04-12 09:40:55* LastEditors: Please set LastEditors* Description:* FilePath: myjs.js*/function hello(…

.NET桌面開發的一些思考

在22日,我在公眾號上發布了一條短文字,內容如下:其實在.NET開發大軍中,還有一股力量,那就是桌面程序的開發者們。他們很少發聲,可能技術成熟,可能太企業化了,也可能我沒關注到。最近…

【ArcGIS錯誤異常100問】之003:屬性表中文亂碼解決辦法總結

測試環境: 操作系統:windows7ArcGIS版本:10.X、Pro結果:通過測試 文章目錄1. 錯誤提示2. 原因分析3. 解決方法4. 問題驗證1. 錯誤提示 如圖所示,安裝完ArcGIS Pro后,由于計算機系統和應用軟件字符編碼的問…

大型網站架構演化(二)——應用服務和數據服務分離

隨著網站業務的發展,一臺服務器逐漸不能滿足需求:越來越多的用戶訪問導致性能越來越差,越來越多的數據導致存儲空間不足。這時就需要將應用和數據分離。應用和數據分離后整個網站使用三臺服務器:應用服務器、文件服務器和數據庫服…

再不自動化就晚啦!優云教你4步打造基于CentOS的產品鏡像

隨著Linux程序的增多,軟件的安裝過程中經常出現如下問題: 1、硬件配置類似或者相同時,批量安裝系統和軟件,希望實現自動化安裝,減少安裝時間和人為出錯。 2、工程實施人員在不同客戶現場進行系統和軟件安裝(硬件配置不…

【ArcGIS錯誤異常100問】之004:ArcGIS表轉Excel超了65535限制解決辦法

測試環境: 操作系統:windows7ArcGIS版本:10.2 文章目錄1. 錯誤提示2. 原因分析3. 解決方法1. 錯誤提示 如下圖,當矢量shp圖斑數目過多,文件超過了65535條記錄時,利用ArcGIS的表轉Excel工具處理成Excel文件…

[轉]硬核 | Redis 布隆(Bloom Filter)過濾器原理與實戰

在Redis 緩存擊穿(失效)、緩存穿透、緩存雪崩怎么解決?中我們說到可以使用布隆過濾器避免「緩存穿透」。 碼哥,布隆過濾器還能在哪些場景使用呀? 比如我們使用「碼哥跳動」開發的「明日頭條」APP 看新聞,如…

Senparc.Weixin.Sample.MP源碼剖析

Senparc.Weixin.Sample.MP是微信公眾號樣例的.NET6源碼,項目配置文件appsettings.json的修改和微信公眾號測試環境的搭建參考:微信公眾號調試與Natapp環境搭建。接下來從項目結構,項目應用和項目源碼3個角度來進行講解。一.項目結構角度項目代…

解決java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor問題

hibernate整合spring當在spring配置文件中加入如下代碼 <!--2.配置事務屬性,需要事務管理器--><tx:advice id"txAdvice" transaction-manager"transactionManager"><tx:attributes><tx:method name"get*" read-only"t…