RabbitMQ 发布订阅

 

互联网公司对消息队列是深度使用者,所以须要咱们了解消息队列的方方面面,良好的设计及深刻的理解,更有利于咱们对消息队列的规划。缓存

当前咱们使用消息队列中发现一些问题异步

一、其实是异步无返回远程调用,由发布者定义队列,消费者订阅已定义的队列。分布式

二、并无体现解耦设计,并且开发人员间依然要像单体项目开发那样针对同一个功能不断沟通交互,提升了开发时间以及成本。spa

三、没有消息版本的实现,致使发布者服务和消费者服务必须一块儿更新。若是没有保持一致可能致使批量的合法消息被丢到死信队列,甚至可能要启动旧服务将旧版本的消息消费掉才能更新服务。而且开发人员要进入发布流程指导各服务的发布顺序。设计

四、订阅者的对象定义在“集群”,但现实中的确存在“节点”的订阅需求,如节点的配置更新、本地缓存的刷新等。code

快速、高效的使用消息队列,不须要过多的沟通成本,是咱们不断的追求。所以发布订阅映入咱们眼帘,公司内部称为分布式事件。对象

RabbitMQ的发布订阅能解决咱们的什么问题呢?blog

  1. 不须要发送端和接收端同时发布。相比较普通的队列方式,若是发送端发布,而消费端未发布,那么就会有大量的消息积压。
  2. 实现一次发布,屡次处理。

RabbitMQ发布订阅模式:像使用邮箱同样,不须要发送端和接收端共同发布。rabbitmq

发布订阅基础概念:队列

Exchange在定义的时候是有类型的,以决定究竟是哪些Queue符合条件,能够接收消息:

  1. fanout:全部bind到此exchange的queue均可以接收消息
  2. direct:经过routingKey和exchange决定的那个惟一的queue能够接收消息
  3. topic:全部符合routingKey(此时能够是一个表达式)的routingKey所bind的queue能够接收消息
  4. headers:经过headers 来决定把消息发给哪些queue(这个不多用)

fanout订阅发布模式(广播模式)

direct订阅发布模式(广播模式)

 

topic定义发布模式(广播模式)

实现发布订阅模式下消息的发布订阅主要有如下几个步骤:

  1. 建立消息会话IMQSession(前提链接IMQConnection已经创建好了)
  2. 声明要订阅的消息主题
  3. 声明消息主题订阅者
  4. 声明消息发送者
  5. 发送消息
  6. 主题订阅者接收消息
  7. 关闭主题订阅者
  8. 关闭会话

生产者发送广播是实时的,消费者须要提早等待生产者发生消息,这个又叫订阅发布,收音机模式,就像只有收音机打开了才能听到锁定的FM频道,可是若是在节目开始一段时间,再打开收音机的话,以前的节目就收听不到了。即订阅以前的消息都是收不到的。

发布订阅相关的执行命令:

rabbitmqctl list_exchanges  列出全部exchange

临时队列:

    咱们须要每次链接至mq的时候使用一个新队列,使用完了就销毁,这里可以使用临时队列:

result = channel.queue_declare()

   而后就能够经过result.method.queue获取临时队列名称,提供给消费者使用。 另外消费者用完后须要销毁,可添加一个exclusive选项:result = channel.queue_declare(exclusive=True)  表明该队列是排他性队列。

绑定:Binding

channel.queue_bind(exchange='logs',
                   queue=result.method.queue)

查看系统全部的绑定命令

rabbitmqctl list_binding

发布订阅相关的概念主要包括exchange、binding、routingkey、及queue。咱们只须要按照步骤,使用合适的交换器类型,便可实现发布订阅的一对多消息处理。

相关文章
相关标签/搜索