RabbitMQ Exchange类型和工作模式介绍

RabbitMQ Exchange类型和工作模式介绍

  • 一RabbitMQ Exchange类型
    • 1.1.Fanout
    • 1.2.Direct
    • 1.3.Topic
    • 1.4.Headers
  • 二 RabbitMQ 工作模式介绍
    • 2.1.work工作模式(资源的竞争)
    • 2.2.publish/subscribe发布订阅(共享资源)
    • 2.3.routing路由模式
      • 应用--direct交换器
    • 2.4.topic 主题模式(路由模式的一种)

一RabbitMQ Exchange类型

RabbitMQ常用的交换器类型有: fanout、 direct、 topic、 headers四种。

1.1.Fanout

会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中

如图:

在这里插入图片描述

1.2.Direct

direct类型的交换器路由规则很简单,它会把消息路由到那些BindingKey和RoutingKey完全匹配的 队列中,如下图:在这里插入图片描述

1.3.Topic

topic类型的交换器在direct匹配规则上进行了扩展,也是将消息路由到BindingKey和RoutingKey 相匹配的队列中,这里的匹配规则稍微不同,它约定:

  • BindingKey和RoutingKey一样都是由.分隔的字符串;
  • BindingKey中可以存在两种特殊字符*#,用于模糊匹配,其中*用于匹配一个单词, #用于匹配多个单词(可以是0个)。
    在这里插入图片描述

1.4.Headers

headers类型的交换器不依赖于路由键的匹配规则来路由信息,而是根据发送的消息内容中的 headers属性进行匹配。在绑定队列和交换器时指定一组键值对,当发送的消息到交换器时, RabbitMQ会获取到该消息的headers,对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果匹配,消息就会路由到该队列。headers类型的交换器性能很差,不实用。

二 RabbitMQ 工作模式介绍

2.1.work工作模式(资源的竞争)

生产者发消息,启动多个消费者实例来消费消息,每个消费者仅消费部分信息,可达到负载均衡的效果。在这里插入图片描述

1.消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2同时监听同一 个队列,消息被消费。C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患:高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize) 保证一条消息只能被一个消费者使用)。

2.2.publish/subscribe发布订阅(共享资源)

使用fanout类型交换器,routingKey忽略。每个消费者定义生成一个队列并绑定到同一个 Exchange,每个消费者都可以消费到完整的消息。

在这里插入图片描述
1、每个消费者监听自己的队列
2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。

2.3.routing路由模式

在这里插入图片描述

使用 direct类型的Exchange,发N条消费并使用不同的 routingKey,消费者定义队列并将队列、 routingKey、Exchange绑定。此时使用 direct模式Exchagne必须要 routingKey完全匹配的 情况下消息才会转发到对应的队列中被消费

上一个模式中,可以将消息广播到很多接收者。 现在我们想让接收者只接收部分消息,如,我们通过直接模式的交换器将关键的错误信息记录到 log文件,同时在控制台正常打印所有的日志信息。

应用–direct交换器

分布式系统中有很多应用,这些应用需要运维平台的监控,其中一个重要的信息就是服务器的日志 记录。
我们需要将不同日志级别的日志记录交给不同的应用处理。 如何解决?

使用direct交换器

如果要对不同的消息做不同的处理,此时不能使用 fanout类型的交换器,因为它只会盲目的广播消息。 我们需要使用 direct类型的交换器。 direct交换器的路由算法很简单只要消息的 routingKey和队列的 bindingKey对应,消息就可以推送给该队列。

在这里插入图片描述

上图中的交换器 X是 direct类型的交换器,绑定的两个队列中,一个队列的 bindingKey是 orange,另一个队列的 bindingKey是 black和 green。 如此,则 routingKey是 orange的消息发送给队列Q1, routingKey是 black和 green的消息发 送给Q2队列,其他消息丢弃。

2.4.topic 主题模式(路由模式的一种)

使用 topic类型的交换器,队列绑定到交换器、 bindingKey时使用通配符,交换器将消息路由转 发到具体队列时会根据消息 routingKey模糊匹配,比较灵活。

上个模式中,我们通过 direct类型的交换器做到了根据日志级别的不同,将消息发送给了不同队列的。 这里有一个限制,现在我不仅想根据日志级别划分日志消息,还想根据日志来源划分日志,怎 么做?

比如,我想监听cron服务发送的 error消息,又想监听从kern服务发送的所有消息。 此时可以使用RabbitMQ的主题模式( Topic)。

要想 topic类型的交换器, routingKey就不能随便写了,它必须得是点分单词。单词可以随便写,生产中一般使用消息的特征。如:“stock.usd.nyse”,“nyse.vmw”,“quick.orange.rabbit”等。该点分单词字符串最长255字节。 bindingKey也必须是这种形式。 topic类型的交换器背后原理跟 direct类型的类似:只要队列 的 bindingKey的值与消息的 routingKey匹配,队列就可以收到该消息。有两个不同:

  1. *(star)匹配一个单词
  2. #匹配0到多个单词
    在这里插入图片描述
    上图中,我们发送描述动物的消息。消息发送的时候指定的 routingKey包含了三个词,两个点。 第一个单词表示动物的速度,第二个是颜色,第三个是物种:..。

创建三个绑定:

Q1绑定到*.orange.*
Q2绑定到 *.*.rabbitlazy.#

  1. Q1关注orange颜色动物的消息

  2. Q2关注兔子的消息,以及所有懒的动物消息

如果不能匹配,就丢弃消息。
如果发送的消息 routingKey是" lazy.orange.male.rabbit",则会匹配最后一个绑定。
如果在 topic类型的交换器中 bindingKey使用 #,则就是 fanout类型交换器的行为。
如果在 topic类型的交换器中 bindingKey中不使用 *和 #,则就是 direct类型交换器的行为

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32921.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSDN个性化推荐系统-负反馈测试

文章目录 前言一、uc不感兴趣标签过滤测试1.uc不感兴趣标签获取(uc_unlike_tag_list)1.1个人中心界面1.2从标签中可以发现什么?1.3与研发确认点1.4设计开发1.5接口获取结果 2.推荐流文章标签获取(tag_list)2.1部分代码2.2基本标签校验2.3基本标签校验结果 3.推荐流u…

华为云专家出品《深入理解边缘计算》电子书上线

华为开发者大会PaaS生态电子书推荐,助你成为了不起的开发者! 什么是边缘计算?边缘计算的应用场景有哪些? 华为云出品《深入理解边缘计算》电子书上线 带你系统理解云、边、端协同的相关原理 了解开源项目的源码分析流程 学成能…

Linux--在当前路径下创建目录/文件夹指令:mkdir

语法: mkdir [选项] 文件名 功能: 在当前目录下创建一个名为 “文件名”的目录 常用选项: -p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些不存在的目录,即一次可以建立…

基于Ant DesignPro Vue + SpringBoot 前后端分离 - 后端微服化 + 接口网关 + Nacos + Sentinel

基于Ant DesignPro Vue SpringBoot 前后端分离 - 后端微服化 接口网关 Nacos Sentinel 通过Ant DesignPro Vue SpringBoot 搭建的后台管理系统后,实现了前后端分离,并实现了登录认证,认证成功后返回该用户相应权限范围内可见的菜单。 后…

Linux基础:Vim编辑器实用指南

前言 Linux基础是学习云原生的重中之重,如果你还不知道学习路线可以参考: 耗时3个月,线下访谈30 csdn大佬,规划出了我的云原生学习路线 文章目录 前言vim的介绍vim的四种模式1. 插入模式1.1 进入插入模式:1.2 退出插入…

[Pytorch]Broadcasting广播机制

文章目录 Broadcasting广播机制BroadcastableBroadcasting Broadcasting广播机制 Broadcasting机制用于在不同维度的张量进行运算时进行维度的自动增加与扩展,Broadcasting机制使用的前提是两个参与运算的张量是可broadcastable的。 Broadcastable 怎样的两个向量…

【数据分析之道-Matplotlib(七)】Matplotlib直方图

文章目录 专栏导读1、hist()基本语法2、使用 hist() 函数绘制多个数据组的直方图3、修改直方图的颜色及边框颜色4、六一儿童节为主题,使用直方图进行可视化 专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享pyth…

web入门——springboot、HTTP协议

这里写目录标题 springboot入门 http协议概念以及特点请求协议格式请求头的一些含义解释 响应协议格式具体的状态码以及响应头的一些含义解释 协议解析 springboot 入门 http协议 概念以及特点 请求协议 格式 包括请求行、请求头、请求体三部分(请求体是pos请求方…

想要让视频素材格式快速调整转换的方法分享

有时候有些视频播放软件不支持播放某些格式的视频文件?那要怎么解决呢?换一个播放软件?不妨试试批量转换视频格式,简单的几步操作就能快速解决烦恼,跟着小编一起来看看具体的操作环节吧。 首先先进入“固乔科技”的官网…

MapReduce分布式计算(二)

MapReduce工作流程 原始数据File 1T数据被切分成块存放在HDFS上,每一个块有128M大小 数据块Block hdfs上数据存储的一个单元,同一个文件中块的大小都是相同的 因为数据存储到HDFS上不可变,所以有可能块的数量和集群的计算能力不匹配 我们需要一个动态…

MySQL中的DDL操作,MySQL中DML操作,MySQL查询数据,SQL函数,MySQL中的索引,MySQL事务,MySQL的用户管理,MySQL分页查询

目录 MySQL中的DDL操作 一、创建表与删除表 1,创建表 2,查看已创建的表。 3,删除表 二、修改表 1,修改表名 2,修改列名 3,修改列类型 4,添加新列 5,删除指定列 三、MySQ…

ML算法——Support Vector Machine随笔【机器学习】

文章目录 4、Support Vector Machine (SVM)4.1、理论部分4.1.1、更优的决策边界4.1.2、解决低维不可分问题 4.2、sklearn 实现4.2.1、SVM 分类(SVC)4.2.2、SVM回归(SVR)4.2.3、网格调参 4.3、案例 4、Support Vector Machine (SVM…

UE5 Stride Warping Orientation Warping功能学习

在UE5的 Lyra Demo中,运用到了各类动画Warping(动画扭曲)技术,通过各类Warping节点在动画蓝图中的合理组织,可以有效的解决运动滑步问题,并为动画增添更多细节。 本文主要基于Animation Warping插件讲一下…

python 加速(1)

文章目录 简单步骤像Python一样做torch 的一切安装Cmake安装 Torch (GPU)CMakeLists.txt试用小样设置 CLion 环境 Cuda配置VS C 环境建上手的文件step1: interpolation.cppstep2: interpolation_kernel.custep3: include/ utils.hstep4: setup.pystep5: …

【系统架构】第五章-软件工程基础知识(软件测试、净室软件工程、基于构件的软件工程、 软件项目管理)

软考-系统架构设计师知识点提炼-系统架构设计师教程(第2版) 软件测试 一、测试方法 以测试过程中程序执行状态为依据可分为静态测试(ST)和动态测试(DT) 以具体实现算法细节和系统内部结构的相关情况为根据…

【强化学习】常用算法之一 “A3C”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

VUE3-组件问题

VUE3-组件问题 文章目录 VUE3-组件问题一、S-Table1.问题描述2.问题展示3.问题解决 二、form表单无法显示1.问题描述2.问题展示3.问题解决 三、input 框为不可编辑状态四、Echarts组件未渲染五、图片正常引用,但是部署服务器部署不上去,看不到图片1.图片…

element封装 table表格 ,插槽的使用,修改el-table-column的值

举例 vue2这种不封装的 直接写的很罗嗦麻烦 下面圈起来的可以封装一个对象 进行循环 弊端: 循环后 无法进行获取更改某一列的值 比如data日期我需要转换年月日 不循环我直接在这个el-table-column的这一列进行写&#xff08;如下&#xff09; <el-table-column label&quo…

Vue3解决:[Vue warn]: Failed to resolve component: el-table(或el-button) 的三种解决方案

1、问题描述&#xff1a; 其一、报错为&#xff1a; [Vue warn]: Failed to resolve component: el-table If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement. at <App> 或者&#xff1a; …

实验 4:排序与查找

东莞理工的学生可以借鉴&#xff0c;请勿抄袭 1.实验目的 通过实验达到&#xff1a; 理解典型排序的基本思想&#xff0c;掌握典型排序方法的思想和相应实现算法&#xff1b; 理解和掌握用二叉排序树(BST)实现动态查找的基本思想和相应的实现 算法。 理解和掌握哈希(HASH)存…