互联网公司对消息队列是深度使用者,因此需要我们了解消息队列的方方面面,良好的设计及深入的理解,更有利于我们对消息队列的规划。

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

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

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

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

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

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

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

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

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。我们只需要按照步骤,使用合适的交换器类型,即可实现发布订阅的一对多消息处理。

RabbitMQ 发布订阅的更多相关文章

  1. RabbitMQ 发布订阅持久化

    RabbitMQ是一种重要的消息队列中间件,在生产环境中,稳定是第一考虑.RabbitMQ厂家也深知开发者的声音,稳定.可靠是第一考虑,为了消息传输的可靠性传输,RabbitMQ提供了多种途径的消息持 ...

  2. RabbitMQ 发布/订阅

    我们会做一些改变,就是把一个消息发给多个消费者,这种模式称之为发布/订阅(类似观察者模式). 为了验证这种模式,我们准备构建一个简单的日志系统.这个系统包含两类程序,一类程序发动日志,另一类程序接收和 ...

  3. RabbitMQ 发布订阅-实现延时重试队列(参考)

    RabbitMQ消息处理失败,我们会让失败消息进入重试队列等待执行,因为在重试队列距离真正执行还需要定义的时间间隔,因此,我们可以将重试队列设置成延时处理.今天参考网上其他人的实现,简单梳理下消息延时 ...

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

    一.概念AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发 ...

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

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

  6. 3.rabbitmq 发布/订阅

    1. 发布者 #coding:utf8 import pika import json import sys message = ''.join(sys.argv[1:]) or "hell ...

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

    在前一篇教程中,我们创建了一个工作队列,我们假设在工作队列后的每一个任务都只被调度给一个消费者.在这一部分,我们将做一些完全不一样的事情,调度同一条消息给多个消费者,也就是有名的“发布-订阅”模式.为 ...

  8. rabbitmq消息队列——"发布订阅"

    三."发布订阅" 上一节的练习中我们创建了一个工作队列.队列中的每条消息都会被发送至一个工作进程.这节,我们将做些完全不同的事情--我们将发送单个消息发送至多个消费者.这种模式就是 ...

  9. RabbitMQ入门教程——发布/订阅

    什么是发布订阅 发布订阅是一种设计模式定义了一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象.这个主题对象在自身状态变化时,会通知所有的订阅者对象,使他们能够自动更新自己的状态. 为了描述这种 ...

随机推荐

  1. myeclipse10 blue版激活码

    http://blog.itpub.net/27042095/viewspace-1164998/

  2. SpringBoot自定义属性配置以及@ConfigurationProperties注解与@Value注解区别

    我们可以在application.properties中配置自定义的属性值,为了获取这些值,我们可以使用spring提供的@value注解,还可以使用springboot提供的@Configurati ...

  3. 自动化测试基础篇--Selenium select下拉框

    摘自https://www.cnblogs.com/sanzangTst/p/7681523.html 一.什么是下拉框 下拉框是多项选择项,选择其中一种,类似下面(以百度搜索设置为例) 源代码如下所 ...

  4. Windows 系统下 mysql workbench 的安装及环境配置

    1.MySQL的官网地址:https://www.mysql.com/ 2,选择DOWNLOADS 3.选择community 再MySQL workbench 4.安装MySQL workbench ...

  5. 解决 win10 由于磁盘缓慢造成机器迟钝

    关闭 windows 的superfetch服务 建议禁止 superfetch服务: http://www.360quan.com/safe/6946.html 操作: http://jingyan ...

  6. LeetCode算法题-Merge Sorted Array(Java实现)

    这是悦乐书的第161次更新,第163篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第20题(顺位题号是88).给定两个排序的整数数组nums1和nums2,将nums2中 ...

  7. TCP Health Checks

    This chapter describes how to configure health checks for TCP. Introduction NGINX and NGINX Plus can ...

  8. ORC Creation Best Practices

    Short Description: ORC Creation Best Practices with examples and references. Article Synopsis. ORC i ...

  9. 对flexbox伸缩概念的深入浅出解释

    flex布局最难理解的,就是剩余空间和伸缩概念了,此文很好的作了解释: https://www.cnblogs.com/ghfjj/p/6529733.html 转自:http://zhoon.git ...

  10. 彻底理解js中的&&和||

    阅读代码时对一行代码很困惑 step > max_step && (step = min_step); 查阅资料后发现它等价于 if (step > max_step) { ...