RabbitMQ任务分发

RabbitMQ中文文档 http://rabbitmq.mr-ping.com/在RabbitMQ的文档中,对于任务分发是放在“工作队列”这一章节介绍的。在后面介绍扇形、直连、主题交换机时并没有提到,在学习的过程中容易误认为只有默认交换机才具有任务分发机制。RabbitMQ中消息的分发有3个过程 1. 生产者将消息发送到交换机 2. 交换机将消息分发到队列 3. 队列将消息分发给消费者 在步
摘要由CSDN通过智能技术生成

RabbitMQ中文文档 http://rabbitmq.mr-ping.com/

在RabbitMQ的文档中,对于任务分发是放在“工作队列”这一章节介绍的。

在后面介绍扇形、直连、主题交换机时并没有提到,在学习的过程中容易误认为只有默认交换机才具有任务分发机制。

RabbitMQ中消息的分发有3个过程
1. 生产者将消息发送到交换机
2. 交换机将消息分发到队列
3. 队列将消息分发给消费者

在步骤1,生产者使用basic.push方法发送消息,并指定交换机的名称和路由键。RabbitMQ将消息传递给对应的交换机,路由器则会通过路由键进一步将消息传递给队列。

不同的路由器是根据步骤2的行为进行区分的。扇形交换机会忽略路由键,将消息发送给所有绑定的队列(所有与该交换机绑定的队列,会收到同样的消息,类似redis中的发布、订阅机制)。对于直连交换机和主题交换机,在队列绑定交换机时都需要指定路由键,当与步骤1中的路由键存在对应关系时,交换机就会将消息发送给队列。

对于步骤2中的绑定操作,一个交换机可以绑定多个不同的队列,一个队列也可以绑定多个不同的交换机。如果有多个不同的队列,使用相同的路由键绑定路由器,则它们都会受到路由键对应的消息。
这里写图片描述
如果所示,队列S9b和Agl都使用路由键error绑定了直连交换机X,因此生产者发送路由键为error的消息时,队列S9b和Agl都会收到,消费者C1和C2都会进行处理。

步骤3才是进行任务分发的部分,也就是说任务的分发是指的多个消费者处理同一个队列中的信息时,会进行任务的分发。
例如一共N个队列,
第一个消费者,获取的是第0,N,2N … 个消息
第二个消费者,获取的是第1,N+1,2N+1 … 个消息

第N个消费者,获取的是第N-1,2N-1,3N-1 … 个消息

rabbitmq手册中关于直连交换机的文档地址:
http://rabbitmq.mr-ping.com/tutorials_with_python/[4]Routing.html

该章节的示例程序中,通过rabbitmq声明了临时队列,因此运行多个consume脚本时,会生成多个不同的队列,并且一个队列只有一个消费者,所以并不会对队列中的任务进行分发。

下面对示例程序中的代码进行扩展,让每个队列对应两个消费者,进行任务的分发。

log_produce.php

生产者发送10条路由键为error的消息,10条路由键为info的消息,到直连路由器direct_logs。

<?php
require_once '../vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPStreamConnection('127.0.0.1', 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值