谷粒商城实战笔记-251-商城业务-消息队列-Exchange类型

2024-08-24 10:36

本文主要是介绍谷粒商城实战笔记-251-商城业务-消息队列-Exchange类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一,Exchange
  • 二,Exchange的四种类型
    • 1,direct
    • 2,fanout
    • 3,topic
  • 三,实操
    • 1,创建一个exchange
    • 2,创建一个queue
    • 3,将queue绑定到exchange

一,Exchange

在这里插入图片描述
AMQP 中消息的路由过程和 Java 开发者熟悉的 JMS 存在一些差别,AMQP 中增加了 Exchange 和 Binding 的角色。生产者把消息发布到 Exchange 上,消息最终到达队列并被消费者接收,而 Binding 决定交换器的消息应该发送到那个队列。

二,Exchange的四种类型

Exchange 分发消息时根据类型的不同的分发策略有区别,目前共四种类型:

  • direct
  • fanout
  • topic
  • headers。
    Headers 匹配 AMQP 消息的 header 而不是路由键,headers 交换器完全一致,但性能差很多,所以直接用另外三种类型。

1,direct

在这里插入图片描述
Direct Exchange(直连交换机)是最简单的交换机类型,它会将消息路由到与routing key完全匹配的队列上。

也就是说,如果一个队列绑定到交换机上的binding key为“dog”,那么:

  • 只有当消息的routing key也为“dog”时,该消息才会被投递到这个队列中。
  • 如果消息的routing key为“dog.puppy”或者“dog.guard”,则不会被投递给这个队列。

在图中可以看到,当消息的routing key等于KEY时,交换机会将消息发送到对应的队列中。如果一个队列绑定了交换机,并且要求路由键为"dog",那么只有当routing key标记为"dog"的消息才会被转发到这个队列,而不会转发"dog.puppy"或"dog.guard"等其他不完全匹配的消息。

2,fanout

在这里插入图片描述

图中展示了Fanout Exchange的工作原理,它将所有发送到该交换机的消息都转发到所有绑定的队列上去。

Fanout Exchange(扇出交换机)是 RabbitMQ 提供的一种非常简单且高效的交换机类型。它的基本思想是将接收到的所有消息广播给与之关联的所有队列,类似于子网内的广播通信方式。在这种模式下,不需要考虑任何路由键或者绑定规则,只要一个队列与 fanout 交换机进行了绑定,那么就可以接收到交换机转发过来的所有消息。

在图中,我们可以看到一个 fanout 交换机连接着三个队列。无论消息的 routing_key 是什么,只要消息被发送到了这个交换机,它就会被转发到所有的队列中去。这就像在一个局域网内进行广播一样,每台主机都会接收到一份复制的消息。

由于 fanout 交换机不需要执行任何复杂的路由逻辑,因此它是所有交换机类型中最快速的。如果你的应用场景只需要将消息广播给多个消费者,那么使用 fanout 交换机将会是一个很好的选择。

3,topic

在这里插入图片描述
这张图片展示的是一个主题交换机(Topic Exchange),它是RabbitMQ中一种常用的交换机类型。主题交换机通过模式匹配来决定将消息路由到哪个队列。

在图片中,我们能看到四个队列(Queues)分别绑定了不同的模式(Binding Key)。这些模式都是由单词组成的,单词之间用点号"."分隔。同时,主题交换机也支持两种通配符:

  • #:匹配零个或多个单词;
  • *:匹配一个单词。

例如,队列1绑定了"usa.#“,这意味着它将接收所有以"usa.“开头的消息;队列2绑定了”.news”,表示它将接收所有包含"news"作为最后一个单词的消息;队列3绑定了"#.weather",意味着它将接收所有以".weather"结尾的消息;队列4绑定了"europe.#",因此它将接收所有以"europe."开头的消息。

接下来,我们看几个例子:

  1. 当一条消息的路由键(Routing Key)为"usa.news"时:

    • 队列1(绑定键为"usa.#")可以接受,因为"usa.news"满足以"usa."开头;
    • 队列2(绑定键为".news")也可以接受,因为它包含了"news"作为最后一个单词;
    • 队列3(绑定键为"#.weather")不能接受,因为"usa.news"没有以".weather"结尾;
    • 队列4(绑定键为"europe.#")也不能接受,因为"usa.news"并没有以"europe."开头。
  2. 当一条消息的路由键(Routing Key)为"europe.weather"时:

    • 队列1(绑定键为"usa.#")不能接受,因为"europe.weather"并不以"usa."开头;
    • 队列2(绑定键为".news")可以接受,因为它包含了"weather"作为最后一个单词;
    • 队列3(绑定键为"#.weather")也能接受,因为"europe.weather"是以".weather"结尾的;
    • 队列4(绑定键为"europe.#")可以接受,因为"europe.weather"以"europe."开头。

总的来说,主题交换机允许你定义一系列的过滤规则,使得消息能够更灵活地被路由到合适的队列。这对于处理具有相似性的不同消息非常有用,比如上述例子中的美国新闻和欧洲天气预报。

三,实操

1,创建一个exchange

在管理界面上,创建我们的第一个exchange

在这里插入图片描述

2,创建一个queue

在这里插入图片描述

3,将queue绑定到exchange

在这里插入图片描述
把创建的queue绑定到exchange。

在这里插入图片描述
结果是:

在这里插入图片描述

这篇关于谷粒商城实战笔记-251-商城业务-消息队列-Exchange类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102234

相关文章

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置