文档章节

php amqp 消息队列 RabbitMQ 交换器类型 直连 (三)

mac_zhao
 mac_zhao
发布于 2014/09/26 19:07
字数 621
阅读 326
收藏 6

1、AMQP_EX_TYPE_DIRECT:直连型

直连型又包括: 1对1 和1对N(N对1、 N对N)
\
接收端receive.php代码如下
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!--?php
 
$connect =newAMQPConnection();
$connect--->connect();
 
$channel =newAMQPChannel($connect);
 
$exchange =newAMQPExchange($channel);
$exchange->setName('exchange');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declare();
 
$queue =newAMQPQueue($channel);
$queue->setName('logs');
$queue->declare();
 
$queue->bind('exchange','logs');
 
while(true) {
    $queue->consume('callback');
}
 
$connection->close();
 
function callback($envelope, $queue) {
    var_dump($envelope->getBody());
    $queue->nack($envelope->getDeliveryTag());
}

发送端send.php代码如下
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--?php
 
$connect =newAMQPConnection();
$connect--->connect();
 
$channel =newAMQPChannel($connect);
 
$exchange =newAMQPExchange($channel);
$exchange->setName('exchange');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declare();
 
$exchange->publish('direct type test','logs');
var_dump("Send Message OK");
 
$connect->disconnect();

运行结果如图所示
\



\ 创建receive_one.php和receive_two.php 并把send.php代码改成如下代码方便我们观看 receive_one.php 和 receive_two.php 代码相同 或者用dos运行多个接收端
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!--?php
 
$connect =newAMQPConnection();
$connect--->connect();
 
$channel =newAMQPChannel($connect);
 
$exchange =newAMQPExchange($channel);
$exchange->setName('exchange');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declare();
 
$queue =newAMQPQueue($channel);
$queue->setName('logs');
@$queue->declare();
 
$queue->bind('exchange','logs');
 
while(true) {
    $queue->consume('callback');
}
 
$connection->close();
 
function callback($envelope, $queue) {
    var_dump($envelope->getBody());
    $queue->nack($envelope->getDeliveryTag());
}




send.php
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!--?php
 
$connect =newAMQPConnection();
$connect--->connect();
 
$channel =newAMQPChannel($connect);
 
$exchange =newAMQPExchange($channel);
$exchange->setName('exchange');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declare();
 
for($index =1; $index <5; $index++) {
    $exchange->publish($index,'logs');
    var_dump("Send:$index");
}
 
$exchange->delete();
$connect->disconnect();

运行结果如下 \

列队会把消息分配给每一个接收端分配处理这里看似完美但是如果想要更好的处理不同的任务就需要 公平调度
比如当1、3处理的都是简单的人 2、4都是处理的复杂的任务 如果任务过多时 receive_one.php是空闲的而receive_two.php是任务繁重的 我们进行如下测试 send.php改成5改成50
?
1
2
3
4
for($index =1; $index <50; $index++) {
    $exchange->publish($index,'logs');
    var_dump("Send:$index");
}

receive_two.php 加上 sleep(3)
?
1
2
3
4
5
function callback($envelope, $queue) {
    var_dump($envelope->getBody());
    sleep(3);
    $queue->nack($envelope->getDeliveryTag());
}

我们运行程序结果如下
\

receive_one全部运行完而receive_two才运行一个 之后receive_one一直空闲 我们可以通过 在接收端设置 $channel->setPrefetchCount(1);
任务没人完成前不接收新的消息把消息发送给其他接收端
如下receive_one.php 和 receive_two.php
?
1
$channel =newAMQPChannel($connect);
改成如下
?
1
2
$channel =newAMQPChannel($connect);
$channel->setPrefetchCount(1);

© 著作权归作者所有

共有 人打赏支持
mac_zhao
粉丝 42
博文 249
码字总数 304671
作品 0
普陀
程序员
私信 提问
消息中间件—RabbitMQ(初探篇)

文章摘要:本篇文章为RabbitMQ的入门文章,不像其他一些程序代码和应用实战性的文章会带着大家从一个“Hello World”的简单例子出发,在该篇幅中主要给大家讲下RabbitMQ消息队列的起源、为何...

癫狂侠
05/23
0
0
【Python模块】rabbitMQ

RabbitMQ介绍: 父进程与子进程间,同一父继承可以用multiprocess的Manager模块来实现数据互访。 作用:RabbitMQ是为了实现相互独立的两个进程数据互访。 应用场景:不需要立即操作的数据。比...

等你的破船
08/13
0
0
消息队列1:RabbitMQ解析并基于Springboot实战

目录 RabbitMQ简介 RabitMQ 概念模型 Exchange 类型 代码实战 RabbitMQ简介 AMQP:Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此...

养码青年
09/07
0
0
SpringBoot整合高级消息队列RabbitMQ及原理

一 SpringBoot 与消息概述 xhesrc="https://img-blog.csdn.net/20180619001205459?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4OTc0NjM0/font/5a6L5L2T/fontsize/400/fill/I0JBQk......

刘信坚
06/19
0
0
rabbit以及php amqp扩展使用

一定要注意php安装AMQP的版本,版本不同使用的方法不一样。在官方网站就有2个版本的AMQP 第一版本:xxx,详细的url找不到了 第二版本:http://docs.php.net/manual/da/book.amqp.php 千万不要...

china_lx1
07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
4
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部