文档章节

最近研究RabbitMQ的一些心得

unibigbear
 unibigbear
发布于 2016/06/06 17:14
字数 1225
阅读 8
收藏 0

 

测试平台:

Distributor ID: Ubuntu

Description: Ubuntu 9.10

Release: 9.10

Codename: karmic

 

         既然是ubuntu,安装rabbitmq服务端是很easy的事情,一条命令搞定:

apt-get install rabbitmq-server

 

          接下来的就是折腾了将近两天的心得体会了。

 

1.必需掌握的指令

 

(1)添加用户:

rabbitmqctl add_user rainbird password

(2)添加权限:

rabbitmqctl set_permissions -p "/" rainbird ".*" ".*" ".*"

(3)删除测试用户:

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的库里一点一点儿翻,找到了如下持久化的设置:

 

(1) 接收端声明队列和交换机自动建立:

$ch->queue_declare($_QUEUE,false,true,false,false);

第三个参数设置true保证服务器重启后,自动建立队列;

第五个参数设置成false防止接收端没连接的时候丢失消息;

 $ch->exchange_declare($EXCHANGE, 'direct', false, true, false);

第四个参数设置true保证重启后,自动建立交换机;

第五个参数设置false防止接收端断开后,交换机被删除。

 

 

(2)发布端声明消息持久:

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

 

由于上传附件及文字限制,有时部分图片、文字可能显示不了,详情请见:http://mp.weixin.qq.com/s?__biz=MzI5ODI3NzY2MA==&mid=100000752&idx=2&sn=bc1e320dda1af63555749fdc82c1d02a#rd
欢迎大家一起交流。
扫描以下二维码,获取更多更精美文章!(扫码关注有意向不到的惊喜的哦!!)
 
关注我们微信订阅号( uniguytech100) 与服务号(uniguytech),获取更多更精美文章!
也欢迎加入【大家技术网讨论QQ群】,群号码:256175955,请备注你个人的介绍!让我们一起聊聊it的那些事!

本文转载自:http://mp.weixin.qq.com/s?__biz=MzI5ODI3NzY2MA==&mid=100000752&idx=2&sn=bc1e320dda1af63555749fdc8...

共有 人打赏支持
unibigbear
粉丝 1
博文 70
码字总数 5874
作品 0
闵行
rabbitmq——prefetch count

消费者在开启acknowledge的情况下,对接收到的消息可以根据业务的需要异步对消息进行确认。 然而在实际使用过程中,由于消费者自身处理能力有限,从rabbitmq获取一定数量的消息后,希望rabbi...

hncscwc
2014/01/24
0
1
RabbitMQ使用过程中遇到的坑

LZ在研究安装部署使用RabbitMQ过程中遇到了很多坑,特此记录,以便使大家少走弯路。LZ是在Windows环境中部署的,Linux类似。 RabbitMQ由于是基于Erlang开发的,因此安装之前需要先安装Erlan...

lynnlovemin
2017/05/11
0
0
RabbitMQ死循环-延长ACK时间

一、应用背景   今天做一个需求,要将RabbitMQ中的任务取出并执行,为防止任务执行期间出错,设置NO_ACK=FALSE标志,这样、一旦任务没有应答的话,相应的任务就会被RabbitMQ自动Re-Queue,...

ITACHl
08/08
0
0
reactor-rabbitmq小试牛刀

序 本文主要研究一下如何使用reactor-rabbitmq maven rabbitmq 参考docker搭建rabbitmq集群 当前使用的镜像是bijukunjummen/rabbitmq-server:3.7.0,docker-compose文件配置的账号密码为myu...

go4it
10/06
0
0
Spring整合Rabbitmq

没有找到一篇完整的文章介绍Spring如何整合Rabbitmq应用,琢磨一天搞出的一个入门的demo与伙伴们分享. 第一步linux环境下安装rabbitMQ,小弟用的是ubantu,不想浪费太多时间这种安装上 sudo a...

魔法王者安琪拉
2014/07/09
0
5

没有更多内容

加载失败,请刷新页面

加载更多

等语句含义

经常会看到某些网站的框架中会用到 <!--[if IE7]><![endif]--> 等语句,今天特意查阅了下它们的区别: <!--[if IE]>所有的IE可识别<![end if]--><!--[if !IE]>除IE外都能识别<![end if]-->......

度_
31分钟前
1
0
资源的有限性与任务的复杂性之间的矛盾

看了一篇文章How to Manage Connections Efficiently in Postgres, or Any Database, 文章讨论了如何管理Postgres数据库连接,列举了几种方式: 每个请求一个连接 连接复用 连接池 连接池管理...

52iSilence7
31分钟前
3
0
Python PEP8规范整理

PEP8规范总结 PEP8 是什么呢,简单说就是一种编码规范,是为了让代码“更好看”,更容易被阅读。 具体有这些规范,参考 PEP 8 --Style Guide for Python Code.当然也可以使用Pycharm检查或使...

_Change_
43分钟前
3
0
input去空格

货币转换while True:MonStr = input()if MonStr[:3] == "RMB":USD = eval(MonStr[3:])/6.78print("USD{:.2f}".format(USD))elif MonStr[:3] == "USD":RMB = eval(MonStr[3:......

fadsaa
46分钟前
1
0
单例设计模式

单例设计模式 设计模式介绍与代码编写 在编写程序时经常会遇到一些典型的问题或需要完成某种特定需求.设计模式就是针对这些问题和需求.在大量的实践中总结和理论化之后的代码结构.编程风格以...

码农屌丝
47分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部