RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议。

工作过程

发布者(Publisher)发布消息(Message),经由交换机(Exchange)。交换机根据路由规则将收到的消息分发给与该交换机绑定的队列(Queue)。最后 AMQP 代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取

消息投递

  Exchange、Queue与Routing Key三个概念是理解RabbitMQ消息投递的关键。RabbitMQ中一个核心的原则是,消息不能直接投递到Queue中。Producer只能将自己的消息投递到Exchange中,由Exchange按照routing_key投递到对应的Queue中,具体的架构参见下图。
  如何完成这三者关系的绑定?总结起来是两点:第一,在Consumer Worker中,声明自己对哪个Exchange感兴趣,并将自己的Queue绑定到自己感兴趣的一组routing_key上,建立相应的映射关系;第二,在Producer中,将消息投递一个Exchange中,并指明它的routing_key。由此可见,Queue这个概念只是对Consumer可见,Producer并不关心消息被投递到哪个Queue中。

消息队列有两种场景

  • 生产者消费者:一条消息只能有一个消费者

  • 发布者订阅者:一条消息可以被多个消费者收到

消息如果只是存储在队列里是没有任何用处的。被应用消费掉,消息的价值才能够体现。在 AMQP模型中,有两种途径可以达到此目的:
1)将消息投递推送给应用 (“push API”),即称为发布订阅者的模式。
2)应用根据需要主动获取消息 (“pull API”),即称为生产消费者的模式。
使用 push API,应用(application)需要明确表示出它在某个特定队列里所感兴趣的,想要消费的消息。如是,我们可以说应用注册了一个消费者,或者说订阅了一个队列。一个队列可以注册多个消费者,也可以注册一个独享的消费者(当独享消费者存在时,其他消费者即被排除在外)。

生产消费者模式

  对于上报的数据,如果是special的行为,需要优先处理。从上图可以看到,数据上报端负责将数据投递到RabbitMQ对应的Exchange,并指明routing_key是common还是special。数据处理端,可以根据情况启多个Woker来消费数据,但至少需要两个,一个用来处理common数据,一个用来处理special的数据。注意:当需要增加多个Worker来消费同一类数据时,需要保持Queue名字一致,比如上面的Common数据。

订阅发布模式

架构如图所示,使用event来作为RabbitMQ的routing key的名字。Event Processor 01对event 01 和event 02感兴趣,则在启动Consumer Worker时,将自己的Queue绑定到这两个routing key上即可,其他Event Processor也是如此,这样便完成了事件的订阅。当有事件发布时,消息便会按照event被投递到对应的Queue中。然后推送到订阅者。

RabbitMQ中的生产者消费者与订阅发布者两种模式相关推荐

  1. 简述python中怎样导入模块_Python中导入模块的两种模式,import

    import import pandas import pandas as pd 使用函数方式:.(),或者.() 比如 pandas.read_csv("data/stock.csv&qu ...

  2. python获取绝对路径_python3中获取文件当前绝对路径的两种方法

    方法1: import sys print(sys.argv) 得到文件当前绝对路径字符串的一个列表 ['D:/pycharm/PracticeProject/ClientServerNetworki ...

  3. Android中实现SQLite数据库CRUD操作的两种方式

    Android中实现SQLite数据库CRUD操作的两种方式 SQLite是一款轻量级的关系型数据库,具有运行速度.占用资源少的特点.通常只需要几百KB的内存就够了,因此特别适合在移动设备上使用.SQ ...

  4. Python中import模块的两种模式

    import <模块名> import pandasimport pandas as pd 使用函数方式:<模块名>.<函数名>(<函数参数>),或者& ...

  5. java中domain什么意思_java解析URL中domain、端口和协议的两种方法

    java解析URL中domain.端口和协议的两种方法 Java代码 收藏代码 @Test public void parseDomain() throws IOException { for (in ...

  6. 在PHP代码中处理JSON 格式的字符串的两种方法:

    总结: 在PHP代码中处理JSON 格式的字符串的两种方法: 方法一: $json= '[{"id":"1","name":"\u ...

  7. Visual C++中error spawning cl.exe错误的两种解决方法

    Win10重装VC的朋友们,应该遇到过很对问题,按照网上很多建议装虚拟机和修改文件的文章来操作效果都不是很理想,本人也深受其扰,不过接下来这篇文章救我于水深火热之中. 原文地址为:Visual C++ ...

  8. js中截取字符串前几位的两种方法slice()substring()

    在Javascript使用字符串中,我们不一定需要全部的字符串,这时就需要截取字符串.本文主要介绍js中截取字符串前几位的两种方法:1.使用slice() 方法:2.使用substring() 方法. ...

  9. excel日历弄到html,Excel中进行添加日历控件的两种方法

    有时我们在运用Excel表格的时候会运用到日历的控件,可是小伙伴们却不知道在哪里添加.那么我们来看一下,它到底躲藏在哪里,又该怎么添加呢?今天,学习啦小编就教大家在Excel中进行添加日历控件的两种方 ...

最新文章

  1. IDEA IntelliJ/ DataGrip 修改自动补全快捷键
  2. Access update的时候传递参数的顺序
  3. AngularJs应用页面切换优化方案
  4. Linux系统下的DDOS***防范
  5. minio分布式集群示例: 4节点,每节点4块盘
  6. first level cache check - User parameter /UI2/CACHE_DISABLE
  7. Java二十三种设计模式 之代理(proxy)
  8. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-008-SpEL介绍
  9. appian php,aha2mao
  10. Platform平台设备驱动框架
  11. Mysql : InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800!
  12. H5+CSS 实现前面带搜索图标的搜索框
  13. MOOC《程序设计入门——C语言》翁恺 第六周编程练习及答案
  14. Linux中pkg-config的使用
  15. web开发技巧-网页排版布局常见问题及解决办法
  16. java image转换icon_内存转换Image到Icon
  17. 【转】PHP PDO 学习笔记
  18. java计算机毕业设计我图你秀图片素材交易平台源代码+数据库+系统+lw文档
  19. 个人永久性免费-Excel催化剂功能第91波-地图数据挖宝之行政区域信息实时下载(含经纬度)...
  20. htc服务器更新系统,HTC U Ultra刷机教程 HTC U Ultra卡刷ruu升级更新官方系统

热门文章

  1. 大一计算机学科导论作业
  2. PyTorch 分布式框架 Ray :保姆级入门教程
  3. 国泰新点变声系统服务器,江西公共资源交易网
  4. 贝叶斯线性估计----统计学习基础
  5. 微信公众号开发--关注后自动回复(Java记录篇)
  6. 供应高耐压TY71XX系列稳压IC 输出带放过冲
  7. 【FLASH存储器系列七】NAND FLASH之ONFI规范
  8. 《Python语言程序设计》王恺 机械工业出版社 第七章课后习题答案
  9. 明明的随机数 蓝桥杯(C++)
  10. twitter_Twitter:让信息冲刷您