上一博客把RabbitMQ的安裝配置介紹了下,今天主要是介紹下RabbitMQ的一些基礎名詞。
一、什么是RabbitMQ?用它能做什么?
1.簡介
AMQP,即Advanced Message Queuing Protocol,高級消息隊列協(xié)議,是應用層協(xié)議的一個開放標準,為面向消息的中間件設計。消息中間件主要用于組件之間的解耦,消息的發(fā)送者無需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、隊列、路由(包括點對點和發(fā)布/訂閱)、可靠性、安全。RabbitMQ是一個開源的AMQP實現(xiàn),服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。
2.作用
消息中間件之間解耦,以網(wǎng)上商城為例,用戶下單時可能會有大并發(fā)量,服務器壓力也會增大,特別是類似雙11的時候,那如何解決呢?可以使用消息隊列將訂單信息放在隊列中,下單后付款需要把訂單信息傳給倉庫并會發(fā)送短信或者郵箱,倉庫這邊又聯(lián)系著進銷存系統(tǒng),這樣如果把網(wǎng)上商城系統(tǒng)和進銷存系統(tǒng)都放在一起,那就會更加龐大不利于系統(tǒng)解耦,體現(xiàn)不了高內(nèi)聚低耦合的思想。同時會把訂單信息通過郵箱或者短信發(fā)送給用戶,這樣會調(diào)用發(fā)送郵件或短信的系統(tǒng),發(fā)送郵件或短信的速度速度有限,高峰時可能會將服務器爆了,這種情況可以使用消息隊列來起到錯峰的作用。
二、名詞介紹
1.ConnectionFactory、Connection、Channel
ConnectionFactory從名詞可以看出Connection工廠,它主要用來創(chuàng)建Connection。Connection客戶端與服務器打交道需要先創(chuàng)建與服務器的鏈接,然后通過管道Channel來進行操作。
2.Queue隊列
RabbitMQ中的消息都只能存儲在Queue中,相同屬性的queue可以重復定義,有以下幾個屬性。
- 持久性:如果啟用,隊列將會在server重啟前都有效。
- 自動刪除:如果啟用,那么隊列將會在所有的消費者停止使用之后自動刪除掉自身。
- 惰性:如果沒有聲明隊列,那么在執(zhí)行到使用的時候會導致異常,并不會主動聲明。
- 排他性:如果啟用,隊列只能被聲明它的消費者使用
3.生產(chǎn)者消費者模式
生產(chǎn)者消費者模式是通過一個容器來解決生產(chǎn)者和消費者的強耦合問題,生產(chǎn)者和消費者彼此之間不直接通訊,而通過阻塞隊列來進行通訊,所以生產(chǎn)者生產(chǎn)完數(shù)據(jù)之后不用等待消費者處理,直接扔給阻塞隊列,消費者不找生產(chǎn)者要數(shù)據(jù),而是直接從阻塞隊列里取,阻塞隊列就相當于一個緩沖區(qū),平衡了生產(chǎn)者和消費者的處理能力。一個生產(chǎn)者可以有多個消費者,例如上面的網(wǎng)上商城的例子中,生產(chǎn)者是網(wǎng)上商城系統(tǒng)的訂單,消費者是倉庫系統(tǒng)、郵件、短信服務系統(tǒng)以及日志系統(tǒng)等。
4.Message acknowledgment消息回執(zhí)
比如在下單過程中用戶下單后需要給倉庫進銷存系統(tǒng)、郵件服務系統(tǒng)、日志系統(tǒng)等,而每個系統(tǒng)又會創(chuàng)建多個消費者,此時消息隊列并不會就把消息刪除,而是需要發(fā)送一個回執(zhí),以防止消費者宕機等原因?qū)е孪G失。這里有一個需要注意的地方就是這里沒有timeout超時的概念,一個消費者處理消息時間再長也不會導致該消息被發(fā)送給其他消費者(多個消費者),除非它的RabbitMQ連接斷開,在消費者消費之后要記得發(fā)送回執(zhí),不然會一直堆積在隊列中,消費者重啟后會重復消費這些消息并重復執(zhí)行業(yè)務邏輯。
5.持久化
RabbitMQ服務器也有重啟或宕機的可能性,為了不讓消息丟失,我們可以將Queue與Message都設置為可持久化的(durable),這樣可以保證絕大部分情況下我們的RabbitMQ消息不會丟失。
6.Prefetch count
使用Prefetch count可以實現(xiàn)負載均衡,多個消費者消費一個消息隊列時,可能每個消費者處理信息的時間快慢不同,不能讓有的累死有的餓死,可以通過