欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

rabbitmq操作命令

程序员文章站 2022-07-13 15:11:34
...

 

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

 

      暂时就摸索出来这么多东西了,准备拿几个不重要的任务跑跑稳定性试试.