介绍
一款消息队列数据库,类似redis发布订阅,但是rq 做了功能完善和数据持久化。在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
 
客户端 rq_client.php
//建立连接
$conn_args = array(
'host' => '127.0.0.1',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost' => '/',
);
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
} //建立信道和创建 exchange1 的交换机
$channel = new AMQPChannel($conn);
$ex = new AMQPExchange($channel);
$ex->setName("exchange1");
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE);
$ex->declareExchange(); //发送信息到服务器端 路由键 key1 、key2
for ($i = 0; $i < 10; $i++) {
$key = "key1";
if ($i % 2 == 0) {
$key = "key2";
}
$ex->publish("use rq send message " . $key . "--" . $i, $key);
} echo "success";
服务器端 rq_service.php
$conn_args = array(
'host' => '127.0.0.1',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost' => '/',
);
//建立连接
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
} //建立信道和创建队列 first
$channel = new AMQPChannel($conn);
$q = new AMQPQueue($channel);
$q->setName("first");
$q->setFlags(AMQP_DURABLE); //持久化
//队列绑定交换机 exchange1 并指定路由键 key1
$q->bind("exchange1", 'key1'); //阻塞模式接收消息
echo "Message:\n";
$q->consume('processMessage', AMQP_AUTOACK); //自动ACK应答
$conn->disconnect(); /**
* 消费回调函数
* 处理消息
*/
function processMessage($envelope, $queue) {
$msg = $envelope->getBody();
echo $msg . "\n"; //处理消息
}
 
cmd下分别执行rq_service.php 、rq_client.php
 
交换机4种类型
AMQP_EX_TYPE_DIRECT 直连
AMQP_EX_TYPE_TOPIC 模糊匹配
AMQP_EX_TYPE_FANOUT 广播类型 路由键可不填
AMQP_EX_TYPE_HEADERS
 
路由键模糊匹配
发送消息的路由键不是固定的单词,而是匹配字符串,如"*.lu.#",*匹配一个单词,#匹配0个或多个单词。
$q->bind("exchange1", 'key.#'); 请用 "." 连接
 
持久化概念
指定exchange,并显式申明它的类型。
将exchange持久化,这样那怕Rabbit重启,exchange也不会消失。
将queue持久化,这样那怕Rabbit重启,queue也不会消失(包括queue中的消息)
在exchange publish消息时,指定 route key,同时在queue中绑定rout key,这样exchange在转发消息时,能够将消息转发到与route key匹配的的队列中。
 
应用场景
事件驱动类型,当客户端有消息发送,服务器端会接收消息。用于群发短信、存储数据(缓存层)减轻数据库压力。

最新文章

  1. C# ASP.NET MVC 图片盗链 加水印 的问题
  2. The ProgID of the WorkspaceName&#39;s workspace factory
  3. ++X 与 X++ 的区别
  4. TortoiseSVN使用详细步骤
  5. 多线程-GCD学习笔记
  6. SSI指令教程
  7. WinForm 使用皮肤,且单击按更换皮肤。
  8. oschina Web应用开发
  9. rxjava2学习笔记(1)
  10. gsoap入门实例
  11. LeetCode &amp; Q13-Roman to Integer-Easy
  12. 学习HTML的第三次课
  13. Select默认选择后台参数
  14. oracle中if/else的三种实现方式
  15. MySQLi面向对象实践--insert、update、delete
  16. django -- Celery实现异步任务
  17. 【NOI】2017 整数(BZOJ 4942,LOJ2302) 压位+线段树
  18. Linux修改本地时间
  19. realproxy
  20. postman中 form-data、x-www-form-urlencoded、raw、binary的区别 &amp;&amp; 下载文件

热门文章

  1. photoshop 前端常用技巧
  2. 【iOS】KVC 与 KVO
  3. c程序设计语言第一章2
  4. WPF窗口最大化
  5. requirejs中的define
  6. 第六十题(在O(1)时间内删除链表结点)
  7. linux下提示command not found
  8. python day - 19 抽象类 接口类 多态 封装
  9. leelazero and google colab
  10. DedeCms如何调用Discuz论坛主题等数据方法总结