RabbitMQ(三) ——发布订阅

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

时间: 2024-08-25 14:58:45

RabbitMQ(三) ——发布订阅的相关文章

【译】RabbitMQ:发布-订阅(Publish/Subscribe)

在前一篇教程中,我们创建了一个工作队列,我们假设在工作队列后的每一个任务都只被调度给一个消费者.在这一部分,我们将做一些完全不一样的事情,调度同一条消息给多个消费者,也就是有名的“发布-订阅”模式.为了阐述这种模式,我们将构建一个简单的日志系统.该系统将由两部分组成:一部分发送日志消息,另一部分接收并且打印日志消息,在这个日志系统中,每一份运行着的接收程序都将会收到消息.这样我们可以运行一个接收者把日志写入到磁盘中,同时可以运行另一个接收者将日志打印到显示器上面.也就是说,发布的日志消息会被广播

RabbitMQ之发布订阅

将同一个队列的消息发送给多个消费者的模式就是"发布/订阅", 这种模式的基础是将消息广播到所有的接收器上. 实际上,RabbitMQ中消息传递模型的核心思想是: 生产者不直接发送消息到队列. 实际的运行环境中,生产者是不知道消息会发送到哪个队列上, 她只会将消息发送到一个交换器, 交换器也像一个生产线,她一边接收生产者发来的消息,另外一边则根据交换规则,将消息放到队列中. 交换器必须知道她所接收的消息是什么?它应该被放到哪个队列中?它应该被添加到多个队列吗?还是应该丢弃? 这些规则都是

RabbitMQ学习(三)订阅/发布

RabbitMQ学习(三)订阅/发布 1.RabbitMQ模型 前面所学都只用到了生产者.队列.消费者.如上图所示,其实生产者并不直接将信息传输到队列中,在生产者和队列中间有一个交换机(Exchange),我们之前没有使用到交换机是应为我们没有配置交换机,使用了默认的交换机. 有几个可供选择的交换机类型:直连交换机(direct), 主题交换机(topic), (头交换机)headers和 扇型交换机(fanout) 这里我们使用扇形交换机做一个简单的广播模型:一个生产者和多个消费者接受相同消息

python使用rabbitMQ介绍三(发布订阅模式)

一.模式介绍 在前面的例子中,消息直接发送到queue中. 现在介绍的模式,消息发送到exchange中,消费者把队列绑定到exchange上. 发布-订阅模式是把消息广播到每个消费者,每个消费者接收到的消息都是相同的. 一个生产者,多个消费者,每一个消费者都有自己的一个队列,生产者没有将消息直接发送到队列,而是发送到了交换机,每个队列绑定交换机,生产者发送的消息经过交换机,到达队列,实现一个消息被多个消费者获取的目的.需要注意的是,如果将消息发送到一个没有队列绑定的exchange上面,那么该

rabbitmq系列三 之发布/订阅

1.发布/订阅 在上篇教程中,我们搭建了一个工作队列,每个任务只分发给一个工作者(worker).在本篇教程中,我们要做的跟之前完全不一样 -- 分发一个消息给多个消费者(consumers).这种模式被称为"发布/订阅". 为了描述这种模式,我们将会构建一个简单的日志系统.它包括两个程序--第一个程序负责发送日志消息,第二个程序负责获取消息并输出内容. 在我们的这个日志系统中,所有正在运行的接收方程序都会接受消息.我们用其中一个接收者(receiver)把日志写入硬盘中,另外一个接受

RabbitMQ学习第三记:发布/订阅模式(Publish/Subscribe)

工作队列模式是直接在生产者与消费者里声明好一个队列,这种情况下消息只会对应同类型的消费者. 举个用户注册的列子:用户在注册完后一般都会发送消息通知用户注册成功(失败).如果在一个系统中,用户注册信息有邮箱.手机号,那么在注册完后会向邮箱和手机号都发送注册完成信息.利用MQ实现业务异步处理,如果是用工作队列的话,就会声明一个注册信息队列.注册完成之后生产者会向队列提交一条注册数据,消费者取出数据同时向邮箱以及手机号发送两条消息.但是实际上邮箱和手机号信息发送实际上是不同的业务逻辑,不应该放在一块处

.Net下RabbitMQ发布订阅模式实践

一.概念AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然.AMQP的主要特征是面向消息.队列.路由(包括点对点和发布/订阅).可靠性.安全.RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionScri

RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)

(本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个任务会被交付给一个[工人].在这一部分我们将做一些完全不同的事情--我们将向多个[消费者]传递信息.这种模式被称为"发布/订阅". 为了说明这种模式,我们将构建一个简单的日志系统.它将包括两个程序,第一个将发出日志消息,第二个将接收并打印它们. 在我们的日志系统中每个接收程序的运行副本都会得到消息.这样我们就可以运行一个接收者程序,将日志记录到磁盘:同时我们可以运行另

rabbitMq及安装、fanout交换机-分发(发布/订阅)

<dependency>            <groupId>com.rabbitmq</groupId>            <artifactId>amqp-client</artifactId>            <version>3.6.5</version> </dependency> 最常见的几种消息通信模式主要有发布-订阅.点对点这两种http://blog.csdn.net/wooge