RabbitMQ
RabbitMQ 是一個由 Erlang 語言開發的 AMQP
的開源實現。最初起源於金融系統,用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。html
消息隊列
先從基礎開始,加深下對消息隊列的認識git
概念
- 中文:消息隊列
- 外文:Message Queue
- 含義:消息的傳輸過程當中
保存消息的容器
基礎工做模型
消息發佈者----發佈---->消息隊列<----訂閱----消息消費者github
特色
- 可做爲兩個應用之間的通訊方式
- 可三無論(WHO、WHERE、WHEN)
消息發佈者
,不用管信息消費者
,是誰,在哪裏,何時來MQ中獲取消息
消息消費者
,不用管信息發佈者
,是誰,在哪裏,何時把消息發佈到MQ中
使用場景
- 異步處理
- 應用解耦
- 限流削鋒
- 日誌處理
- 消息通信
感受其核心在於:異步與解耦,這兩個層面 這篇博客整理的不錯:關於消息隊列的使用web
AMQP
既然RabbitMQ是AMQP的實現,那麼AMQP至關因而一個標準,因此我感受是須要先作個大概的瞭解spring
Advanced Message Queue,高級消息隊列協議。它是應用層協議的一個開放標準,爲面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制。bash
先了解一下,相關的技術術語,對後面的理解會有幫助服務器
- Message 消息,消息是不具名的,它由消息頭和消息體組成。消息體是不透明的,而消息頭則由一系列的可選屬性組成,這些屬性包括routing-key(路由鍵)、priority(相對於其餘消息的優先權)、delivery-mode(指出該消息可能須要持久性存儲)等。
- Publisher 消息的發佈者(也有叫Producer的,生產者,兩個意思差很少),是一個向交換器發佈消息的客戶端應用程序。
- Exchange 交換器,用來接收生產者發送的消息並將這些消息路由給服務器中的隊列。
- Binding 綁定,用於消息隊列和交換器之間的關聯。一個綁定就是基於路由鍵將交換器和消息隊列鏈接起來的路由規則,因此能夠將交換器理解成一個由綁定構成的路由表。
- Queue 消息隊列,用來保存消息直到發送給消費者。它是消息的容器,也是消息的終點。一個消息可投入一個或多個隊列。消息一直在隊列裏面,等待消費者鏈接到這個隊列將其取走。
- Connection 網絡鏈接,好比一個TCP鏈接。
- Channel 信道,多路複用鏈接中的一條獨立的雙向數據流通道。信道是創建在真實的TCP鏈接內地虛擬鏈接,AMQP 命令都是經過信道發出去的,不論是發佈消息、訂閱隊列仍是接收消息,這些動做都是經過信道完成。由於對於操做系統來講創建和銷燬 TCP 都是很是昂貴的開銷,因此引入了信道的概念,以複用一條 TCP 鏈接。
- Consumer 消息的消費者,表示一個從消息隊列中取得消息的客戶端應用程序。
- Virtual Host 虛擬主機,表示一批交換器、消息隊列和相關對象。虛擬主機是共享相同的身份認證和加密環境的獨立服務器域。每一個 vhost 本質上就是一個 mini 版的 RabbitMQ 服務器,擁有本身的隊列、交換器、綁定和權限機制。vhost 是 AMQP 概念的基礎,必須在鏈接時指定,RabbitMQ 默認的 vhost 是 / 。
- Broker 表示消息隊列服務器實體。
更多詳情,可查看《AMQP 0-9-1 簡介》網絡
RabbitMQ的特色
- 可靠性(Reliability) RabbitMQ 使用一些機制來保證可靠性,如持久化、傳輸確認、發佈確認。
- 靈活的路由(Flexible Routing) 在消息進入隊列以前,經過 Exchange 來路由消息的。對於典型的路由功能,RabbitMQ 已經提供了一些內置的 Exchange 來實現。針對更復雜的路由功能,能夠將多個 Exchange 綁定在一塊兒,也經過插件機制實現本身的 Exchange 。
- 消息集羣(Clustering) 多個 RabbitMQ 服務器能夠組成一個集羣,造成一個邏輯 Broker 。
- 高可用(Highly Available Queues) 隊列能夠在集羣中的機器上進行鏡像,使得在部分節點出問題的狀況下隊列仍然可用。
- 多種協議(Multi-protocol) RabbitMQ 支持多種消息隊列協議,好比 STOMP、MQTT 等等。
- 多語言客戶端(Many Clients) RabbitMQ 幾乎支持全部經常使用語言,好比 Java、.NET、Ruby 等等。
- 管理界面(Management UI) RabbitMQ 提供了一個易用的用戶界面,使得用戶能夠監控和管理消息 Broker 的許多方面。
- 跟蹤機制(Tracing) 若是消息異常,RabbitMQ 提供了消息跟蹤機制,使用者能夠找出發生了什麼。
- 插件機制(Plugin System) RabbitMQ 提供了許多插件,來從多方面進行擴展,也能夠編寫本身的插件。
RabbitMQ下載和安裝
http://www.rabbitmq.com/download.html 沒啥好說的,看官網異步
基本命令
啓動RabbitMQ
$ rabbitmq-server
添加用戶
RabbitMQ默認提供的guest用戶只能本地訪問,因此額外建立用戶用於測試 這裏添加一個用戶:用戶名demo
,密碼demo123
分佈式
$ rabbitmqctl add_user demo demo123
啓用web管理插件
$ rabbitmq-plugins enable rabbitmq_management
更多命令,能夠查看官方文檔,比較全面,http://www.rabbitmq.com/manpages.html
Spring Boot集成+使用
最基本的
搭了一個最簡單的demo,備忘 https://github.com/michaelzx/spring-boot-rabbit-demo 一個發佈者工程、一個消費者工程 能夠多開幾個實例,體驗下:N發佈者+N消費者
廣播(訂閱)
N個消費者,消費同一個隊列,每一個人都能拿到相同的消息
感受消費者,只能拿到其在線時的消息,待驗證
參考文章:《SpringBoot的RabbitMQ消息隊列: 4、第三模式"Publish/Subscribe"》
參考文章
《RabbitMq官方文檔》 《RabbitMQ 中文文檔》 《消息隊列之 RabbitMQ》 《spring boot集成RabbitMQ》 《RabbitMQ的應用場景以及基本原理介紹》 《Spring AMQP中文文檔》 《RabbitMQ從入門到精通》
https://blog.csdn.net/lxhjh/article/category/6836687