RabbitMQ
常用命令
- 設(shè)置文件夾結(jié)構(gòu)(日志文件夾愕乎,數(shù)據(jù)庫文件夾 - 存儲服務(wù)器信息,比如元數(shù)據(jù)陆错、虛擬主機等)
$ mkdir -p /var/log/rabbitmq
$ mkdir -p /var/lib/rabbitmq/mnesia/rabbit
- 啟動 - 生產(chǎn)環(huán)境運行
RabbitMQ
時骤星,通常建一個rabbitmq
用戶,為其賦予文件夾權(quán)限翠储,而非使用普通用戶賬戶來運行所有命令绘雁。
$ ./sbin/rabbitmq-server
- 查看服務(wù)器狀態(tài)
$ ./sbin/rabbitmqctl status
-
vhost
和權(quán)限控制無法通過AMQP
協(xié)議創(chuàng)建(不同于交換器,隊列和綁定)援所,需要通過./sbin/
目錄中的rabbitmqctl
工具來創(chuàng)建
遠程控制方法: 通過指定-n rabbit@[server_name]
來管理遠程RabbitMQ
節(jié)點莫秆,@
左邊是Erlang
應(yīng)用程序名稱,這里永遠是rabbit
在旱,右邊是服務(wù)器主機名或者IP
地址。**需要確保運行Rabbit
節(jié)點的服務(wù)器和運行rabbitmqctl
的工作站安裝了相同的Erlang cookie
// 1. 創(chuàng)建虛擬機
$ ./sbin/rabbitmqctl add_vhost [vhost_name]
// 2. 刪除虛擬機
$ ./sbin/rabbitmqctl delete_vhost [vhost_name]
// 3. 查看虛擬機
$ ./sbin/rabbitmqctl list_vhosts
- 重要概念
vhost
: 本質(zhì)上是一個mini
版的RabbitMQ
服務(wù)器历帚,擁有自己的交換器、綁定杠娱、隊列...挽牢,更重要的是,它擁有自己的權(quán)限控制摊求。這使得你能夠安全地使用一個RabbitMQ
服務(wù)器來服務(wù)眾多應(yīng)用程序禽拔,而不用擔心別人刪除你的隊列,不用擔心隊列室叉、交換器的命名沖突睹栖,有利于集群部署。
vhost
之于Rabbit
就像是虛擬機之于物理服務(wù)器一樣:它們通過在各個實例間提供邏輯上的分離茧痕,允許你為不同的應(yīng)用程序安全保密的運行數(shù)據(jù)野来。- 消費者對消息的確認和告訴生產(chǎn)者消息已經(jīng)被接收了這兩件事情毫不相關(guān)
消費者通過確認命令告訴RabbitMQ
它已經(jīng)正確的接收了消息,同時RabbitMQ
才能安全的把消息從隊列刪除- 消費者和生產(chǎn)者都能通過
queue.declare
命令來創(chuàng)建隊列踪旷,但如果消費者在同一條信道上訂閱了另一個隊列的話曼氛,就無法再聲明隊列了。必須先取消訂閱令野,將信道置為傳輸
模式- 隊列設(shè)置中一些有用的參數(shù)
exclusive
(獨占的):如果設(shè)置為true
舀患,隊列將變?yōu)樗接械模藭r只有你的應(yīng)用程序才能消費隊列消息彩掐,當你想要限制一個隊列只有一個消費者的時候很有幫助auto-delete
:當最后一個消費者取消訂閱的時候构舟,隊列就會自動刪除,如果你需要臨時隊列只為一個消費者服務(wù)的話堵幽,請結(jié)合使用auto-delete
和exclusive
狗超。當消費者斷開連接時,隊列就被移除了
basic.reject
允許消費者拒絕RabbitMQ
發(fā)送的消息朴下,如果把reject
命令的requeue
參數(shù)設(shè)置為true
的話努咐,RabbitMQ
會將消息發(fā)送給下一個訂閱的消費者,如果設(shè)置為false
的話殴胧,RabbitMQ
立即會把消息從隊列中移除渗稍。dead letter
死信隊列:用來存放那些被拒絕而不重入隊列的消息,需要使用reject
命令并將requeue
參數(shù)設(shè)置為false
团滥。死信隊列讓你通過檢測 (拒絕 / 未送達) 的消息來發(fā)現(xiàn)問題
QA:
1. 如果聲明一個已經(jīng)存在的隊列會發(fā)生什么灸姊?
如果聲明參數(shù)完全匹配現(xiàn)存隊列拱燃,
Rabbit
就什么也不做,并成功返回力惯。如果參數(shù)不匹配的話碗誉,隊列聲明嘗試會失敗召嘶,如果只是想檢測隊列是否存在,則可以設(shè)置queue.declare
的passive
(被動的) 為true
哮缺。在該設(shè)置下弄跌,如果隊列存在,那么queue.declare
命令會成功返回尝苇;如果隊列不存在铛只,queue.declare
命令也不會創(chuàng)建隊列,而會返回一個錯誤茎匠。
2. 由生產(chǎn)者還是消費者來創(chuàng)建隊列格仲?
消費者才需要訂閱隊列押袍,但是還要考慮生產(chǎn)者能否承擔得起丟失消息诵冒。發(fā)送出去的消息如果路由到了不存在的隊列的話,
Rabbit
會忽略它們谊惭。如果不能承擔消息丟失汽馋,最好生產(chǎn)者和消費者都嘗試去創(chuàng)建隊列
3. 如何保證消息的持久化?
必須設(shè)置成如下:
delivery mode(投遞模式)
必須設(shè)置為2
(persistent)持久化圈盔, 2 是非持久化(non-persistent)- 發(fā)送到持久化的交換器
- 到大持久化的隊列
4. 持久化原理豹芯?
先將消息寫入磁盤上的一個持久化文件。當發(fā)布一條持久性消息到持久化交換器上時驱敲,
Rabbit
會把消息寫入到日志文件后才發(fā)送響應(yīng)铁蹈。注意:如果之后這條消息路由到了非持久化隊列,它會自動從持久性日志中移除众眨,并且無法從服務(wù)器重啟中恢復(fù)握牧。 一旦從持久化隊列中消費了一條持久性消息(并且手動確認了它),Rabbit
在持久性日志中把這條消息標記為等待垃圾收集娩梨。
一. direct
交換器:如果路由鍵匹配的話沿腰,消息就被投遞到對應(yīng)的隊列
二. fanout
交換器:當發(fā)送一條消息到 fanout
交換器時,它會把消息投遞給所有附加在此交換器上的隊列
應(yīng)用場景:舉例來說狈定,一個
web
應(yīng)用程序可能需要在用戶上傳圖片時颂龙,用戶相冊必須清除緩存,同時用戶應(yīng)該得到積分獎勵纽什。你可以將兩個隊列綁定到圖片上傳交換器上措嵌。一個用于清除緩存,一個用戶增加用戶積分芦缰。當有新需求需要添加其他規(guī)則時企巢,只要為新的消費者寫一段代碼,然后聲明新的隊列并將其綁定到 fanout
交換器上即可饺藤,而不用修改原來的代碼包斑。
三. topic
交換器: