谷粒商城实战笔记-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

相关文章

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下