天天看點

rabbitmq操作指令

      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,不錯的小技巧!

      暫時就摸索出來這麼多東西了,準備拿幾個不重要的任務跑跑穩定性試試.

繼續閱讀