谷粒商城实战笔记-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实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

Django调用外部Python程序的完整项目实战

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通... 目录一、为什么 Django 需要调用外部 python 程序二、三种常见的调用方式方式 1:直接 im

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

C# WebAPI的几种返回类型方式

《C#WebAPI的几种返回类型方式》本文主要介绍了C#WebAPI的几种返回类型方式,包括直接返回指定类型、返回IActionResult实例和返回ActionResult,文中通过示例代码介绍的... 目录创建 Controller 和 Model 类在 Action 中返回 指定类型在 Action

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.