RabbitMQ的一些知识

本文详细介绍了在Ubuntu 9.10环境下使用RabbitMQ与PHP-amqp库进行消息队列操作的经验总结,包括安装配置、用户与权限管理、消息持久化策略、监听IP与端口修改、CPU占用优化及错误日志记录等关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引自:http://blog.51cto.com/rainbird/525523

 

  让几个不同地方的哥们帮着访问下载,都下载不了,推断可能是这个项目被删除了.问一个哥们儿,说他们那用的是php-amqp.从官方下的库竟然不好使.于是死皮懒脸的管哥们要了他们正在用的版本和示例,又鉴于网上 php-amqp版本的rabbit操作细节甚少(可以说没有么?),于是有了今天这份儿总结.
测试平台:
Distributor ID: Ubuntu
Description: Ubuntu 9.10
Release: 9.10
Codename: karmic
 
      既然是ubuntu,安装rabbitmq服务端是很easy的事情,一条命令搞定:
apt-get install rabbitmq-server
 
      接下来的就是折腾了将近两天的心得体会了.
 
      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,不错的小技巧!
 
      暂时就摸索出来这么多东西了,准备拿几个不重要的任务跑跑稳定性试试

RabbitMQ是一个开源的消息中间件,实现了高效的消息传递机制,可以在分布式系统中进行可靠的消息传递下面是RabbitMQ知识体系: 1. 消息队列:RabbitMQ基于消息队列的模型,通过将消息发送到队列中,实现了消息的异步传递和解耦。消息队列可以提供可靠性、可扩展性和灵活性。 2. 生产者和消费者:RabbitMQ中的生产者负责发送消息到队列,而消费者则从队列中接收并处理消息。生产者和消费者之间通过交换机(Exchange)进行消息的路由。 3. 交换机(Exchange):交换机是消息的分发中心,它接收生产者发送的消息,并根据一定的规则将消息路由到一个或多个队列中。RabbitMQ提供了不同类型的交换机,如直连交换机、主题交换机、扇形交换机等。 4. 队列(Queue):队列是消息的存储区域,生产者发送的消息会被存储在队列中,消费者从队列中获取消息进行处理。每个队列都有一个名称,并且可以绑定到一个或多个交换机上。 5. 绑定(Binding):绑定是交换机和队列之间的关联关系,它定义了消息从交换机路由到哪个队列。绑定可以使用路由键(Routing Key)来指定消息的路由规则。 6. 路由键(Routing Key):路由键是生产者在发送消息时指定的关键字,交换机根据路由键将消息路由到一个或多个队列中。不同类型的交换机对路由键的匹配规则有所不同。 7. ACK机制:RabbitMQ支持消息的确认机制,即消费者在处理完一条消息后发送ACK(确认)给RabbitMQ,告知其已成功处理该消息。如果消费者在一定时间内未发送ACK,RabbitMQ会将该消息重新投递给其他消费者。 8. 持久化:RabbitMQ可以将消息和队列进行持久化,确保在服务器重启或崩溃后消息不会丢失。持久化可以通过设置消息的持久化标志和队列的持久化属性来实现。 9. 高可用性:RabbitMQ支持集群模式,多个节点组成一个集群,提供高可用性和负载均衡。当一个节点故障时,其他节点可以接管其工作,确保消息的可靠传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值