RabbitMQ 里面的交换机是什么,你用过哪种?

简介: 我是小假 期待与你得下一次相遇 ~

交换机是什么?

在 RabbitMQ 中,交换机 是消息路由机制的核心。你可以把它想象成一个邮局分拣员

  • 生产者 发送消息时,它不是直接把消息放到队列里,而是发送到 交换机
  • 然后,交换机根据一个特定的规则(这个规则叫做 “绑定”“路由键”)来决定把消息投递到哪些队列中。
  • 绑定 是连接交换机和队列的桥梁,你可以为这个桥梁设定一个路由键。

简单流程:

生产者 -> 交换机 -> (根据绑定规则) -> 一个或多个队列 -> 消费者

如果没有交换机,生产者需要直接知道所有队列的存在,这在复杂的、需要灵活路由的系统里是几乎不可行的。交换机解耦了生产者和队列,使得消息的路由策略变得非常灵活和强大。

我用过的交换机类型(及详细介绍)

RabbitMQ 主要提供了四种类型的交换机,每种都有不同的路由行为。最常用的是前三种

① 直连交换机

  • 类型direct
  • 行为:一个消息的路由键如果 完全匹配 某个队列的绑定键,那么这条消息就会被路由到该队列。
  • 类比:就像公司里的邮件系统,你写对了工号(路由键),邮件就会被准确地投递到那个人的邮箱(队列)。
  • 使用场景
  • 有明确一对一或一对多任务分发的场景。例如,将错误日志(routing_key: 'error')只发送给记录错误的队列,将订单消息(routing_key: 'order.paid')只发送给处理已支付订单的队列。
  • 我的使用经验:这是最常用、最简单的交换机类型。我们在处理不同优先级的任务时经常使用,比如 task.hightask.low 分别绑定到不同的队列,由不同性能的消费者来处理。

② 扇出交换机

  • 类型fanout
  • 行为:它会把发送到该交换机的所有消息 广播 到所有与它绑定的队列中。它完全忽略路由键
  • 类比:就像公司里的群发邮件或公告板,一条消息发出,所有订阅了的人都收到一份。
  • 使用场景
  • 发布/订阅模式。例如,用户成功注册后,需要同时执行多个操作:发送欢迎邮件、初始化用户画像、发放新手优惠券。你可以让这三个任务对应的队列都绑定到同一个 fanout 交换机上,这样一条“用户注册成功”的消息会被这三个队列同时接收并处理。
  • 我的使用经验:在需要做事件驱动架构,一个事件触发多个下游服务的场景下非常好用。我们用它来同步不同服务间的缓存数据失效通知。

③ 主题交换机

  • 类型topic
  • 行为:功能最强大的交换机。它使用路由键和一种模式进行匹配。绑定键(Binding Key)可以包含两种特殊的通配符:
  • * (星号):匹配一个单词。
  • # (井号):匹配零个或多个单词。
  • 单词之间用点号 . 分隔,例如 usa.newseurope.weather.serious
  • 类比:就像新闻订阅系统,你可以订阅“所有美国地区的新闻”(usa.#),或者“所有地区的严重天气”(*.weather.serious)。
  • 使用场景
  • 根据消息的多个属性进行灵活路由。例如,一个日志处理系统,你可以根据日志的严重程度(info, error)和来源(auth, order, payment)来路由。绑定键 *.error 会接收所有服务的错误日志,而 order.* 会接收订单服务的所有日志。
  • 我的使用经验:在构建复杂的消息路由规则时,topic 交换机是首选。我们用它来构建日志收集和业务通知系统,可以根据不同的标签组合将消息精准地投递给感兴趣的消费者。

④ 头交换机

  • 类型headers
  • 行为:它不依赖于路由键的匹配规则,而是根据消息的 headers 属性 来路由。在绑定时,你需要指定一组键值对。当发送来的消息的 headers 属性与绑定时指定的键值对完全匹配时,消息就会被路由到该队列。
  • 使用场景
  • 用于需要基于多个消息属性(而不仅仅是一个路由键)进行路由的复杂场景。但因为性能比 topic 交换机差,且使用起来更复杂,所以在实际开发中非常少见
  • 我的使用经验:我个人在实际项目中几乎没有使用过头交换机,topic 交换机已经能满足绝大多数复杂路由的需求,而且更直观高效。

总结与对比

交换机类型 路由行为 使用场景
直连 (direct) 精确匹配 routing_key 任务分发、RPC
扇出 (fanout) 广播给所有绑定队列 发布/订阅、事件广播
主题 (topic) 通配符匹配 routing_key 灵活的多维消息路由
头 (headers) 匹配 headers 属性 复杂属性匹配(不常用)

回答“你用过哪种?”:

在实际工作中,我最常用的是 直连交换机扇出交换机主题交换机

  • direct 处理简单的任务分发。
  • fanout 处理需要广播消息的发布/订阅场景。
  • topic 处理需要根据多种条件(如日志级别和模块)进行灵活路由的复杂业务。
相关文章
|
7月前
|
存储 缓存 Java
我们来说一说 JVM 的内存模型
我是小假 期待与你的下一次相遇 ~
512 5
|
存储 算法 数据处理
【软件设计师备考 专题 】虚拟存储器基本工作原理,多级存储体系的性能价格
【软件设计师备考 专题 】虚拟存储器基本工作原理,多级存储体系的性能价格
724 0
|
SQL Java 数据库
Seata分布式事务源码分析
Seata分布式事务源码分析
467 0
|
11月前
|
Prometheus 监控 Cloud Native
Spring Boot 可视化监控
本文介绍了如何通过Spring Actuator、Micrometer、Prometheus和Grafana为Spring Boot应用程序添加监控功能。首先创建了一个Spring Boot应用,并配置了Spring Actuator以暴露健康状态和指标接口。接着,利用Micrometer收集应用性能数据,并通过Prometheus抓取这些数据进行存储。最后,使用Grafana将Prometheus中的数据可视化,展示在精美的仪表板上。整个过程简单易行,为Spring Boot应用提供了基本的监控能力,同时也为后续扩展更详细的监控指标奠定了基础。
1703 2
|
机器学习/深度学习 算法 数据可视化
利用SVM(支持向量机)分类算法对鸢尾花数据集进行分类
本文介绍了如何使用支持向量机(SVM)算法对鸢尾花数据集进行分类。作者通过Python的sklearn库加载数据,并利用pandas、matplotlib等工具进行数据分析和可视化。
1290 70
|
测试技术 容器
DeepSeek-R1-Distill-Qwen-1.5B基于MindIE推理实践
基于MindIE实现DeepSeek-R1-Distill-Qwen-1.5B的纯模型推理和服务化推理。
|
移动开发 前端开发 数据可视化
React 拖拽布局组件 Drag & Drop Layout
本文介绍了如何在React中构建拖拽布局组件,涵盖基础知识、常见问题及解决方案。首先解释了拖拽操作的三个阶段:开始、过程中和结束。接着推荐了几个常用的拖拽库,如`react-beautiful-dnd`,并详细展示了如何使用该库创建基础拖拽组件,包括安装依赖、初始化容器和处理拖拽结束事件。文章还探讨了常见问题,如拖拽不生效、性能优化、嵌套拖拽和跨浏览器兼容性,并提供了进阶技巧,如自定义样式、多列布局和集成其他UI组件。通过这些内容,读者可以掌握构建高效拖拽布局的方法。
1050 16
|
存储 缓存 监控
【JVM调优】如何进行JVM调优?一篇文章就够了!
深入解读JVM性能的监控、定位和调优方案,阐述jps/stat/jstack、MAT等常用性能分析工具的使用,提出JVM参数、内存溢出、内存泄漏、CPU飙升、GC频繁等实际场景下JVM调优的方案。
4480 16
【JVM调优】如何进行JVM调优?一篇文章就够了!
|
移动开发 资源调度 JavaScript
【Vue 2】一个高效的低代码表单,可视化设计,一键生成源码
Variant Form 是一款基于 Vue 2 的低代码表单生成器,提供拖拽式可视化设计界面,一键生成完整源码,支持高度自定义配置,适用于 PC、Pad 和 H5 布局。它采用现代化前端技术栈,界面美观且响应迅速,完全开源免费,适合有个性化需求的企业和开发者。通过 Variant Form,你可以大幅提高开发效率,轻松创建各种复杂表单,享受更多摸鱼时间 😎。项目支持自定义 CSS 样式、校验逻辑、国际化多语言等功能,并兼容 IE 11 浏览器,还可导出 Vue 组件及 HTML 源码。
693 0
|
Java 关系型数据库 MySQL
如何安装系统必备开发环境:JDK 1.8+、MySQL 5.7+ 与 Maven 3.0+
【7月更文挑战第1天】搭建Java开发环境:安装JDK 1.8+,MySQL 5.7+,Maven 3.0+。访问官方源下载对应软件,配置Windows或Linux/macOS的环境变量,包括`JAVA_HOME`, `PATH`, `MYSQL_ROOT_PASSWORD`及`MAVEN_HOME`。测试安装成功分别用`java/javac -version`, `mysql -u root -p`和`mvn -v`检查版本。完成后,即可开始Java项目开发。
1337 0