1.必需掌握的指令
新增使用者:
rabbitmqctl add_user rainbird password
新增許可權:
rabbitmqctl set_permissions -p "/" rainbird ".*" ".*" ".*"
刪除測試使用者:
rabbitmqctl delete_user guest
所有指令列表(很簡單的英文):
add_user
delete_user
change_password
list_users
add_vhost
delete_vhost
list_vhosts
set_permissions [-p ]
clear_permissions [-p ]
list_permissions [-p ]
list_user_permissions
list_queues [-p ] [...]
list_exchanges [-p ] [...]
list_bindings [-p ]
list_connections [...]
2.vhost / 不能刪除
刪除/以後,新建立的vhost不能正常使用(即便不刪除/,新建立的vhost也是不能正常使用).不知道為什麼,有待研究.
3.關於持久化
示例裡沒有一點兒和持久化相關的東東,而這卻是筆者最關心的,想想作為訊息伺服器如果不能保證訊息一定被接收到,算什麼事兒啊?比著網上狂轉的python版本從php-amqp的庫里一點一點兒翻,找到了如下持久化的設定:
接收端宣告佇列和交換機自動建立:
$ch->queue_declare($_queue,false,true,false,false);
第三個引數設定true保證伺服器重啟後,自動建立佇列
第五個引數設定成false防止接收端沒連線的時候丟失訊息
$ch->exchange_declare($exchange, 'direct', false, true, false);
第四個引數設定true保證重啟後,自動建立交換機
第五個引數設定false防止接收端斷開後,交換機被刪除
發布端宣告訊息持久:
$message = new amqpmessage(serialize($object), array('content_type' => 'text/plain', 'delivery_mode' => 2));
同時滿足了上面三個條件,就可以保證未接收的訊息在伺服器意外重啟以後依然存在了.
4.持久化的後遺症
比如說你初始化了乙個佇列msgs.你會發現它真的持久了!每次伺服器端重啟後,通過list_queues命令檢視的時候都存在.但是時間久了,這個msgs我們並不需要了,怎麼辦呢?筆者發現,想清除這個佇列只能刪除它所在的vhost,然後再重建vhost,再設定vhost的許可權.
rabbitmqctl delete_vhost /
rabbitmqctl add_vhost /
rabbitmqctl set_permissions -p / rainbird '.*' '.*' '.*'
要注意,如果這個操作過程中有接收端處於連線狀態它們不會自動斷開,但也不會再收到訊息,需要手動重新連線一下.
5.關於修改監聽ip和監聽埠
vi /etc/rabbitmq/rabbitmq.conf
rabbitmq_node_ip_address=0.0.0.0
rabbitmq_node_port=2222
儲存以後重啟服務就生效了.
這個東東網上又沒介紹,翻了半天+無限嘗試才搞出來.
6.關於執行接收端cpu100%問題
第一眼看到接收端會執行乙個while等待訊息的時候,筆者就知道這個程序肯定cpu占用會100%.在**裡幾處while嘗試新增usleep無效後,筆者最後還是在官方的問題列表裡找到了答案:
vi +286 amqp_wire.inc
while ($read < $n && (false !== ($buf = fread($this->sock, $n - $read))))
筆者的出發點是對的,只是沒找對while.可能有人會奇怪為什麼要用usleep(50000)呢?實際上筆者有遇到執行php起來的daemon導致cpu100%的情況.當時筆者加的是usleep(500000)也就是半秒鐘.這樣就可以使程序看上去cpu占用為0.沒想到再降乙個數量級也是可以正常的,這次算賺到了.
7.學到了error_log函式
以前有見過這個函式,以為是向系統日誌裡寫log的時候才用得到呢,沒想到還可以像下面這樣用:
function debug_msg($s)
在不同的地方寫上debug_msg,最後不用的時候時候,直接注釋掉error_log,不錯的小技巧!
rabbitmq 基本操作
1,basic.consum 訂閱訊息 2,basic.get 獲取單條訊息 3,basic.ack 消費者確認收到訊息 可以通過設定auto ack 引數為true 來自動確認 4,basic.reject 拒絕接受 訊息 有個requeue 引數 設定為ture的話,重新放入佇列,設定為fals...
RabbitMQ高階操作
rabbitmqctl reset移除所有資料,要在.rabbitmqctl stop後使用 rabbitmqctl join cluster ram 組成集群命令 ram記憶體級別 rabbitmqctl cluster status檢視集群狀態 rabbitmqctl change cluste...
python 操作RabbitMq詳解
一 簡介 rabbitmq 是實現了高階訊息佇列協議 amqp 的開源訊息 中介軟體。訊息佇列是一種應用程式對應用程式的通行方式,應用程式通過寫訊息,將訊息傳遞於佇列,由另一應用程式讀取 完成通訊。而作為中介軟體的 rabbitmq 無疑是目前最流行的訊息佇列之一。rabbitmq 應用場景廣泛 系...