php 使用 rabbitmq 发布订阅模式 PubSub(三)

发布订阅模式, 其图示是这样子的
php 使用 rabbitmq 发布订阅模式 PubSub(三)_第1张图片
x 表是的是交换机, 它会把消息发送给 两个或以上的队列, 就像一个广播一样, 队列中的消息是一样的

我们之前的 简单模式 和 工作模式,是有一个默认交换机存在的

交换机是有4种类型可以使用的分是是
direct :定向
fanout : 广播(就是本节我们要讲的)
topic :通配符匹配
header: 参数匹配 这种模式很少用

生产者

从图中, 我们可以看到, 生产者p 只和交换机x 进行通信, 不和队列有连系, 所有我们的生产者代码如下
pubsub_sender.php


 require __DIR__.'/../vendor/autoload.php';
 $connection = new \PhpAmqpLib\Connection\AMQPStreamConnection("127.0.0.1",5672,"admin","123456");
 $channel = $connection->channel();
 //在生产者中创建一个交换机, 使用的模式是  广播模式 fanout
 $channel->exchange_declare("pubsub_exchange","fanout",false,false,false);
 //创建一个消息对象
 $msg = new \PhpAmqpLib\Message\AMQPMessage("这是一个广播消息, 会分发到两个队列中去, 你们看好了");
 //把消息转给 交换机  生产者就算完事
 $channel->basic_publish($msg,"pubsub_exchange","");
 //关闭资源
 $channel->close();
 $connection->close();

消费者1

pubsub_receive1.php
消费者和交换机是连接的, 所以消费者中要 指明交换机,并创建队列,把队列绑定到交换机上

 	require __DIR__.'/../vendor/autoload.php';
    $connection = new \PhpAmqpLib\Connection\AMQPStreamConnection("127.0.0.1",5672,"admin","123456");
    $channel = $connection->channel();
    //指明交换机, 这一行要和生产者中的那一行一至, 如有没有交换机会新增, 如果有,就不会新增
    $channel->exchange_declare('pubsub_exchange', 'fanout', false, false,false );
    //创建一个队列
    $channel->queue_declare("pubsub_queue1",false,false,false,false);
    //把队列和交换机进行绑定, 这里我们用的是 fanout 广播模式, 所以第三个参数 routing_key是空
    $channel->queue_bind("pubsub_queue1","pubsub_exchange","");
    $callback = function($msg){
        echo "这是消费者1收到的消息,其它的消息者应该也有这个消息--------".$msg->body;
    };
    $channel->basic_consume("pubsub_queue1","",false,false,false,false,$callback);

    while(count($channel->callbacks)){
        $channel->wait();
    }

消费者2

pubsub_receive2.php

    require __DIR__.'/../vendor/autoload.php';
    $connection = new \PhpAmqpLib\Connection\AMQPStreamConnection("127.0.0.1",5672,"admin","123456");
    $channel = $connection->channel();
    $channel->exchange_declare('pubsub_exchange', 'fanout', false, false,false);
    $channel->queue_declare("pubsub_queue2",false,false,false,false);
    $channel->queue_bind("pubsub_queue2","pubsub_exchange","");
    $callback = function($msg){
        echo "这是消费者2收到的消息,其它的消息者应该也有这个消息--------".$msg->body;
    };
    $channel->basic_consume("pubsub_queue2","",false,false,false,false,$callback);

    while(count($channel->callbacks)){
        $channel->wait();
    }

从上面的代码中我们可以看到, 我们在生产者中创建了一个交的换机, 并把队列消息发给了交换机

在消费者中, 我们新建了队列, 并把队列和交 换机进行了绑定

这种模是和work_queue的区别在于, 生产者产生的同一个消息可以被不同的消费者使用, 而work_queue 中的消息, 只能被一个消费者使用

你可能感兴趣的:(php,rabbmitmq,php,开发语言)