当前位置: 首页 > news >正文

消息队列-Rabbit运行机制

在这里插入图片描述

Producer(生产者) 和 Consumer(消费者)

  • Producer(生产者) :生产消息的一方(邮件投递者)
  • Consumer(消费者) :消费消息的一方(邮件收件人)

消息一般由 2 部分组成:消息头(或者说是标签 Label)和 消息体。消息体也可以称为 payLoad ,消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括 routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。生产者把消息交由 RabbitMQ 后,RabbitMQ 会根据消息头把消息发送给感兴趣的 Consumer(消费者)。

Exchange(交换器)

在 RabbitMQ 中,消息并不是直接被投递到 Queue(消息队列) 中的,中间还必须经过 Exchange(交换器) 这一层,Exchange(交换器) 会把我们的消息分配到对应的 Queue(消息队列) 中。

Exchange(交换器) 用来接收生产者发送的消息并将这些消息路由给服务器中的队列中,如果路由不到,或许会返回给 Producer(生产者) ,或许会被直接丢弃掉 。这里可以将 RabbitMQ 中的交换器看作一个简单的实体。

RabbitMQ 的 Exchange(交换器) 有 4 种类型,不同的类型对应着不同的路由策略:direct(默认),fanout, topic, 和 headers,不同类型的 Exchange 转发消息的策略有所区别。这个会在介绍 Exchange Types(交换器类型) 的时候介绍到。
在这里插入图片描述
生产者将消息发给交换器的时候,一般会指定一个 RoutingKey(路由键),用来指定这个消息的路由规则,而这个 RoutingKey 需要与交换器类型和绑定键(BindingKey)联合使用才能最终生效。

RabbitMQ 中通过 Binding(绑定) 将 Exchange(交换器) 与 Queue(消息队列) 关联起来,在绑定的时候一般会指定一个 BindingKey(绑定建) ,这样 RabbitMQ 就知道如何正确将消息路由到队列了,如下图所示。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。Exchange 和 Queue 的绑定可以是多对多的关系。

在这里插入图片描述

Queue(消息队列)

Queue(消息队列) 用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。

RabbitMQ 中消息只能存储在 队列 中,这一点和 Kafka 这种消息中间件相反。Kafka 将消息存储在 topic(主题) 这个逻辑层面,而相对应的队列逻辑只是 topic 实际存储文件中的位移标识。 RabbitMQ 的生产者生产消息并最终投递到队列中,消费者可以从队列中获取消息并消费。

多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊(Round-Robin,即轮询)给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理,这样避免消息被重复消费。

RabbitMQ 不支持队列层面的广播消费,如果有广播消费的需求,需要在其上进行二次开发,这样会很麻烦,不建议这样做。

Broker(消息中间件的服务节点)

对于 RabbitMQ 来说,一个 RabbitMQ Broker 可以简单地看作一个 RabbitMQ 服务节点,或者 RabbitMQ 服务实例。大多数情况下也可以将一个 RabbitMQ Broker 看作一台 RabbitMQ 服务器。

下图展示了生产者将消息存入 RabbitMQ Broker,以及消费者从 Broker 中消费数据的整个流程。
在这里插入图片描述

消息队列的运转过程这样图 1 中的一些关于 RabbitMQ 的基本概念我们就介绍完毕了,下面再来介绍一下 Exchange Types(交换器类型) 。

相关文章:

  • 美国犹他州立大学《Nature Geoscience》(IF=18)!揭示草本植物对土壤有机碳的重要贡献!
  • 【做一道算一道】目标和
  • 服务器可以充当负载均衡器
  • 从输入URL到页面加载完中间发生了什么?
  • C# 通过Win32API设置客户端系统时间
  • git Fork或者git clone克隆别人的项目到自己的仓库如何保持原仓库同步
  • flume配置----a1.sources.r1.positionFile=xxxx.json
  • mysql如何创建并执行事件?
  • Mysql union语句
  • Bagging与Boosting的应用与优势
  • 计算机网络期末复习
  • 【设计模式-12】代理模式的代码实现及使用场景
  • 【SpringBoot】94、SpringBoot中使用MyBatis-Plus实现数据权限管理
  • 上海交通大学、中科大 开源镜像站停止 Docker Hub 仓库镜像支持后的可用替代源
  • springboot宠物领养系统-计算机毕业设计源码07863
  • python3.6+scrapy+mysql 爬虫实战
  • [case10]使用RSQL实现端到端的动态查询
  • EventListener原理
  • java8-模拟hadoop
  • Java知识点总结(JavaIO-打印流)
  • js如何打印object对象
  • KMP算法及优化
  • log4j2输出到kafka
  • OSS Web直传 (文件图片)
  • Python学习笔记 字符串拼接
  • React的组件模式
  • vue-loader 源码解析系列之 selector
  • web标准化(下)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 从tcpdump抓包看TCP/IP协议
  • 从零开始在ubuntu上搭建node开发环境
  • 分享一份非常强势的Android面试题
  • 聊聊flink的TableFactory
  • 前端攻城师
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 收藏好这篇,别再只说“数据劫持”了
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 积累各种好的链接
  • ​queue --- 一个同步的队列类​
  • (¥1011)-(一千零一拾一元整)输出
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (强烈推荐)移动端音视频从零到上手(下)
  • (四)c52学习之旅-流水LED灯
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转载)从 Java 代码到 Java 堆
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET业务框架的构建
  • :“Failed to access IIS metabase”解决方法
  • @Query中countQuery的介绍
  • @SuppressWarnings注解
  • [20190401]关于semtimedop函数调用.txt