|
簡介 RabbitMQ(消息隊列/消息中間件)是流行的開源消息隊列系統(tǒng),是AMQP(Advanced Message Queuing Protocol高級消息隊列協(xié)議)的標準實現(xiàn)。用Erlang語言開發(fā)。RabbitMQ具有良好的性能和實效性,同時還支持集群和負載部署,非常適用于在較大規(guī)模的分布式系統(tǒng)中使用。 Java常見的消息隊列技術(shù):RabbitMQ、ActiveMQ、Redis(List數(shù)據(jù)格式)、JMS(Java Message Service)等。 RabbitMQ官網(wǎng):http://www./ 消息隊列比較:http://blog.csdn.net/sunxinhere/article/details/7968886 RabbitMQ下載地址:http://www./download.html 安裝 安裝erlang依賴。
下載erlang的倉庫: wget http://packages./erlang-solutions-1.0-1.noarch.rpm (如果提示wget不是一個命令執(zhí)行yum install wget) 安裝erlang倉庫:rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
安裝RabbitMQ
(*.tar.xz 需要使用xz -d 解壓后在 tar -xf 解壓) (安裝xz: yum install xz.x86_64)① ② xz -d rabbitmq-server-generic-unix-3.6.12.tar.xz
RabbitMQ配置 啟動RabbitMQ后執(zhí)行:
消息隊列運行原理 從上圖可以看出、生產(chǎn)者、消息隊列、消費者是最重要的三個概念: 生產(chǎn)者(Producer):創(chuàng)建消息到消息隊列中。 消息隊列(Queue):存儲消息。 消費者(Consumer):監(jiān)聽指定消息隊列,當消息隊列接收到消息后,獲取消息并處理。 RabbitMQ:創(chuàng)建消息隊列,并提供API給生產(chǎn)者和消費者進行存取消息。 生產(chǎn)者產(chǎn)生消息并調(diào)用RabbitMQ的API將消息加入到對應(yīng)的消息隊列中,消費者通過RabbitMQ的API從消息隊列中獲取消息進行消費。 RabbitMQ核心 RabbitMQ的核心由虛擬機、交換機、隊列、綁定這四部分組成。 虛擬機(Virtual Host) 在RabbitMQ中虛擬機主要是用于控制權(quán)限顆粒度,RabbitMQ默認的虛擬機路徑為/。一個虛擬機包含一組交換機、隊列和綁定。 例如admin的virtual host為/、zs的virtual host為/test。假設(shè)RabbitMQ Server中有/test /hello /demo,那么admin可以操作全部虛擬機下的隊列而zs只可以操作/test下的隊列。 交換機/路由器(Exchange) RabbitMQ中的交換機本身并不進行消息的存儲,主要用做進行消息的轉(zhuǎn)發(fā)到指定規(guī)則的隊列內(nèi)。生產(chǎn)者在傳遞消息時并不是直接傳到隊列中,而是先發(fā)送給交換機,交換機會通過消息中的routing_key按照特定的路由算法轉(zhuǎn)發(fā)給路由綁定的對應(yīng)隊列。Exchange可以和多個Queue綁定,Exchange本身也可以進行持久化、臨時、自動刪除。 路由規(guī)則 直接交換器(Dirct) Dirct的工作方式類似單播,Exchange會將x消息轉(zhuǎn)發(fā)至ROUTING_KEY完全匹配的隊列中。 廣播交換器(Fanout) Fanout的工作方式就是廣播,Exchange會將消息轉(zhuǎn)發(fā)至所有與其綁定的隊列中,而不管ROUTING_KEY的是什么。 主題交換器(Topic) Topic的工作方式是模糊匹配,Exchange會將消息轉(zhuǎn)發(fā)和ROUTING_KEY匹配模式相同的所有隊列。比如ROUTING_KEY為user.dj的Message會轉(zhuǎn)發(fā)給綁定匹配模式為包含*user.dj*的隊列( * 表是匹配一個任意詞組,#表示匹配0個或多個詞組)。 頭交換機(Headers)[了解] Headers類型的exchange使用的比較少,它也是忽略routingKey的一種路由方式。是使用Headers來匹配的。Headers是一個鍵值對,可以理解成Hashtable。發(fā)送者在發(fā)送的時候定義一些鍵值對,接收者也可以再綁定時候傳入一些鍵值對,兩者匹配的話,則對應(yīng)的隊列就可以收到消息。匹配有兩種方式all和any。這兩種方式是在接收端必須要用鍵值''x-mactch''來定義。all代表定義的多個鍵值對都要滿足,而any則代碼只要滿足一個就可以了。fanout,direct,topic exchange的routingKey都需要要字符串形式的,而headers exchange則沒有這個要求,因為鍵值對的值可以是任何類型。 綁定binding 所謂的binding就是將交換機與一個特定的隊列綁定起來,且交換機與隊列的關(guān)系可以是一對一、一對多、多對多。 消息隊列(queue) Queue是用來存儲消息的容器,RabbitMQ提供了FIFO(先進先出)的機制,可以緩存消息也可以將消息持久化、臨時或者自動刪除。 設(shè)置為持久化的隊列,queue中的消息會在server本地硬盤存儲一份,防止系統(tǒng)奔潰后數(shù)據(jù)丟失。 設(shè)置為臨時隊列,queue中的數(shù)據(jù)在系統(tǒng)重啟之后就會丟失 設(shè)置為自動刪除的隊列,當不存在用戶(生產(chǎn)者和消費者)連接到server,隊列中的數(shù)據(jù)會被自動刪除。 (消費者消費完消息后消息就不存在了和設(shè)置了什么狀態(tài)無關(guān)) Message(消息體) Message:由Header和Body組成,Header是由生產(chǎn)者添加的各種屬性的集合,包括Message是否被持久化、由哪個Message Queue接受、優(yōu)先級是多少等。而Body是真正需要傳輸?shù)臄?shù)據(jù)。 通信過程 假設(shè)P1和C1注冊了相同的Broker,Exchange和Queue。P1發(fā)送的消息最終會被C1消費?;镜耐ㄐ帕鞒檀蟾湃缦滤荆?/p>
Consumer收到消息時需要顯式的向rabbit broker發(fā)送basic.ack消息或者consumer訂閱消息時設(shè)置auto_ack參數(shù)為true。在通信過程中,隊列對ACK的處理有以下幾種情況:
|
|
|