RabbitMQ(消息队列)

这几天不忙,抽空整理一下之前关于rabbit的知识点  ̄へ ̄:

为什么要使用消息队列?
举个简单的应用场景,假设用户注册成功我们需要日志记录,发送邮件或短信通知用户恭喜注册成功,然后返回注册成功消息给用户。实际上对于用户来说他只需要我们返回注册成功的消息给他而已,我们可以将那么不需要及时反馈给用户的操作和耗时的操作(日志记录,发送邮件或短信)写入队列,然后服务端有条不紊的慢慢读取消息再操作。这样响应给用户也快,用户体验好,同时也避免了在业务量大的时候容易卡在发送邮件或发送短信上之类的问题。


 

一、安装RabbitMQ:

(1). 安装依赖库:
RabbitMQ使用erlang编写的。 所以在安装RabbitMQ之前需要安装erlang和一些其它的依赖库,下面介绍两种安装方法

yum安装(推荐)
sudo yum install gcc glibc-devel make ncurses-devel openssl-devel autoconf erlang
使用源码自行编译erlang:
wget http://erlang.org/download/otp_src_R15B01.tar.gz
tar zxvf otp_src_R15B01.tar.gz
cd otp_src_R15B01
./configure && make && sudo make install

(2). 安装rabbit:
安装完了erlang后接着安装rabbit (可以先 yum search rabbitmq 搜索一下适合你当前系统的版本):
yum install rabbitmq-server librabbitmq-devel.x86_64

(3). 启动rabbit和查看rabbit状态:
正确安装完后/usr/sbin/里面会多两条命令 rabbitmqctl(rabbit控制台) rabbitmq-server(rabbit服务启动,关闭,重启),我们先 rabbitmq-server start 启动rabbit服务,接着使用 rabbitmqctl status 查看rabbit状态,如下图所示:
屏幕快照 2016-08-09 09.24.31
屏幕快照 2016-08-09 09.24.46
如果和图上差不多的话表示你的rabbit安装完成啦。

接下来看看PHP如何使用rabbit。


 

二、PHP安装AMQP拓展:

(1). PHP与Rabbit交互原理:
PHP与Rabbit走的是AMQP协议,客户端(生产者)写入消息到队列中,服务端(消费者)读取队列中的消息在进行处理:
AB30F08F-366B-4A3C-9115-73CD92174CEE

(2). PHP安装AMQP拓展:
下面介绍两种安装方法,源码安装和pecl安装:

使用源码编译安装:
先去amqp官网或者pecl上下载最新的AMQP源码包:
wget http://pecl.php.net/get/amqp-1.7.1.tgz
tar zxvf amqp-1.7.1.tgz && cd amqp-1.7.1
phpize
./configure –with-php-config=/PATH/TO/YOU/php-config –with-amqp && make && make install

如果出现和下图差不多的提示则表示编译成功
屏幕快照 2016-08-09 10.16.00

使用pecl安装amqp:
当你有安装了pecl的时候,使用pecl安装php拓展无疑是最方便的:
pecl install amqp

安装完后记得添加 extension = “amqp.so” 到你的 php.ini 中,然后重启PHP
现在我们查看一下phpinfo。
屏幕快照 2016-08-09 10.31.03
好了。到此我们关于RabbitMQ的安装都完成啦。


 

三、简单的使用:
这边我就直接贴代码了,参考看看,具体详细使用还得看官方文档

消费者

<?php
//配置信息
$conn_args = array(
'host' => 'localhst',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost'=>'/'
);
$e_name = 'e_linvo'; //交换机名
$q_name = 'q_linvo'; //队列名
$k_route = 'key_1'; //路由key

//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die(“connect fail!\n”);
}else{
echo ‘connect rabbitMQ seccuss’;
}

$channel = new AMQPChannel($conn);

//创建交换机
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型
$ex->setFlags(AMQP_DURABLE); //持久化
echo “Exchange Status:”.$ex->declare().”\n”;

//创建队列
$q = new AMQPQueue($channel);
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE); //持久化
echo “Message Total:”.$q->declare().”\n”;

//绑定交换机与队列,并指定路由键
echo ‘Queue Bind: ‘.$q->bind($e_name, $k_route).”\n”;

//阻塞模式接收消息
echo “Message:\n”;
while(True){
$q->consume(‘processMessage’);
//$q->consume(‘processMessage’, AMQP_AUTOACK); //自动ACK应答
}
$conn->disconnect();

/**
* 消费回调函数
* 处理消息
*/
function processMessage($envelope, $queue) {
$msg = $envelope->getBody();
echo $msg.”\n”; //处理消息
$queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答
}

 

生产者
<?php
//配置信息
$conn_args = array(
'host' => 'localhost',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost'=>'/'
);
$e_name = 'e_linvo'; //交换机名
//$q_name = 'q_linvo'; //无需队列名
$k_route = 'key_1'; //路由key

//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die(“connect fail!\n”);
}
$channel = new AMQPChannel($conn);

//消息内容
$message = “这是生产者发出的消息”;

//创建交换机对象
$ex = new AMQPExchange($channel);
$ex->setName($e_name);

//发送消息
//$channel->startTransaction(); //开始事务
for($i=0; $i<5; ++$i){ echo “Send Message:”.$ex->publish($message, $k_route).”\n”;
}
//$channel->commitTransaction(); //提交事务

$conn->disconnect();

我们先开启消费者在后台(不要关闭),然后再执行生产者,生产者写入消息的同时消费者也收到了消息
开启消费者:
屏幕快照 2016-08-09 10.58.11
另一端执行生产者:
屏幕快照 2016-08-09 10.58.27
同时观察消费者:
屏幕快照 2016-08-09 10.58.37

科科

  6 comments for “RabbitMQ(消息队列)

  1. 2016年8月16日 at 23:14

    This is really a nice place.

  2. 2016年8月17日 at 20:48

    This is really a nice place.

  3. 2016年8月18日 at 14:30

    If he shows up, we stick with him.

  4. 2016年8月19日 at 07:57

    You always love it.

  5. 2016年8月19日 at 16:53

    I let myself become a fool .

发表评论

电子邮件地址不会被公开。