RabbitMQ使用场景_004_路由模式

路由模式

queue只感兴趣这个的exchange。只希望接收交换机中的关键信息,或者说指定内容的信息, 而忽略交换机中的其他消息。
direct exchange背后的路由算法很简单——即一个消息的队列binding_key完全匹配message的routing_key。

    1. 交换机绑定不同key的队列:

在上图中: exchange X和两个queue绑定在一起。queue Q1的binding key是orange。queue Q2的binding key是black和green。
当P publish key是orange时,exchange会把它放到Q1。如果是black或者green那么就会到Q2。其余的Message都会被丢弃。

    1. 交换机绑定多个相同key的队列:

多个queue绑定到相同的binding_key是合法的。在例子中,可以添加一个绑定X和Q1之间绑定关键黑色。在这种情况下,直接交换将像扇出,广播到所有匹配的消息队列。消息路由关键黑色将Q1和Q2。

  • 交换机绑定多个不同key到相同队列

相关代码:

1.publisher_direct.php

require_once __DIR__ . '/config.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// 创建好服务器连接
$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);
// 创建"channel"通道和声明队列名和发送消息到队列中
$channel = $connection->channel();
//声明交换机名称
$exchange  = 'direct_logs';
//路由键名称
$router_key = isset($argv[1]) && !empty($argv[1]) ? $argv[1] : 'info';

$channel->exchange_declare($exchange, 'direct', false, false, false);

//消息
$data = implode(' ', array_slice($argv, 2));
if(empty($data)) $data = "Hello World!";
$message = new AMQPMessage($data);

//发送消息
$channel->basic_publish($message, $exchange, $router_key);
echo " [x] Sent ",$queue,':',$data," \n";

$channel->close();
$connection->close();

2. subscriber_dircetor.php

require_once __DIR__ . '/config.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// 创建好服务器连接
$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);
// 创建"channel"通道和声明队列名和发送消息到队列中
$channel = $connection->channel();
//声明交换机名称
$exchange  = 'direct_logs';
//路由键名称
$router_keys = isset($argv[1]) && !empty($argv[1]) ? $argv[1] : 'info';

$channel->exchange_declare($exchange, 'direct', false, false, false);

/*
    name: $queue    //队列名称, 为空时使用默认队列,类似像amq.gen-JzTY20BRgKO-HjmUJj0wLg。
    passive: false  //不检查队列是否存在
    durable: false  //服务器重启后队列不复存在
    exclusive: true //队列能不被其他channel访问
    auto_delete: false //channel关闭之后队列不删除
*/
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

//指定的路由键
$router_keys = array_slice($router_keys, 1);
if(empty($router_keys)) {
    file_put_contents('php://stderr', "Usage: $argv[0] [info] [warning] [error]\n");
    exit(1);
}
foreach($router_keys as $router_key) {
    $channel->queue_bind($queue_name, $exchange, $router_key);
}

echo ' [*] Waiting for logs. To exit press CTRL+C', "\n";

$callback = function($msg){
  echo ' [x] ',$msg->delivery_info['routing_key'], ':', $msg->body, "\n";
};

/*
    消费消息
    queue: 制定队列
    consumer_tag: Consumer identifier
    no_local: Don't receive messages published by this consumer.
    no_ack: 服务器是否消息确认,默认为true是关闭的
    exclusive: 独占该消息,只有该channel才能消费这条消息
    nowait:
    callback: 回调函数
*/
$channel->basic_consume($queue_name, '', false, true, false, false, $callback);

// 循环监听回调
while(count($channel->callbacks)) {
    $channel->wait();
}

// 最后关闭通道和连接
$channel->close();
$connection->close();
时间: 2024-11-05 20:24:21

RabbitMQ使用场景_004_路由模式的相关文章

python使用rabbitMQ介绍四(路由模式)

一.模式介绍 路由模式,与发布-订阅模式一样,消息发送到exchange中,消费者把队列绑定到exchange上. 这种模式在exchange上添加添加了一个路由键(routing-key),生产者发布消息的时候添加路由键(routing-key),消费者绑定队列到交换机时添加键值(routing-key),这样就可以接收到对应的消息. 路由模式的direct exchange. 队列模型: 与发布-订阅模式不同的是,每个消费者队列接收的消息不同,根据消息的routing-key把消息发送到不同

RabbitMQ学习第四记:路由模式(direct)

1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机推送过来的数据.而路由模式下加了一个路由设置,生产者向交换机发送数据时,会声明发送给交换机下的那个路由,并且只有当消费者的队列绑定了交换机并且声明了路由,才会收到数据.下图取自于官方网站(RabbitMQ)的路由模式的图例 P:消息的生产者 X:交换机 红色:队列 C1,C2:消息消费者 error

RabbitMQ (六) : 订阅者模式之路由模式 ( direct )

路由模式下,生产者发送消息时需要指定一个路由键(routingKey),交换机只会把消息转发给包含该路由键的队列 这里,我们改变一下声明交换机的方式. 我们通过管理后台添加一个交换机. 添加后,生产者和消费者的代码中就不需要再声明交换机了.同样,也可以通过管理后台添加队列,那么代码中也不需要声明队列了. 生产者 public class Producer { private const string ExchangeName = "test_exchange_direct"; publ

RabbitMQ(四) ——路由

RabbitMQ(四) --路由 (转载请附上本文链接--linhxx) 一.概述 路由模式(routing)是交换机不将消息广播到全部的队列中,而是采用交换机的另一种模式--direct.该模式下,交换机会精准的将消息发送到某个与其绑定的队列,而不是发送给全部队列. 如果没有队列绑定交换机,消息会丢失. 路由模式如下图所示: 二.绑定方式(binding) 在交换机的fanout模式下,不需要routing key,但是在此模式下,由于交换机需要精准的将消息发送给某个(某些)队列,则需要队列与

前端路由模式hash和history

hash模式hash模式的原理是依据window对象的onhashchange事件进行监听,它的特点是:虽然hash路径出现在URL中,但是不会出现在HTTP请求中,对后端完全没有影响,因此改变hash值不会重新加载页面. window.onhashchange = function(e){ console.log(e); } 打印出来的结果可以通过location.hash获得浏览器url路径中的#部分内容,上图是#bvc,如果想获取#后面的内容可通过location.hash.slice(1

消息队列rabbitmq的五种工作模式(go语言版本)

前言:如果你对rabbitmq基本概念都不懂,可以移步此篇博文查阅消息队列RabbitMQ 一.单发单收 二.工作队列Work Queue 三.发布/订阅 Publish/Subscribe 四.路由Routing 五.Topic类型的exchange 六.rabbitmq部分封装代码及装备工作 一.单发单收 在下图中,“ P”是我们的生产者,“ C”是我们的消费者.中间的框是一个队列-RabbitMQ代表使用者保留的消息缓冲区. 单发单收模式下:一发一收 发送端只需要创建队列,然后向队列发送消

RabbitMQ 一二事(5) - 通配符模式应用

之前的路由模式是通过key相等来匹配 而通配符,顾名思义,符合条件,则进行消息匹配发送 将路由键和某模式进行匹配.此时队列需要绑定要一个模式上. 符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词. 因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs” 如图: 官网截图: 代码示例: 服务方 接收方1 接受方2 路由模式也是通配符模式的一种 在生产环境中,以通配符模式用的较多 当然简单应用的话路由模式也够了

d-link DI-7300 DI-7200 开启路由模式

最近做个项目需要把两个网段组起来 使用DI-7300 DI-7200 开启路由模式 添加静态路由后发现没法ping通 检查了静态路由没啥问题 打了客服才知道原来需要关闭 网络安全--网络攻击防御--内网病毒防御 还要在上网行为里面 添加一条允许的规则 如果你写的静态路由没问题的话 这时候应该是可以互通了

CentOS 7 之 hostapd 路由模式配置

这篇是 linux 下使用 hostapd 实现无线接入点 AP 模式的另一种实现方式:hostapd 路由模式配置. 对于软硬件的基本配置及 hostapd 安装在<CentOS 7 之 hostapd AP模式配置>的前半部分内容中有说明,可以先看看那篇,再看本文. hostapd 的AP模式配置需要的有线网卡和无线网卡进行桥接,那路由模式配置主要就是将无线网卡的数据通过有线网卡进行伪装.转发两个方面,也就不再需要将有线和无线网卡进行桥接. 配置这种路由模式就类似一台普通的无线路由器,有线