1.必需掌握的指令
添加使用者:
rabbitmqctl add_user rainbird password
添權重限:
rabbitmqctl set_permissions -p "/" rainbird ".*" ".*" ".*"
删除測試使用者:
rabbitmqctl delete_user guest
所有指令清單(很簡單的英文):
add_user <UserName> <Password>
delete_user <UserName>
change_password <UserName> <NewPassword>
list_users
add_vhost <VHostPath>
delete_vhost <VHostPath>
list_vhosts
set_permissions [-p <VHostPath>] <UserName> <Regexp> <Regexp> <Regexp>
clear_permissions [-p <VHostPath>] <UserName>
list_permissions [-p <VHostPath>]
list_user_permissions <UserName>
list_queues [-p <VHostPath>] [<QueueInfoItem> ...]
list_exchanges [-p <VHostPath>] [<ExchangeInfoItem> ...]
list_bindings [-p <VHostPath>]
list_connections [<ConnectionInfoItem> ...]
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和監聽端口
出于一些需要,比如我們有多個ip,我們希望rabbitmq僅運作在指定的ip上.或者考慮到安全問題,我們希望修改一下rabbitmq的監聽端口.預設安裝完成以後,在/etc下面會有一個rabbitmq的空目錄,這時候我們需要手工建立rabbitmq.conf,并寫入相關内容.
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
293 while ($read < $n && (false !== ($buf = fread($this->sock, $n - $read))))
294 {
295 usleep(50000);
296 $read += strlen($buf);
297 $res .= $buf;
298 }
筆者的出發點是對的,隻是沒找對while.可能有人會奇怪為什麼要用usleep(50000)呢?實際上筆者有遇到運作php起來的daemon導緻cpu100%的情況.當時筆者加的是usleep(500000)也就是半秒鐘.這樣就可以使程序看上去cpu占用為0.沒想到再降一個數量級也是可以正常的,這次算賺到了.
7.學到了error_log函數
以前有見過這個函數,以為是向系統日志裡寫log的時候才用得到呢,沒想到還可以像下面這樣用:
function debug_msg($s)
{
//error_log($s);
}
在不同的地方寫上debug_msg,最後不用的時候時候,直接注釋掉error_log,不錯的小技巧!
暫時就摸索出來這麼多東西了,準備拿幾個不重要的任務跑跑穩定性試試.