RabbitMQ 核心概念与消息模型深度解析(一)

news2025/5/15 22:50:33

一、RabbitMQ 是什么

{"type":"load_by_key","key":"auto_image_0_0","image_type":"search"}

在当今分布式系统盛行的时代,消息队列作为一种至关重要的中间件技术,扮演着实现系统之间异步通信、解耦和削峰填谷等关键角色 。RabbitMQ 便是消息队列领域中的佼佼者,是一个开源的消息代理和队列服务器,基于高级消息队列协议(AMQP)实现,支持多种消息模式,如点对点、发布 / 订阅等,为分布式系统提供了高效、可靠的消息传递服务。

在分布式系统中,不同的服务或组件之间常常需要进行通信和数据交换。如果采用传统的同步通信方式,如直接调用,会导致服务之间的耦合度极高,一个服务的变更可能会对其他服务产生连锁反应,并且在高并发情况下,系统的性能和响应速度会受到严重影响。而 RabbitMQ 的出现,很好地解决了这些问题。它就像是一个可靠的信使,在各个服务之间传递消息,使得服务之间可以异步地进行通信,降低了耦合度,提高了系统的可扩展性和可维护性。

二、核心概念大揭秘

在深入了解 RabbitMQ 的消息模型之前,我们先来认识一下它的核心概念。这些概念是理解 RabbitMQ 工作原理的基石,它们相互协作,共同构建了一个高效、可靠的消息传递系统。

2.1 生产者与消费者

生产者(Producer)是消息的发送方,它创建消息并将其发送到 RabbitMQ 服务器 。生产者并不关心消息如何被路由和处理,它只负责将消息发送到指定的交换机。在一个电商系统中,当用户下单后,订单信息就可以作为一条消息由生产者发送到 RabbitMQ 中。

消费者(Consumer)是消息的接收方,它从队列中获取消息并进行处理 。一个消费者可以订阅一个或多个队列,当队列中有新消息时,消费者会收到通知并进行消费。在上述电商系统中,订单处理服务就可以作为消费者从队列中获取订单消息并进行后续的处理,如库存检查、订单发货等。

2.2 交换机(Exchange)

交换机是 RabbitMQ 的核心组件之一,它接收生产者发送的消息,并根据路由规则将消息路由到一个或多个队列中 。如果路由不到匹配的队列,消息可能会被返回给生产者或直接丢弃。交换机的类型决定了它的路由规则,RabbitMQ 提供了以下几种常见的交换机类型:

2.2.1 交换机类型
  • Direct Exchange(直连交换机):直连交换机根据消息的路由键(Routing Key)进行精确匹配,将消息路由到绑定键(Binding Key)与路由键完全一致的队列中 。它就像一个精准的快递员,只把包裹送到指定地址的收件人手中。假设我们有一个订单处理系统,生产者发送订单消息时,根据订单 ID 作为路由键,直连交换机就可以将消息准确地路由到处理该订单 ID 的队列中。它适用于需要将消息精确地发送到特定队列的场景,比如根据用户 ID 将订单消息发送到不同的队列,由特定的消费者处理。
  • Fanout Exchange(扇出交换机):扇出交换机无视消息的路由键,将接收到的所有消息广播到所有与之绑定的队列中 。它就像一个广播电台,将消息发送给所有收听的人。在一个实时通知系统中,当有新的通知消息时,生产者将消息发送到扇出交换机,所有与该交换机绑定的队列都能收到通知消息,然后由各个队列的消费者进行处理。它适用于需要将消息广播给所有消费者的场景,比如群发邮件、广播通知、实时数据同步等。
  • Topic Exchange(主题交换机):主题交换机使用通配符进行路由键匹配,支持两种通配符:* 匹配一个单词,# 匹配零个或多个单词 。它比直连交换机更灵活,可以根据消息的主题进行模糊匹配路由。例如,在一个新闻发布系统中,生产者发送新闻消息时,路由键可以是 “news.sports.basketball”,表示体育类篮球新闻。如果有一个队列通过绑定键 “news.sports.*” 绑定到主题交换机,那么该队列就能收到所有体育类新闻消息;如果另一个队列通过绑定键 “news.#” 绑定,那么它能收到所有新闻消息。它适用于需要根据消息主题进行灵活路由的场景,比如根据不同的商品类别将商品信息发送到不同的队列,根据不同的地理区域将新闻信息发送到不同的队列。
  • Headers Exchange(头交换机):头交换机根据消息的头部信息(Headers)进行匹配,而不是路由键 。它可以实现比主题交换机更复杂的路由规则,但性能相对较低,使用较少。假设我们有一个消息系统,消息的头部包含 “priority”(优先级)和 “type”(类型)等属性。生产者发送消息时,可以设置这些头部属性。头交换机在绑定队列时,也可以设置相应的匹配规则,比如只有当消息的 “priority” 为 “high” 且 “type” 为 “important” 时,才将消息路由到该队列。它适用于需要根据消息的多个属性进行路由的场景,比如根据消息的发送者、优先级、类型等属性进行路由。
2.2.2 交换机工作流程

当生产者将消息发送到交换机时,交换机会根据自身的类型和绑定规则来处理消息 。以 Direct Exchange 为例,生产者发送消息时会指定一个路由键,交换机接收到消息后,会查找所有与该交换机绑定且绑定键与路由键完全匹配的队列,然后将消息发送到这些队列中。如果没有找到匹配的队列,消息可能会根据生产者的配置被丢弃或返回给生产者。

2.3 队列(Queue)

队列是 RabbitMQ 中用于存储消息的组件 。它就像一个仓库,生产者发送的消息会被存储在队列中,等待消费者来获取和处理。队列具有以下特点:

  • 消息存储:队列按照先进先出(FIFO)的原则存储消息,即先进入队列的消息会先被消费 。这保证了消息处理的顺序性。
  • 多消费者订阅:多个消费者可以订阅同一个队列,此时队列中的消息会被平均分摊给多个消费者进行处理 ,而不是每个消费者都收到所有的消息并处理。这样可以提高消息处理的效率,实现负载均衡。

2.4 绑定(Binding)

绑定是在交换机和队列之间建立联系的规则 。通过绑定,我们可以告诉 RabbitMQ 交换机如何将消息路由到队列中。在绑定的时候,一般会指定一个绑定键(Binding Key),这个绑定键与交换机的类型以及生产者发送消息时指定的路由键一起决定了消息的路由规则 。对于 Direct Exchange,绑定键和路由键需要完全匹配,消息才能被路由到对应的队列;对于 Topic Exchange,绑定键可以使用通配符与路由键进行模糊匹配。

2.5 路由键(Routing Key)

路由键是生产者在发送消息时指定的一个标识符 ,它在消息路由中起着关键作用。路由键与交换机的类型以及绑定规则协同工作,决定了消息最终会被路由到哪个队列。在 Direct Exchange 中,路由键和绑定键完全匹配才能将消息路由到队列;在 Topic Exchange 中,路由键通过通配符与绑定键进行匹配,从而实现更灵活的路由。例如,在一个日志处理系统中,生产者发送日志消息时,可以根据日志级别(如 “info”“warning”“error”)作为路由键,交换机根据绑定规则将不同级别的日志消息路由到不同的队列中,方便进行分类处理。

2.6 连接(Connection)和信道(Channel)

  • 连接(Connection):连接是客户端与 RabbitMQ 服务端建立的 TCP 连接 。通过这个连接,客户端可以与 RabbitMQ 进行通信,发送和接收消息。建立连接是使用 RabbitMQ 的第一步,就像打电话需要先拨通对方号码建立连接一样。
  • 信道(Channel):信道是建立在连接之上的虚拟连接 ,它是客户端执行 AMQP 命令的载体。一个连接可以包含多个信道,通过信道可以更高效地进行消息的发送和接收。这就好比在一条电话线路上可以同时进行多个通话,每个通话就相当于一个信道。使用信道的好处是可以在一个连接上复用资源,减少连接的开销,提高系统的性能。

2.7 虚拟主机(Virtual Host)

虚拟主机是对 Exchange 和 Queue 等资源的逻辑隔离 。它就像一个独立的空间,每个虚拟主机都有自己的交换机、队列、绑定和权限设置,不同虚拟主机之间的资源相互独立,互不干扰。虚拟主机可以用于将不同的应用或服务进行隔离,以防止彼此之间的消息冲突和资源竞争 。在一个大型的分布式系统中,可能有多个业务模块,每个业务模块可以使用一个独立的虚拟主机,这样可以保证各个业务模块之间的消息处理互不影响,同时也便于进行权限管理和资源分配。

三、消息模型全解析

RabbitMQ 提供了多种消息模型,每种模型都有其独特的特点和适用场景 。这些模型基于前面介绍的核心概念构建而成,通过不同的组合和配置,满足了各种分布式系统中的消息通信需求。

3.1 简单队列模型

简单队列模型是 RabbitMQ 中最基础的模型,它只包含一个生产者、一个队列和一个消费者 。生产者将消息直接发送到队列中,消费者从队列中获取消息并进行处理。在一个简单的日志记录系统中,生产者可以是产生日志的应用程序,它将日志消息发送到队列中,消费者则是日志处理程序,从队列中读取日志消息并进行存储或分析。

  • 模型特点:这种模型的优点是简单直观,易于理解和实现 。它不需要复杂的配置和路由规则,适用于一些简单的场景,如单机应用中的消息传递。
  • 适用场景:适用于对消息处理性能要求不高,且业务逻辑简单的场景 。比如,一个小型的订单处理系统,订单的生成和处理逻辑都比较简单,就可以使用简单队列模型。
  • 局限性:它的扩展性较差,不适合高并发和复杂的业务场景 。当系统的负载增加时,单个消费者可能无法及时处理所有的消息,导致消息积压。而且,它只能实现一对一的消息传递,无法满足一对多或多对多的通信需求。

3.2 工作队列模型

工作队列模型也称为任务队列模型,它有一个生产者和多个消费者,多个消费者可以同时消费队列中的消息 。生产者将任务消息发送到队列中,多个消费者竞争从队列中获取消息并处理。在一个电商订单处理系统中,订单消息可以发送到工作队列中,多个订单处理服务实例作为消费者从队列中获取订单消息并进行处理,如库存检查、订单发货等操作。

  • 工作机制:RabbitMQ 默认采用轮询(Round-Robin)的方式将消息分发给消费者 。即每个消费者依次从队列中获取一条消息进行处理。这种方式可以保证消息在多个消费者之间平均分配,实现简单的负载均衡。
  • 公平分发:为了提高消息处理的效率,RabbitMQ 还支持公平分发(Fair Dispatch)机制 。通过设置basicQos方法,消费者可以告诉 RabbitMQ 在处理完当前消息之前,不要再向其发送新的消息,直到消费者发送确认消息(basicAck)。这样可以避免处理速度慢的消费者堆积过多消息,而处理速度快的消费者却空闲的情况,从而提高整个系统的消息处理效率。

3.3 发布 / 订阅模型

发布 / 订阅模型中,生产者将消息发送到 Fanout 交换机,Fanout 交换机将消息广播到所有与之绑定的队列,每个队列的消费者都能收到相同的消息 。在一个实时通知系统中,当有新的通知消息产生时,生产者将消息发送到 Fanout 交换机,所有与该交换机绑定的队列(如短信通知队列、邮件通知队列、APP 推送通知队列等)都能收到通知消息,然后由各个队列的消费者进行相应的通知发送操作。

  • 工作过程
    • 生产者创建消息并发送到 Fanout 交换机 ,发送消息时不需要指定路由键。
    • Fanout 交换机接收到消息后,不考虑消息的路由键,直接将消息广播到所有与它绑定的队列中 。
    • 每个绑定到该交换机的队列都会收到消息的副本,队列的消费者从各自的队列中获取消息并处理 。
  • 应用场景:适用于需要将消息广播给多个消费者的场景 ,如实时数据同步、广播通知、消息推送等。在一个微服务架构的系统中,当某个服务发生状态变化时,需要通知其他多个服务进行相应的处理,就可以使用发布 / 订阅模型。

3.4 路由模型

路由模型中,生产者发送消息时需要指定 Routing Key,Direct 交换机根据 Routing Key 将消息路由到绑定键(Binding Key)与之完全匹配的队列中 。在一个订单处理系统中,生产者可以根据订单的类型(如普通订单、加急订单)作为 Routing Key 发送消息,Direct 交换机根据不同的 Routing Key 将订单消息路由到不同的队列,由不同的消费者进行处理。

  • 模型原理:生产者在发送消息时,将 Routing Key 与消息一起发送到 Direct 交换机 。交换机在绑定队列时,会记录每个队列的 Binding Key。当交换机接收到消息后,会根据消息的 Routing Key 查找与之匹配的 Binding Key,如果找到匹配的队列,则将消息路由到该队列;如果没有找到匹配的队列,消息可能会被丢弃或根据配置返回给生产者。
  • 适用场景:适用于需要将消息精确路由到特定队列的场景 ,比如根据不同的业务类型、用户 ID、订单 ID 等将消息发送到不同的队列进行处理。在一个用户管理系统中,根据用户的操作类型(如注册、登录、修改密码等)作为 Routing Key,将消息路由到不同的队列进行处理。

3.5 主题模型

主题模型使用 Topic 交换机,它通过通配符匹配 Routing Key 和 Binding Key 进行消息路由 。通配符有两种:* 匹配一个单词,# 匹配零个或多个单词 。在一个电商商品管理系统中,生产者可以根据商品的类别和操作类型作为 Routing Key,如 “electronics.add” 表示添加电子产品,“clothes.update” 表示更新服装类商品。消费者可以通过绑定不同的 Binding Key 来订阅感兴趣的消息,如 “electronics.*” 可以接收所有电子产品相关的消息,“#.update” 可以接收所有更新操作的消息。

  • 通配符匹配规则
    • * :匹配一个单词,例如 “news.sports.*” 可以匹配 “news.sports.basketball”“news.sports.football” 等消息,但不能匹配 “news.sports.basketball.match”。
    • # :匹配零个或多个单词,例如 “news.#” 可以匹配 “news.sports.basketball”“news.politics”“news.entertainment.movie” 等所有以 “news” 开头的消息。
  • 复杂场景应用:主题模型非常灵活,适用于需要根据消息主题进行灵活路由的复杂场景 。在一个大型的分布式系统中,可能有多个业务模块,每个业务模块又有多个子模块,通过主题模型可以方便地实现不同模块之间的消息通信和管理。比如,根据不同的地理区域、时间范围、用户群体等条件对消息进行路由和处理。

3.6 RPC 模型

RPC(Remote Procedure Call)模型中,客户端与服务器通过消息队列进行远程过程调用 。客户端发送请求消息到队列,服务器从队列中获取请求消息并处理,然后将处理结果通过另一个队列返回给客户端 。在一个分布式系统中,客户端可能需要调用远程服务器上的某个服务来获取数据或执行某个操作,就可以使用 RPC 模型。比如,客户端需要获取用户的详细信息,而用户信息存储在远程的数据库服务器上,客户端可以通过 RPC 模型向服务器发送请求,服务器查询数据库后将用户信息返回给客户端。

  • 调用机制
    • 客户端发送请求消息时,会在消息属性中设置两个重要的属性:replyTo ,指定一个用于接收服务器响应的队列;correlationId ,用于标识本次请求的唯一 ID 。
    • 服务器从请求队列中获取请求消息,处理完成后,将结果消息发送到replyTo指定的队列,并在消息属性中设置correlationId与请求消息的correlationId一致 。
    • 客户端监听replyTo队列,当接收到消息时,根据correlationId匹配请求,从而获取对应的响应结果 。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读笔记——双流网络

双流网络论文 视频相比图像包含更多信息:运动信息、时序信息、背景信息等等。 原先处理视频的方法: CNN LSTM:CNN 抽取关键特征,LSTM 做时序逻辑;抽取视频中关键 K 帧输入 CNN 得到图片特征,再输入 LSTM&…

LabVIEW在电子电工教学中的应用

在电子电工教学领域,传统教学模式面临诸多挑战,如实验设备数量有限、实验过程存在安全隐患、教学内容更新滞后等。LabVIEW 作为一款功能强大的图形化编程软件,为解决这些问题提供了创新思路,在电子电工教学的多个关键环节发挥着重…

Vue3 怎么在ElMessage消息提示组件中添加自定义icon图标

1、定义icon组件代码&#xff1a; <template><svg :class"svgClass" aria-hidden"true"><use :xlink:href"iconName" :fill"color"/></svg> </template><script> export default defineComponen…

生活破破烂烂,AI 缝缝补补(附提示词)

写在前面&#xff1a;​【Fire 计算器】已上线&#xff0c;快算算财富自由要多少​ 现实不总温柔&#xff0c;愿你始终自渡。 请永远拯救自己于水火之中。 毛绒风格提示词&#xff08;供参考&#xff09;&#xff1a; 1. 逼真毛绒风 Transform this image into a hyperrealist…

张 。。 通过Token实现Loss调优prompt

词编码模型和 API LLM不匹配,采用本地模型 理性中性案例(针对中性调整比较合理) 代码解释:Qwen2模型的文本编码与生成过程 这段代码展示了如何使用Qwen2模型进行文本的编码和解码操作。 模型加载与初始化 from transformers import AutoModelForCausalLM, AutoTokenizer

JVM学习专题(一)类加载器与双亲委派

目录 1、JVM加载运行全过程梳理 2、JVM Hotspot底层 3、war包、jar包如何加载 4、类加载器 我们来查看一下getLauncher&#xff1a; 1.我们先查看getExtClassLoader() 2、再来看看getAppClassLoader(extcl) 5、双亲委派机制 1.职责明确&#xff0c;路径隔离​&#xff…

PyTorch API 9 - masked, nested, 稀疏, 存储

文章目录 torch.randomtorch.masked简介动机什么是 MaskedTensor&#xff1f; 支持的运算符一元运算符二元运算符归约操作查看与选择函数 torch.nested简介构造方法数据布局与形状支持的操作查看嵌套张量的组成元素填充张量的相互转换形状操作注意力机制 与 torch.compile 的配…

进程相关面试题20道

一、基础概念与原理 1.进程的定义及其与程序的本质区别是什么&#xff1f; 答案&#xff1a;进程是操作系统分配资源的基本单位&#xff0c;是程序在数据集合上的一次动态执行过程。核心区别&#xff1a;​ 动态性&#xff1a;程序是静态文件&#xff0c;进程是动态执行实例…

Linux复习笔记(五) 网络服务配置(dhcp)

二、网络服务配置 2.5 dhcp服务配置&#xff08;不涉及实际操作&#xff09; 要求&#xff1a;知道原理和常见的参数配置就行 2.5.1 概述DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; DHCP&#xff08;Dynamic Host Conf…

windows版redis的使用

redis下载 Releases microsoftarchive/redishttps://github.com/microsoftarchive/redis/releases redis的启动和停止 进入路径的cmd 启动&#xff1a;redis-server.exe redis.windows.conf 停止&#xff1a;ctrlc 连接redis 指定要连接的IP和端口号 -h IP地址 -p 端口…

Java版OA管理系统源码 手机版OA系统源码

Java版OA管理系统源码 手机版OA系统源码 一&#xff1a;OA系统的主要优势 1. 提升效率 减少纸质流程和重复性工作&#xff0c;自动化处理常规事务&#xff0c;缩短响应时间。 2. 降低成本 节省纸张、打印、通讯及人力成本&#xff0c;优化资源分配。 3. 规范管理 固化企…

NineData 社区版 V4.1.0 正式发布,新增 4 条迁移链路,本地化数据管理能力再升级

NineData 社区版 V4.1.0 正式更新发布。本次通过新增 4 条迁移链路扩展、国产数据库深度适配、敏感数据保护增强‌等升级&#xff0c;进一步巩固了其作为高效、安全、易用的数据管理工具的定位。无论是开发测试、数据迁移&#xff0c;还是多环境的数据管理&#xff0c;NineData…

进阶2_1:QT5多线程与定时器共生死

1、在widget.ui中使用 LCD Number控件 注意&#xff1a;若 LCD 控件不是多线程&#xff0c;LCD控件则会瞬间自增到最大的数值&#xff0c;如上图&#xff0c;说明两者都是多线程处理 2、实现方式 1、创建 LCD 控件并修改为 LCD1 2、创建任务类 mytask. h&#xff0c;对任务类…

在虚拟机Ubuntu18.04中安装NS2教程及应用

NS2简介 一、主要组成部分&#xff1a; 1.NS2&#xff1a;模拟器本身&#xff0c;负责执行TCL脚本进行模拟&#xff0c;并生成trace文件输出结果。 2.NAM&#xff1a;网络动画模拟器&#xff0c;用于将模拟结果可视化。 二、使用的语言&#xff1a; 1.C&#xff1a;NS2中最重要…

VBA —— 第6章子程序与函数

子程序&#xff1a;实现特定功能的程序代码块 子程序语法&#xff1a; [修饰符] Sub 子程序名称([参数1&#xff0c;参数2&#xff0c;参数3]) 代码块 End Sub 子程序如何调用&#xff1a; 1 . 子程序名 [参数1&#xff0c;参数2&#xff0c;...] 2. Call 子程序名 [(参…

全新开发-iVX图形化编程VS完整IDE

本文针对传统软件开发的效率与可控性矛盾&#xff0c;系统阐释 iVX"图形化编程 全栈 IDE" 的复合架构如何突破行业瓶颈。通过 "可视化建模 - 标准代码生成 - 独立运行" 的技术闭环&#xff0c;iVX 实现开发效率提升 60% 与源码完全可控的双重目标。研究揭…

【Linux系列】跨平台安装与配置 Vim 文本编辑器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

十天学会嵌入式技术之51单片机—day-10

第 20 章 18B20 温度检测 20.1 18B20 概述 20.1.1 简介 18B20 是一种常用的数字温度传感器&#xff0c;广泛应用于环境监测、工业控制、家居自动化 和设备温度监控等领域。 20.1.2 引脚功能 18B20 引脚功能如下图所示&#xff0c;需要特别强调的是&#xff0c;18B20 采用 1-…

【C++】17. 多态

上一章节中我们讲了C三大特性的继承&#xff0c;这一章节我们接着来讲另一个特性——多态 1. 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)&#xff0c;这里我们重点讲运行时多态…

家用或办公 Windows 电脑玩人工智能开源项目配备核显的必要性(含 NPU 及显卡类型补充)

一、GPU 与显卡的概念澄清 首先需要明确一个容易误解的概念&#xff1a;GPU 不等同于显卡。 显卡和GPU是两个不同的概念。 【概念区分】 在讨论图形计算领域时&#xff0c;需首先澄清一个常见误区&#xff1a;GPU&#xff08;图形处理单元&#xff09;与显卡&#xff08;视…