当前位置: 首页 > news >正文

说下RabbitMQ的整体架构

RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol) 协议的开源消息中间件,RabbitMQ的整体架构围绕消息的生产、路由、存储和消费设计,旨在实现高效、可靠的消息传递,它由多个核心组件协同工作。

核心组件

1. 生产者(Producer)

  • 负责创建并向RabbitMQ服务器发送消息。消息可以包含任意数据(如 JSON、文本、二进制等。生产者不直接将消息发送到队列,而是通过交换机进行消息的路由。

2. 交换机(Exchange)

  • 接收生产者发送的消息,并根据路由规则将消息转发到一个或多个队列。交换机不存储消息,如果没有匹配的队列,消息可能会被丢弃(取决于具体配置)。交换机的类型决定路由行为
  • 类型
    • Direct Exchange精确匹配,根据消息的路由键(routing key)进行匹配。如果路由键与绑定队列时指定的键完全匹配,消息就会被发送到该队列。比如在一个物流系统中,根据订单的配送地区作为路由键,将订单消息发送到对应地区的处理队列。
    • Topic Exchange:支持通配符匹配的路由规则。使用 * 匹配一个单词,# 匹配零个或多个单词。比如在日志监控系统中,以系统名称(如 order.*user.#)作为路由规则,将不同的日志消息发送到相应的队列。
    • Fanout Exchange:将接收到的消息广播到所有与它绑定的队列,不考虑路由键。适用于广播消息的场景,如系统通知,所有订阅通知的队列都会收到消息。
    • Headers Exchange:根据消息的headers属性进行匹配,而不是路由键。这种类型相对较少使用。

3. 队列(Queue)

  • 存储消息的地方,消费者从队列中获取消息进行处理。队列是RabbitMQ中消息存储的基本单元,多个消费者可以从同一个队列中竞争获取消息。队列需与交换机通过 Binding Key 绑定,才能接收消息。
  • 队列可以设置持久化(服务器重启后队列依然存在)、排他性(仅创建它的连接可见且使用,连接关闭队列自动删除)、自动删除(当所有消费者断开连接后,队列自动删除)等属性。

4. 消费者(Consumer)

  • 从RabbitMQ服务器的队列中获取消息并进行处理。消费者可以订阅一个或多个队列,当队列中有新消息时,消费者会收到并处理。
  • 可以进行手动确认(ACK)或拒绝(NACK)消息,确保可靠性。

5. 消息代理(Broker)

  • 即RabbitMQ服务器本身,它负责接收生产者发送的消息根据交换机和绑定规则进行消息路由,并为消费者提供消息。Broker管理着交换机、队列、绑定等各种资源,并保证消息的可靠传递。
    • 集群模式:为了提高可靠性和性能,RabbitMQ可以组成集群。集群中的节点可以共享队列、交换机等资源,当某个节点出现故障时,其他节点可以继续提供服务。
    • 镜像队列:是一种特殊的队列集群方式,队列会在多个节点上进行镜像备份,确保即使某个节点故障,消息仍然可用。

辅助组件

1. 绑定(Binding)

  • 建立交换机和队列之间的关联关系。通过绑定,交换机知道应该将哪些消息发送到哪个队列。绑定可以指定一个路由键(在Direct和Topic交换机中),用于更精确的消息路由。

2. 连接与信道(Connection & Channel)

  • Connection:生产者/消费者与 Broker 之间的 TCP 连接。
  • Channel:复用连接中的逻辑通道,避免频繁创建 TCP 连接的开销。

3. 虚拟主机(Virtual Host)

  • Virtual Host 是 RabbitMQ 中的一个逻辑概念,类似于数据库中的“数据库实例”。每个虚拟主机都有自己独立的交换机、队列、绑定等资源,它们之间相互隔离。虚拟主机为多租户环境提供了支持,不同的应用或用户可以在各自的虚拟主机中进行消息传递,互不干扰。
  • 比如云服务提供商,可以为每个租户分配一个独立的虚拟主机,每个租户在自己的虚拟主机内管理自己的消息队列系统,不用担心与其他租户的资源冲突。
    在这里插入图片描述

架构特点

  1. 解耦生产与消费
    • 生产者无需知道消费者的存在,通过交换机和队列实现松耦合。
  2. 灵活的路由机制
    • 通过交换机类型和绑定规则支持多种消息分发模式(点对点、发布订阅等)。
  3. 可靠性保证
    • 支持消息持久化、手动确认(ACK)、死信队列(Dead Letter Queue)等机制。
  4. 扩展性
    • 支持集群部署、镜像队列(高可用)、负载均衡。

相关文章:

  • STM32教程:串口USART通讯协议原理及分析(基于STM32F103C8T6最小系统板标准库开发)*详细教程*
  • 爬虫技术-利用Python和Selenium批量下载动态渲染网页中的标准文本文件
  • CentOS配置了镜像源之后依旧下载元数据失败
  • 【MCP Node.js SDK 全栈进阶指南】专家篇(2):MCP多模型支持架构
  • CSS--图片链接垂直居中展示的方法
  • 用html+js+css实现的战略小游戏
  • tinyrenderer笔记(透视矫正)
  • 如何搭建spark yarn模式集群的集群
  • 树上背包学习笔记
  • 【mysql】常用命令
  • vue源代码采用的设计模式分解
  • accept() reject() hide()
  • Select Rows组件研究
  • 使用Java和LangChain4j实现人工智能:从分类到生成式AI
  • stm32之输出比较OC和输入捕获IC
  • SQLite数据类型
  • Class AB OPA corner 仿真,有些corenr相位从0开始
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第十一讲)
  • 人工智能100问☞第15问:人工智能的常见分类方式有哪些?
  • 2025年软件工程与数据挖掘国际会议(SEDM 2025)
  • 中国电信财务部总经理周响华调任华润集团总会计师
  • 金融监管总局:支持银行有序设立科技金融专门机构,推动研发机器人、低空飞行器等新兴领域的保险产品
  • 一揽子十条货币政策措施出炉:降准降息,设立五千亿服务消费与养老再贷款
  • 五月A股怎么买?券商金股电子权重第一,格力电器最热
  • 巴基斯坦宣布关闭全国空域48小时
  • 五一假期,长三角铁路张家港、台州等多个车站客发量创新高