RabbitMq初探——发布与订阅
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初探——发布与订阅的更多相关文章
- 文成小盆友python-num12 Redis发布与订阅补充,python操作rabbitMQ
本篇主要内容: redis发布与订阅补充 python操作rabbitMQ 一,redis 发布与订阅补充 如下一个简单的监控模型,通过这个模式所有的收听者都能收听到一份数据. 用代码来实现一个red ...
- RabbitMQ学习笔记(三) 发布与订阅
发布与订阅 在我们使用手机发送消息的时候,即可以选择给单个手机号码发送消息,也可以选择多个手机号码,群发消息. 前面学习工作队列的时候,我们使用的场景是一个消息只能被一个消费者程序实例接收并处理,但是 ...
- Part1.2 、RabbitMQ -- Publish/Subscribe 【发布和订阅】
python 目录 (一).交换 (Exchanges) -- 1.1 武sir 经典 Exchanges 案例展示. (二).临时队列( Temporary queues ) (三).绑定(Bind ...
- RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)
发布/订阅 在上篇教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers).这种模式被称为“ ...
- 转载RabbitMQ入门(3)--发布和订阅
发布和订阅 (使用java 客户端) 在先前的指南中,我们创建了一个工作队列.这工作队列后面的假想是每一个任务都被准确的传递给工作者.在这部分我们将会做一些完全不同的事情–我们将一个消息传递给多个消费 ...
- RabbitMQ之发布订阅【译】
在上一节中我们创建了一个工作队列,最好的情况是工作队列能够把任务恰到好处的分配给每一个worker.这一节中我们将做一些完全不同的事情--将消息传递给每一个消费者,这种模式被称为发布/订阅. 为了说明 ...
- RabbitMQ的交换器Exchange之direct(发布与订阅 完全匹配)
1.交换器.用来接收生产者发送的消息并将这些消息路由给服务器中的队列.三种常用的交换器类型,a.direct(发布与订阅 完全匹配).b.fanout(广播).c.topic(主题,规则匹配). 2. ...
- RabbitMQ 入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)
发布/订阅 在上篇第二部分教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers).这种模式 ...
- RabbitMQ的发布订阅模式(Publish/Subscribe)
一.发布/订阅(Publish/Subscribe)模式 发布订阅是我们经常会用到的一种模式,生产者生产消息后,所有订阅者都可以收到.RabbitMQ的发布/订阅模型图如下: 1.该模式下生产者并不是 ...
随机推荐
- Running Bitvise SSH Client as a Windows Service
It is possible to run a Windows program as a system service. The advantage of services is that they ...
- TNS:no listener error in Oracle XE after changing computer name
This morning at work when trying to log on to my computer I noticed not my username on login screen ...
- Using DirectShow------------------msdn
Using DirectShow This section contains the following topics: Simulating Graph Building with GraphE ...
- zk分布式锁-排它锁简单实现
package Lock; import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;import ...
- Centos7手动编译安装Python3
Python3的安装方式非常的简单,首先去到Python下载目录下载想要的Python包,这里我选择了3.6.5版本 $ wget https://www.python.org/ftp/python/ ...
- leetcode 20 Valid Parentheses 有效的括号
描述: 给定一些列括号,判断其有效性,即左括号有对应的有括号,括号种类只为小,中,大括号. 解决: 用栈. bool isValid(string s) { stack<char> st; ...
- [leetcode]253. Meeting Rooms II 会议室II
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...
- Wap版
Wap版:又叫h5.M版.移动网页版: Mobile:存储wap版调用的接口
- Java JarFile 解析
Java JarFile 解析 package com.github.binarylei; import java.io.*; import java.net.URL; import java.net ...
- An interview question from MicroStrategy
去年校招时的一道面试题,觉得蛮有意思,贴出来. Question: Spy start at a, during an interval he moves |b| to right when b &g ...