最近研究RabbitMQ的一些心得

      關於RabbitMQ的文章網上轉來轉去最多的是一篇<<[RabbitMQ+Python入門經典] 兔子和兔子窩>>(隨便給個連接了).這篇文章的講解是很風趣,很適合用來理解一些基礎概念.理解了概念之後就要進行一些實際性的實驗了.原文給的python的例子.不是筆者想要的,筆者要用php.php

 

      關於phprabbitmq網上又有一篇被轉來轉去的文章<<安裝 php-rabbit: RabbitMQ PHP 擴展>>.文章裏提到的php-rabbit,筆者死活是訪問不了:python

 

      讓幾個不一樣地方的哥們幫着訪問下載,都下載不了,推斷多是這個項目被刪除了.問一個哥們兒,說他們那用的是php-amqp.從官方下的庫居然很差使.因而死皮懶臉的管哥們要了他們正在用的版本和示例,又鑑於網上 php-amqp版本的rabbit操做細節甚少(能夠說沒有麼?),因而有了今天這份兒總結.ubuntu

測試平臺:安全

Distributor ID: Ubuntu服務器

Description: Ubuntu 9.10ide

Release: 9.10函數

Codename: karmic測試

 

      既然是ubuntu,安裝rabbitmq服務端是很easy的事情,一條命令搞定:this

apt-get install rabbitmq-serverspa

 

      接下來的就是折騰了將近兩天的心得體會了.

 

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

 

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

相關文章
相關標籤/搜索