0 RabbitMQ概念
目錄
- 1、RabbitMQ基本概念
- 2、為什么使用消息隊列
- 3、RabbitMQ特點
- 4、基本概念解釋
- 4.1 宏觀
- 4.2 概念
- 4.3 消息路由
- Exchange類型
- 5、工作過程
- 6、持久化
| 1.0 | 初步版本 | 20180923 |
| 2.0 | 復習添加 | 20181007 |
1、RabbitMQ基本概念
- 消息是指在應用程序間傳送的數據;
- 消息可以非常的簡單,比如文本字符串,也可以更加的復雜,包含嵌入對象;
- 消息隊列(Message Queue)是一種應用間的通信方式,消息發送后可以立即返回,由消息系統來確保消息的可靠傳遞。消息發布者只管把消息發布到 MQ 中而不用管誰來取,消息使用者只管從 MQ 中取消息而不管是誰發布的。這樣發布者和使用者都不用知道對方的存在
2、為什么使用消息隊列
- 從上面的描述中可以看出消息隊列是一種應用間的異步協作機制
訂單系統
用戶點擊【下單】按鈕之后的業務邏輯可能包括:==扣減庫存==、==生成相應單據==、==發紅包==、==發短信通知==
在業務發展初期這些邏輯可能放在一起同步執行,隨著業務的發展訂單量增長,需要提升系統服務的性能,這時可以將一些不需要立即生效的操作拆分出來異步執行,比如發放紅包、發短信通知等。
這種場景下就可以用 MQ ,在下單的主流程(比如扣減庫存、生成相應單據)完成之后發送一條消息到 MQ 讓主流程快速完結,而由另外的單獨線程拉取MQ的消息(或者由 MQ 推送消息),當發現 MQ 中有發紅包或發短信之類的消息時,執行相應的業務邏輯
3、RabbitMQ特點
RabbitMQ 是一個由 Erlang 語言開發的 AMQP 的開源實現。
AMQP: Advanced Message Queue,高級消息隊列協議。它是應用層協議的一個開放標準,為面向消息的中間件設計,基于此協議的客戶端與消息中間件可傳遞消息,并不受產品、開發語言等條件的限制。
RabbitMQ 使用一些機制來保證可靠性,如持久化、傳輸確認、發布確認
在消息進入隊列之前,通過 Exchange 來路由消息的。對于典型的路由功能,RabbitMQ 已經提供了一些內置的 Exchange 來實現。針對更復雜的路由功能,可以將多個 Exchange 綁定在一起,也通過插件機制實現自己的 Exchange
多個 RabbitMQ 服務器可以組成一個集群,形成一個邏輯 Broker
隊列可以在集群中的機器上進行鏡像,使得在部分節點出問題的情況下隊列仍然可用
RabbitMQ 支持多種消息隊列協議,比如 STOMP、MQTT
RabbitMQ 幾乎支持所有常用語言,比如 Java、.NET、Ruby 等等
RabbitMQ 提供了一個易用的用戶界面,使得用戶可以監控和管理消息 Broker 的許多方面
如果消息異常,RabbitMQ 提供了消息跟蹤機制,使用者可以找出發生了什么
RabbitMQ 提供了許多插件,來從多方面進行擴展,也可以編寫自己的插件
4、基本概念解釋
4.1 宏觀
MQ的原理
消費者(consumer)訂閱某個隊列。生產者(producer)創建消息,然后發布到隊列(queue)中,最后將消息發送到監聽的消費者
4.2 概念
上面介紹過 RabbitMQ 是 AMQP 協議的一個開源實現,所以其內部實際上也是 AMQP 中的基本概念
- Message
消息是不具名的,它有==消息頭==和==消息體==組成。
消息體是不透明的,但是消息頭是有一系列的可選屬性組成
這些屬性包括routing-key(路由鍵),priority(相對于其它消息的優先權),delivery-mode(指出來該消息可能需要持久性存儲)等
- Publisher
消息的生產者,也是一個向交換器發布消息的客戶端應用程序
- Exchange
交換器,用來接收生產者發送的消息并且將這些消息路由給服務器中的隊列
- Binding
綁定,用于消息隊列和交換器之間的關聯,一個綁定就是基于路由鍵將交換器和消息隊列連接起來的路由規則,所以可以將交換器理解成一個由綁定構成的路由表
- Queue
消息隊列,用來保存消息直到發送給消費者,他是消息的容器,也是消息的終點。一個消息可投入一個或者多個隊列。消息一直在隊列里面,等待消費者連接到這個隊列將其取走
- Connection
網絡連接比如tcp連接
- Channel
信道,多路復用連接中的一條獨立的雙向數據流通道。信道是建立在真實的TCP連接內地虛擬連接,AMQP命令都是通過信道發出去的,不管是發布消息,訂閱隊列,還是接受消息,這些動作都是在信道完成的。
因為對于操作系統來說建立和銷毀TCP都是非常安昂貴的開銷,所以引入信道的概念,以此來復用一條TCP連接
- Consumer
消息的消費者,表示一個從消息隊列中取得消息的客戶端應用程序
- Virtual Host
虛擬主機,表示一批交換機,消息隊列和相關的對象。虛擬主機是共享相同的身份認證和加密環境的獨立服務器域。
每個vhost本質上就是一個mini版的RabbitMQ服務器,擁有自己的隊列、交換器、綁定和權限機制。
vhost是AMQP概念的基礎,必須在連接的時候指定,RabbitMQ默認的vhost是/
- Broker
表示消息隊列服務器實體
4.3 消息路由
AMQP 中消息的路由過程和 Java 開發者熟悉的 JMS 存在一些差別,AMQP 中增加了 Exchange 和 Binding 的角色。生產者把消息發布到 Exchange 上,消息最終到達隊列并被消費者接收,而 Binding 決定交換器的消息應該發送到那個隊列
Exchange類型
Exchange分發消息時根據類型的不同分發策略有區別,目前共四種類型:
direct、fanout、topic、headers 。headers 匹配 AMQP 消息的 header 而不是路由鍵,此外 headers 交換器和 direct 交換器完全一致,但性能差很多,目前幾乎用不到了,所以直接看另外三種類型
direct
消息中的路由鍵(routing key)如果和 Binding 中的 binding key 一致, 交換器就將消息發到對應的隊列中。路由鍵與隊列名完全匹配,如果一個隊列綁定到交換機要求路由鍵為“dog”,則只轉發 routing key 標記為“dog”的消息,不會轉發“dog.puppy”,也不會轉發“dog.guard”等等。它是完全匹配、單播的模式。
fanout
每個發到 fanout 類型交換器的消息都會分到所有綁定的隊列上去。fanout 交換器不處理路由鍵,只是簡單的將隊列綁定到交換器上,每個發送到交換器的消息都會被轉發到與該交換器綁定的所有隊列上。很像子網廣播,每臺子網內的主機都獲得了一份復制的消息。fanout 類型轉發消息是最快的
topic
topic 交換器通過模式匹配分配消息的路由鍵屬性,將路由鍵和某個模式進行匹配,此時隊列需要綁定到一個模式上。
它將路由鍵和綁定鍵的字符串切分成單詞,這些單詞之間用點隔開。它同樣也會識別兩個通配符:符號“#”和符號“”。#匹配0個或多個單詞,匹配不多不少一個單詞
5、工作過程
- 生產者客戶端
客戶端連接到RabbitMQ服務器上,打開一個消息通道(channel);
客戶端聲明一個消息交換機(exchange),并設置相關屬性。
客戶端聲明一個消息隊列(queue),并設置相關屬性。
客戶端使用routing key在消息交換機(exchange)和消息隊列(queue)中建立好綁定關系。
客戶端投遞消息都消息交換機(exchange)上
客戶端關閉消息通道(channel)以及和服務器的連接。
- 服務器端
exchange接收到消息后,根據消息的key(這個key的產生規則暫時沒研究,有知道的小伙伴可以留言告訴我)和以及設置的binding,進行消息路由,將消息投遞到一個或多個消息隊列中。
關于exchange也有幾個類型:
(1). Direct交換機:完全根據key進行投遞。例如,綁定時設置了routing key為abc,客戶端提交信息提交信息時只有設置了key為abc的才會投遞到隊列;
(2).Topic交換機:在key進行模式匹配后進行投遞。例如:符號”#”匹配一個或多個字符,符號””匹配一串連續的字母字符,例如”abc.#”可以匹配”abc.def.ghi”,而”abc.”只可以匹配”abc.def”。
(3).Fanout交換機:它采取廣播模式,消息進來時,將會被投遞到與改交換機綁定的所有隊列中。
6、持久化
RabbitMQ支持數據持久化,也就是把數據寫在磁盤上,可以增加數據的安全性。消息隊列持久化包括三個部分:
消息交換機(exchange)持久化,在聲明時指定durable為1
消息隊列(queue)持久化,在聲明時指定durable為1
消息持久化,在投遞時指定delivery_mode為2(1是非持久化)
如果消息交換機(exchange)和消息隊列(queue)都是持久化的話,那么他們之間的綁定(Binding)也是持久化的。如果消息交換機和消息隊列之間一個持久化、一個非持久化,那么就不允許綁定。
轉載于:https://www.cnblogs.com/zhaod/p/11379089.html
總結
以上是生活随笔為你收集整理的0 RabbitMQ概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零写一个编译器(八):语义分析之构造符
- 下一篇: 从零写一个编译器(九):语义分析之构造抽