publish and subscribe

前言


前面的例子 我们都是用到的都是消息单一消费,即一条消息被单个消费者消费。像微博系统的消息推送,是一条消息推送给所有订阅到该频道的用户。

这里我们就需要用到rabbitmq的发布与订阅(publish and subscribe)

原理


前面我们弱化rabbitmq,只抽象出了 生产者、队列、消费者三个概念。

现在需要介绍rabbitmq的整体数据流转过程。

数据由生产者发送给交换机,交换机接收数据并把它发送给与自己绑定好的队列,队列接收消息并且把它发送给消费者。

事实上,生产者根本不会知道消息是发送给谁的,也不需要关心。who cares?!

exchange的类型

移步 RabbitMQ各种交换机类型Exchange Types介绍

发布与订阅

一个中心生产者,多个消费者。

生产者生产消息给类型为fanout的exchange,多个queue与该exchange绑定,消费者从queue中获取消息。

代码


1. 生产者、消费者声明类型为fanout、名称为logs的交换机

2. 消费者进程声明名称随机的queue(用于每new 一个进程就会产生一个队列),将queue与logs exchange绑定

整体代码如下

fanout_sender.php

<?php
/**
* Created by PhpStorm.
* User: wangdaxi
* Date: 2017/10/20
* Time: 14:20
*/
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage; $connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel(); $channel->exchange_declare('logs', 'fanout', false, false, false); $data = implode(' ', array_slice($argv, 1));
empty($data) && $data = 'Hello World';
$msg = new AMQPMessage($data); $channel->basic_publish($msg, 'logs');
echo " [x] Sent $data \n"; $channel->close();
$connection->close();

fanout_receive.php

<?php
/**
* Created by PhpStorm.
* User: wangdaxi
* Date: 2017/10/20
* Time: 14:32
*/
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection; $connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel(); $channel->exchange_declare('logs', 'fanout', false, false, false); list($queue_name, ,) = $channel->queue_declare("", false, false, true, false); $channel->queue_bind($queue_name, 'logs'); echo ' [*] Waiting for logs. To exit press CTRL+C', "\n"; $callback = function($msg){
echo "\n [x] " . $msg->body;
}; //消费,关闭ack
$channel->basic_consume($queue_name, '', false, true, false, false, $callback); while(count($channel->callbacks)) {
$channel->wait();
} $channel->close();
$connection->close();

测试


开启一个终端作为生产者P,两个消费者作为消费者C1,C2。

生产者生产消息,会发现每个消费者都会收到同样的消息。很简单,不上图。

以上。

RabbitMq初探——发布与订阅的更多相关文章

  1. 文成小盆友python-num12 Redis发布与订阅补充,python操作rabbitMQ

    本篇主要内容: redis发布与订阅补充 python操作rabbitMQ 一,redis 发布与订阅补充 如下一个简单的监控模型,通过这个模式所有的收听者都能收听到一份数据. 用代码来实现一个red ...

  2. RabbitMQ学习笔记(三) 发布与订阅

    发布与订阅 在我们使用手机发送消息的时候,即可以选择给单个手机号码发送消息,也可以选择多个手机号码,群发消息. 前面学习工作队列的时候,我们使用的场景是一个消息只能被一个消费者程序实例接收并处理,但是 ...

  3. Part1.2 、RabbitMQ -- Publish/Subscribe 【发布和订阅】

    python 目录 (一).交换 (Exchanges) -- 1.1 武sir 经典 Exchanges 案例展示. (二).临时队列( Temporary queues ) (三).绑定(Bind ...

  4. RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)

    发布/订阅 在上篇教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers).这种模式被称为“ ...

  5. 转载RabbitMQ入门(3)--发布和订阅

    发布和订阅 (使用java 客户端) 在先前的指南中,我们创建了一个工作队列.这工作队列后面的假想是每一个任务都被准确的传递给工作者.在这部分我们将会做一些完全不同的事情–我们将一个消息传递给多个消费 ...

  6. RabbitMQ之发布订阅【译】

    在上一节中我们创建了一个工作队列,最好的情况是工作队列能够把任务恰到好处的分配给每一个worker.这一节中我们将做一些完全不同的事情--将消息传递给每一个消费者,这种模式被称为发布/订阅. 为了说明 ...

  7. RabbitMQ的交换器Exchange之direct(发布与订阅 完全匹配)

    1.交换器.用来接收生产者发送的消息并将这些消息路由给服务器中的队列.三种常用的交换器类型,a.direct(发布与订阅 完全匹配).b.fanout(广播).c.topic(主题,规则匹配). 2. ...

  8. RabbitMQ 入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)

    发布/订阅 在上篇第二部分教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers).这种模式 ...

  9. RabbitMQ的发布订阅模式(Publish/Subscribe)

    一.发布/订阅(Publish/Subscribe)模式 发布订阅是我们经常会用到的一种模式,生产者生产消息后,所有订阅者都可以收到.RabbitMQ的发布/订阅模型图如下: 1.该模式下生产者并不是 ...

随机推荐

  1. jquery的html代码中a的onclick的正确显示的代码

    jquery的html代码中a的onclick的正确显示的代码 需要转义一下,试了好久才试出来 img_delete.html('<a onclick="deleteImg(\''+s ...

  2. python3操作MySQL数据库

    安装PyMySQL 下载地址:https://pypi.python.org/pypi/PyMySQL 1.把操作Mysql数据库封装成类,数据库和表先建好 import pymysql.cursor ...

  3. 用 Vue 改造 Bootstrap,渐进提升项目框架

    前言 Vue 横空出世,以迅雷不及掩耳之势横扫前端界,俨然有当年 jQuery 之势.我认为 Vue 成功的关键在于三点: 学习曲线平缓,有点经验的前端基本上一天就能看完文档,然后就可以上手操作. 上 ...

  4. controller 允许跨域访问

    1.在controller 上加上 @CrossOrigin(origins = {"http://localhost:7777", "http://someserver ...

  5. TMS Grid

    TMS Grid http://edn.embarcadero.com/article/42553

  6. How to run eclipse in clean mode? and what happens if we do so?

    What it does: if set to "true", any cached data used by the OSGi framework and eclipse run ...

  7. Linux 文件管理命令语法、参数、实例全汇总(一)

    命令:cat   cat 命令用于连接文件并打印到标准输出设备上. 使用权限 所有使用者 语法格式 cat [-AbeEnstTuv] [--help] [--version] fileName 参数 ...

  8. js 实现 一张图片的上传

    .js进行图片预览 使用input标签来选择图片,使用FileReader读取图片并转成base64编码,然后发送给服务器. <html> <body> <img id= ...

  9. eclipse怎么自定义工具栏

    1.点击透视图按钮---->右键---->Customize: 2.勾选或者去掉相关项目:

  10. Symfony 从路由认识它

    经过上一篇文章之后,我们呢,可以访问这个默认的页面,你也会看到一堆高级的debug工具.好了,这次我们开始更多地了解这个symfony2.0. 首先我们要明白一点,Symfony2 的配置是一个着实很 ...