1. 程式人生 > >訊息佇列與AMQP協議

訊息佇列與AMQP協議

一、 訊息佇列

訊息佇列(Message Queue,簡稱MQ)提供非同步通訊協議,可以實現程序間通訊或同一程序不同執行緒間的通訊。其中‘訊息’是指包含必要資訊的資料。訊息的傳送者傳送完資料後,立即返回,訊息被儲存在訊息隊列當中,對這個訊息感興趣的消費者會訂閱訊息並接收並處理它。
使用訊息佇列的好處如下:

1、 應用解耦

訊息是與平臺和語言無關的,訊息佇列可以應對多變的產品變更。

2、 非同步通訊

可以縮短請求等待的時間,使用專門處理請求的消費者來執行,提高WEB頁面的吞吐量,
尤其是瞬間發生的高流量情況,訊息佇列非常有助於頂住訪問的壓力

3、資料持久化

未完成的訊息不會因為某些故障而丟失。

4、 送達保證

訊息佇列提供的冗餘機制保證了訊息確實能被處理,除非消費者明確表示已經出來完這個訊息,否則這個訊息可以被放回佇列中以備其他消費者出來。    

二 、AMQP協議

1、概述

1.1 什麼是AMQP

AMQP,即Advanced Message Queuing Portocol,高階訊息佇列協議。
該協議使得遵從該規範的客戶端應用和訊息中間伺服器的全功能互操作成為可能,
它的設計初衷是為了拜託商業MQ高額費用和不同MQ供應商的介面不統一的問題。
訊息傳送與接收的雙方遵守這個協議可以實現非同步通訊,這個協議約定了訊息的格式和工作方式

1.2 為什麼使用AMQP

在分散式的系統中,子系統如果使用socket進行通訊,有很多問題需要解決
1)訊息的傳送者和接收者如何維持這個連線,如果一方中斷,這期間的資料如何防止丟失?
2)如何降低傳送者和接收者的耦合
3)如何讓優先順序高的接收者接收訊息
4)如何做到負載均衡
5)如何將訊息傳送給相關的接收者,如果接收者訂閱了不同的資料,如何正確的分發到接受者。
6)如何保證接收者接到了正確的或者是有序的資料。
7)如何做到可擴充套件,將通訊模組發到叢集上去。
AMQP可以解決這些問題。

2 、AMQP的模型與原理

2.1 AMQP中包含的主要元素

生產者(producer):向Exchage釋出訊息的應用
消費者(Consumer):從訊息佇列中消費訊息的應用。
訊息佇列(Message Queue):伺服器元件,用於儲存訊息,知道傳送給消費者
訊息(Message):傳輸的內容,訊息實際上包含了兩部分的內容
    1.有效載荷(Payload),也就是要傳輸的資料,資料型別可以純文字,也可以是JSON
    2.標籤(Lable),它包含交換機的名字和可選的主題(topic)標記等。
交換器(Exchage):路由元件,接收生產者傳送的訊息,並將訊息路由轉發給訊息佇列
虛擬主機(Virtual Host):一批交換器,訊息佇列和相關物件。虛擬主機共享相同身份認證和加密環境獨立的獨立伺服器域。
連線(Connection):一個網路連線,比如TCP/IP套接字連線。
通道(Channel):多路複用連線中的一條獨立的雙向資料流通道,為會話提供物理傳輸介質。
繫結器(Binding):訊息佇列和交換器直接的關聯。

2.2 AMQP的工作流程

這裡寫圖片描述

2.3 AMQP是如何建立通訊的

1)建立連線Connection。由生產者和消費者建立連線,連線到broker(訊息代理)的物理節點上。
2)建立Channel。Channel是建立在Connection之上的,一個Connection可以建立多個 Channel,
  producer連線Virtual Host 建立Channel,Consumer連線到相應的queue上建立Channel。
3)傳送訊息。由Producer傳送訊息到Broker中的exchange中。
4) 路由轉發。exchange收到訊息後,根據一定的路由策略,將訊息轉發到相應的queue中去。
5)訊息接收。Consumer會監聽相應的queue,一旦queue中有可以消費的訊息,
  queue就將訊息傳送給Consumer端。
6)訊息確認。當Consumer完成某一條訊息的處理之後,需要傳送一條ACK訊息給對應的Queue。
  Queue收到ACK資訊後,才會認為訊息處理成功,並將訊息從Queue中移除;
  如果在對應的Channel斷開後,Queue沒有收到這條訊息的ACK(訊息迴應)資訊,
  該訊息將被髮送給另外的Channel。 
  至此一個訊息的傳送接收流程走完了。訊息的確認機制提高了通訊的可靠性。

2.4 技術術語

連線(Connection):一個網路連線,比如TCP/IP套接字連線。
會話(Session):端點之間的命名對話。在一個會話上下文中,保證“恰好傳遞一次”。
通道(Channel):多路複用連線中的一條獨立的雙向資料流通道。為會話提供物理傳輸介質。
客戶端(Client):AMQP連線或者會話的發起者。AMQP是非對稱的,客戶端生產和消費訊息,伺服器儲存和路由這些訊息。
伺服器(Server):接受客戶端連線,實現AMQP訊息佇列和路由功能的程序。也稱為“訊息代理”。
端點(Peer):AMQP對話的任意一方。一個AMQP連線包括兩個端點(一個是客戶端,一個是伺服器)
搭檔(Partner):當描述兩個端點之間的互動過程時,使用術語“搭檔”來表示“另一個”端點的簡記法。
               比如我們定義端點A和端點B,當它們進行通訊時,端點B是端點A的搭檔,端點A是端點B的搭檔。
片段集(Assembly):段的有序集合,形成一個邏輯工作單元。
段(Segment):幀的有序集合,形成片段集中一個完整子單元。
幀(Frame):AMQP傳輸的一個原子單元。一個幀是一個段中的任意分片。
控制(Control):單向指令,AMQP規範假設這些指令的傳輸是不可靠的。
命令(Command):需要確認的指令,AMQP規範規定這些指令的傳輸是可靠的。
異常(Exception):在執行一個或者多個命令時可能發生的錯誤狀態
類(Class):一批用來描述某種特定功能的AMQP命令或者控制。
訊息頭(Header):描述訊息資料屬性的一種特殊段。
訊息體(Body):包含應用程式資料的一種特殊段。訊息體段對於伺服器來說完全透明——伺服器不能檢視或者修改訊息體。
訊息內容(Content):包含在訊息體段中的的訊息資料。
交換器(Exchange):伺服器中的實體,用來接收生產者傳送的訊息並將這些訊息路由給伺服器中的佇列。
交換器型別(Exchange Type):基於不同路由語義的交換器類。
訊息佇列(Message Queue):一個命名實體,用來儲存訊息直到傳送給消費者。
繫結器(Binding):訊息佇列和交換器之間的關聯。
繫結器關鍵字(Binding Key):繫結的名稱。一些交換器型別可能使用這個名稱作為定義繫結器路由行為的模式。
路由關鍵字(Routing Key):一個訊息頭,交換器可以用這個訊息頭決定如何路由某條訊息。
持久儲存(Durable):一種伺服器資源,當伺服器重啟時,儲存的訊息資料不會丟失。  
臨時儲存(Transient):一種伺服器資源,當伺服器重啟時,儲存的訊息資料會丟失。
持久化(Persistent):伺服器將訊息儲存在可靠磁碟儲存中,當伺服器重啟時,訊息不會丟失。
非持久化(Non-Persistent):伺服器將訊息儲存在記憶體中,當伺服器重啟時,訊息可能丟失。
虛擬主機(Virtual Host):一批交換器、訊息佇列和相關物件。
                        客戶端應用程式在登入到伺服器之後,可以選擇一個虛擬主機。

2.5 應用場景

AQMP是實現訊息機制的一種協議,訊息佇列主要有以下幾種應用場景:

1. 非同步處理

比如公司新入職一個員工,需要開通系統賬戶,有幾件事情要做,開通系統賬戶,發簡訊通知使用者,發郵件給員工,在公司內部通訊系統中傳送訊息給員工。其中發簡訊,發郵件,發內部通訊系統訊息,這三件事情可以序列,也可以並行,並行的好處就是可以提高效率。這時候可以使用MQ來實現執行。

2. 應用解耦

在公司內部系統中,有人事系統,OA系統,財務系統,外圍應用系統等等,當人事發生變動的時候(離職入職調崗),人事系統需要將這些變動通知給其他系統,這時只需人事系統傳送一條訊息,各個外圍系統訂閱該訊息,就可得知人事變動,與實時服務呼叫相比,如果人事系統掛掉,各個外圍系統不會受到影響,繼續執行。

3. 流量緩衝

在有些流量會瞬間暴增的場景下,如秒殺,為了防止流量突然增大而使得應用掛掉,可以引入MQ,將請求存入MQ中,如果超過了MQ的長度,就把請求丟棄掉,這樣來限制流量。

4. 日誌處理

將訊息佇列引入到日誌處理中,如kafka的應用,解決了大量日誌的傳輸問題。日誌客戶端負責採集日誌資料,並定期寫入kafka佇列,kafka負責接收,儲存和轉發日誌,日誌處理系統訂閱並消費kafka中的日誌資料。

相關推薦

訊息佇列AMQP協議

一、 訊息佇列 訊息佇列(Message Queue,簡稱MQ)提供非同步通訊協議,可以實現程序間通訊或同一程序不同執行緒間的通訊。其中‘訊息’是指包含必要資訊的資料。訊息的傳送者傳送完資料後,立即返回,訊息被儲存在訊息隊列當中,對這個訊息感興趣的消費者會訂閱

訊息佇列訊息佇列概述AMQP協議

轉載請註明出處:https://blog.csdn.net/jinixin/article/details/83552185     前面幾篇文章中談了rpc服務, rpc可用於程序間通訊, 使應用得以解耦, 而程序間通訊還可使用訊息佇列來完成. 本篇文章就簡

Linux訊息佇列執行緒例項理解

相較於程序,執行緒不僅擁有程序的併發性,相互獨立等特點,更有佔用資源較少,效率高等特點。 建立執行緒 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)

Redis 非同步訊息佇列延時佇列

        訊息中介軟體,大家都會想到  Rabbitmq 和 Kafka 作為訊息佇列中介軟體,來給應用程式之間增加非同步訊息傳遞功能。這兩個中介軟體都是專業的訊息佇列中介軟體,特性之多超出了大多數人的理解能力。但是這種屬於重量級的應

(五)RabbitMQ訊息佇列-安裝amqp擴充套件並訂閱/釋出Demo(PHP版)

本文將介紹在PHP中如何使用RabbitMQ來實現訊息的訂閱和釋出。我使用的系統依然是Centos7,為了方便,應用伺服器我使用Docker進行部署,容器環境:centos7+nginx+php5.6。 執行環境,安裝AMQP擴充套件: 如何安裝Docker我就不說了,網上很多教程非

10 訊息佇列一個簡單的視窗程式

訊息:當我們點選滑鼠的時候,或者當我們按下鍵盤的時候,作業系統都要把這些動作記錄下來,儲存到一個結構體中,這個結構體就是訊息; 訊息佇列:每個執行緒只有一個訊息佇列;訊息對列與執行緒相關的;訊息佇列就是一堆連結串列; 視窗與執行緒的關係:一個執行緒可以有多個視窗,一個視窗指對應一個執行緒;

轉 Redis作為訊息佇列RabbitMQ的效能對比

週末測試了一下RabbitMQ的效能,RabbitMQ是使用Erlang編寫的一個開源的訊息佇列,本身支援很多的協議:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它變的非常重量級,更適合於企業級的開發。個人認為,在網際網路開發中,使用訊息佇列,更多的因為在高併發環境下,由於來不及

[轉]Redis作為訊息佇列RabbitMQ的效能對比

週末測試了一下RabbitMQ的效能,RabbitMQ是使用Erlang編寫的一個開源的訊息佇列,本身支援很多的協議:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它變的非常重量級,更適合於企業級的開發。個人認為,在網際網路開發中,使用訊息佇列,更多的因為在高併發環境下,由於來不及同步處理,請

RabbitMQAMQP協議詳解

1. 訊息佇列的歷史 瞭解一件事情的來龍去脈,將不會對它感到神祕。讓我們來看看訊息佇列(Message Queue)這項技術的發展歷史。 Message Queue的需求由來已久,80年代最早在金融交易中,高盛等公司採用Teknekron公司的產品,當時的Message queuing軟體叫做:the in

訊息佇列AMQP和RabbitMQ

一、應用場景及優點 在專案設計、開發過程中,當我們遇到以下幾種情況都可以使用訊息佇列: 對於一些無需即時返回且耗時的操作;併發要求很高,資料處理很耗時,但是又無需及時返回資訊的操作;資料轉移類的操作,比如客戶端和內網都要進行資料傳輸和交換, 現有架構中, 客戶端不能直接

訊息中介軟體 AMQP協議 核心概念及原理

Headers Exchange A headers exchange is designed for routing on multiple attributes that are more easily expressed as message headers than a routing key. H

posix訊息佇列system v訊息佇列的區別

/*********************************************************************  * Author  : Samson  * Date    : 04/25/2012  * Test platform:  * 

uCosIII之訊息佇列記憶體管理

#define TX_MSG_MEM_BLK_NUM 30 //記憶體分割槽的記憶體塊數量 #define TX_MSG_MEM_BLK_SIZE 60 //記憶體分割槽的記憶體塊大小 #define TX_MSG_QUEUE_SIZE

Redis作為訊息佇列RabbitMQ的效能對比

週末測試了一下RabbitMQ的效能,RabbitMQ是使用Erlang編寫的一個開源的訊息佇列,本身支援很多的協議:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它變的非常重量級,更適合於企業級的開發。個人認為,在網際網路開發中,使用訊息佇列,更多的因為

RabbitMQ AMQP (高階訊息佇列協議)

目錄 RabbitMQ AMQP (高階訊息佇列協議) AMQP協議是Message Queue訊息佇列的一種協議,RabbitMQ 是基於AMQP協議實現的一種訊息佇列框架。 掌握RabbitMQ,必須要對AMQP的協議有所瞭解,才能使用的得心應手。 本文主要介紹AMQP協議和RabbitMQ的基本概念和

[2]AMQP(高階訊息佇列協議) ----QPID不得不說的事

如果說到AMQP協議,則不得不提的就是QPID。QPID的論壇現在十分的活躍,基本上白天提的問題,晚上馬上就能得到回覆。由此可見QPID的活躍程度。 大家可以到http://qpid.2158936.n2.nabble.com/網站上面註冊一個賬號,真的非常的好,吐血推薦給

AMQP高階訊息佇列協議

AMQP,即Advanced Message Queuing Protocol,一個提供統一訊息服務的應用層標準高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。基於此協議的客戶端與訊息中介軟體可傳遞訊息,並不受客戶端/中介軟體不同產品,不同的開發語言等

[1]AMQP(高階訊息佇列協議) ----入門

接觸AMQP協議已經有一段時間了,這個協議比想象的中的要複雜一些,特別是針對AMQP-1-0以前的版本。具體的概念,網上可以搜尋到很多的資料,本文借花獻佛,讓讀者對AMQP協議有一個大概的瞭解。重點是在後續章節的關於一些遇到的技術難點的解決方案的分享。 最新的AMQP協議

深入剖析 RabbitMQ —— Spring 框架下實現 AMQP 高階訊息佇列協議

前言 訊息佇列在現今資料量超大,併發量超高的系統中是十分常用的。本文將會對現時最常用到的幾款訊息佇列框架 ActiveMQ、RabbitMQ、Kafka 進行分析對比。詳細介紹 RabbitMQ 在 Sprinig 框架下的結構及實現原理,從Producer 端的事務、回撥函式(ConfirmCa

SpringBoot整合ActiveMQ訊息佇列和雙向佇列、點對點釋出訂閱

ActiveMQ 是Apache出品,最流行的,能力強勁的開源訊息匯流排。ActiveMQ 是一個完全支援JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。 &nbs