RabbitMQ(三)

——发布订阅

(转载请附上本文链接——linhxx)

一、概述

RabbitMQ的发布订阅(Publish/Subscribe),其将生产者和消费者进一步解耦,生产者生产消息后,交付给交换机,消费者上线后,主动主动去队列中取数据进行处理。该模式也符合上一节工作队列中的ack、预取等规则。

发布订阅模式如下图所示:

二、交换机(exchange)

生产者生产完消息之后,都是将消息通过channel交给交换机,即生产者并不直接和队列联系。在没有定义交换机的时候,RabbitMQ会启用内部预定义的交换机。即所有没有定义交换机,直接采用生产者发送消息到队列的,都是将消息发送给默认交换机。

交换机是一个很简单的东西,即将生产者发送的消息,按照预先定好的规则,转发给对应的队列。

1、广播发送

rabbitmq中,交换机的规则有fanout、direct、topic、headers等。本节的发布订阅模式,主要可以采用fanout模式。

fanout,类似网络技术中,子网的广播发送模式。即,fanout模式下,交换机会将信息发送给所有与其绑定的队列,即实现“发布”的功能。通常,再将每个队列给不同的消费者去消费,实现每个消费者都可以取到该消息,并各自进行后续相应的处理。

fanout模式如下图所示:

  

2、注意事项

1)提前绑定

fanout模式下,需要提前将交换机与队列进行绑定,一个交换机可以绑定多个队列,一个队列可以同多个交换机进行绑定。接受到消息的交换机没有与任何队列绑定,则消息会被抛弃。

2)该模式不需要routing key。

3、使用

1)使用

$channel->exchange_declare('logs', 'fanout', false, false, false);

$channel->basic_publish($msg, 'logs');

其中,第一个参数是交换机的名字,第二个参数,是交换机的模式。如果没有定义交换机的名称、模式,则采用默认的交换机转发生产者的消息。即可以看作,空字符串’’也是交换机的一个名字。

2)查看当前交换机数量

cli模式下,sudo rabbitmqctl list_exchanges

三、临时队列(Temporary queues)

当rabbitmq运行时,队列的名字非常重要,因为其在生产者方,交换机会将信息按照名字发送给队列,而消费者方,消费者需要通过队列的名字去队列取消息。因此,队列是rabbitmq中连接生产者与消费者的桥梁。

当开始使用时,需要的是一个空的、未被使用的队列;当连接断开,需要将队列关闭。

1、队列取名

为了保证队列是一个全新的队列,需要将给队列取一个随机的名字。rabbitmq提供了系统随机给生成队列名的方式,如下:

list($queue_name, ,) = $channel->queue_declare("");

即,当queue_declare时没有指定名字,采用空字符串"",则rabbitmq会给队列取一个随机的名字,形如amq.gen-JzTY20BRgKO-HjmUJj0wLg,则可以使用$queue_name,其就是队列的名字。

2、php的list

上述list是php中的list的用法,上述式子表示$channel->queue_declare("");的结果是一个含有3个元素的数组,将第一个元素赋值给$queue_name。

list()不是一个函数,而是类似array()一样的用法。

PHP官方文档中,list的示例:

$info = array('coffee', 'brown', 'caffeine');

list( , , $power) = $info;//$power=’caffeine’

四、绑定(binding)

上述提到,交换机必须与队列绑定,如果没有队列和交换机绑定,交换机会丢弃接收到的消息。绑定方式如下:

$channel->queue_bind($queue_name, 'logs');

其中,第一个参数是队列的名字,第二个参数是交换机的名字。

在cli中,查看绑定的方式如下:rabbitmqctl list_bindings。

——written by linhxx

更多最新文章,欢迎关注微信公众号“决胜机器学习”,或扫描右边二维码。

转载于:https://www.cnblogs.com/linhxx/p/8434168.html

RabbitMQ(三) ——发布订阅相关推荐

  1. RabbitMq之发布订阅模式

    这里写了一个简单的springboot的demo来处理RabbitMq的发布订阅 添加pom依赖 <dependency><groupId>com.rabbitmq</g ...

  2. RabbitMQ 之发布订阅模式

    publish/subscribe 发布订阅模式中,生产者不再直接与队列绑定,而是将数据发送至交换机Exchange 交换机Exchange用于将数据按某种规则送入与之绑定的队列,进而供消费者使用. ...

  3. RabbitMQ——消息发布订阅

    消息订阅发布 一个生产者,多个消费者 每个消费者都有自己的队列 生产者,没有直接把消息发送到队列,而是先发送到交换机 每个队列都要绑定到交换机 生产者发送的消息 经过交换机,到达队列,就能实现一个消息 ...

  4. RabbitMQ三种订阅模式

    订阅模式 Fanout Exchange--订阅模式 Direct Exchange--路由模式 Topic Exchange--通配符模式 Fanout Exchange 不处理路由键,只需要简单的 ...

  5. python消息订阅_python rabbitmq消息发布订阅

    发送端:import pika import sys connection = pika.BlockingConnection(pika.ConnectionParameters( host='loc ...

  6. RabbitMQ发布订阅实战-实现延时重试队列

    RabbitMQ是一款使用Erlang开发的开源消息队列.本文假设读者对RabbitMQ是什么已经有了基本的了解,如果你还不知道它是什么以及可以用来做什么,建议先从官网的 RabbitMQ Tutor ...

  7. RabbitMQ六种队列模式-发布订阅模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 [本文] RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

  8. 【转】RabbitMQ六种队列模式-3.发布订阅模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 [本文] RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

  9. 上下文管理、redis发布订阅、RabbitMQ发布订阅、SQLAlchemy

    一.上下文管理 import contextlib @contextlib.contextmanager def work_state(state_list,worker_thread):state_ ...

最新文章

  1. linux内核路由反向检查,反向路径过滤——reverse path filter
  2. Android关机流程源码分析
  3. 双绞线传输距离多长_网线数据传输最大距离是多少米
  4. 第六届北京八大处新春祈福庙会大年初一迎客
  5. 边缘生——保研与考研到底如何抉择!
  6. python(3)-动态参数实现字符串格式化
  7. 前端学习(526):等分布局
  8. 美国能源局投2100万美元加速光伏软成本下降
  9. 每天Leetcode 刷题 初级算法篇-数学问题-3的幂
  10. UVA10523 Very Easy !!!题解
  11. html打印word文档,HTML文件到WORD文档双面打印三步曲
  12. matlab数缺失值填充,matlab缺失值填补
  13. 关于 DXGI 截图 截屏 获取屏幕
  14. Flutter Package 开发、发布、使用
  15. ECCV2020:论文解读《Synthesize then Compare: Detecting Failures and Anomalies for Semantic Segmentation》
  16. K8s系列之:在容器内获取Pod信息(Downward API)
  17. 2012计算机科学排名,USnews2012美国大学排名计算机科学专业排名
  18. TPshop项目-功能测试(1)
  19. 移动互联网时代必读十大图书
  20. android10开发io接口,Android Things:外设I/O接口-GPIO

热门文章

  1. ABAP和Java的destination和JNDI
  2. Android日志拦截器,Retrofit2日志拦截器的使用
  3. Java入门算法(递归篇)丨蓄力计划
  4. java提取字符从mysql_MySQL 字符串截取SUBSTRING()函数
  5. java8和9兼容吗_甲骨文限制 Java 9 到 Java 8 的向后兼容性
  6. c#用canny算子做边缘提取_【图像处理】边缘检测
  7. python log函数_Python log10() 函数
  8. 搭建linux软件仓库,创建自己的YUM仓库
  9. Java connot reduce_Java8: Reduce方法
  10. c/s三层结构信息系统的三个层次_网络资讯:三层架构是什么