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 处理需要根据多种条件(如日志级别和模块)进行灵活路由的复杂业务。
相关文章
|
2月前
|
存储 缓存 Java
我们来说一说 JVM 的内存模型
我是小假 期待与你的下一次相遇 ~
262 5
|
数据可视化 Java Nacos
OpenFeign + Sentinel 实现微服务熔断限流实战
本文介绍如何在Spring Cloud微服务架构中,结合OpenFeign与阿里巴巴开源组件Sentinel,实现服务调用的熔断、降级与限流。通过实战步骤搭建user-service与order-service,集成Nacos注册中心与Sentinel Dashboard,演示服务异常熔断、QPS限流控制,并支持自定义限流响应。借助Fallback降级机制与可视化规则配置,提升系统稳定性与高可用性,助力构建健壮的分布式应用。
459 155
|
2月前
|
Web App开发 缓存 监控
内存溢出与内存泄漏:解析与解决方案
本文深入解析内存溢出与内存泄漏的区别及成因,结合Java代码示例展示典型问题场景,剖析静态集合滥用、资源未释放等常见原因,并提供使用分析工具、优化内存配置、分批处理数据等实用解决方案,助力提升程序稳定性与性能。
720 1
|
5月前
|
监控 算法 API
Sentinel源码—1.使用演示和简介
本文主要介绍了Sentinel流量治理框架、Sentinel源码编译及Demo演示、Dashboard功能、流控规则使用演示、熔断规则使用演示、热点规则使用演示、授权规则使用演示、系统规则使用演示、集群流控使用演示
|
1月前
|
人工智能 安全 开发工具
专为开发者量身打造!!!摆脱 GitHub、GitLab、Hugging Face等平台龟速下载?
Xget 是一款专为开发者打造的高性能资源加速工具,支持 GitHub、GitLab、Hugging Face 等多平台下载加速,通过简单 URL 转换实现秒级下载。具备并行分片、智能路由、企业级安全防护,兼容 Git 协议与主流包管理器,无需复杂配置,助力 CI/CD、AI 模型训练等场景高效稳定获取海外资源。
319 0
|
6月前
|
Prometheus 监控 Cloud Native
Spring Boot 可视化监控
本文介绍了如何通过Spring Actuator、Micrometer、Prometheus和Grafana为Spring Boot应用程序添加监控功能。首先创建了一个Spring Boot应用,并配置了Spring Actuator以暴露健康状态和指标接口。接着,利用Micrometer收集应用性能数据,并通过Prometheus抓取这些数据进行存储。最后,使用Grafana将Prometheus中的数据可视化,展示在精美的仪表板上。整个过程简单易行,为Spring Boot应用提供了基本的监控能力,同时也为后续扩展更详细的监控指标奠定了基础。
1128 2
|
6月前
|
安全 Java 数据库
Spring Boot 框架深入学习示例教程详解
本教程深入讲解Spring Boot框架,先介绍其基础概念与优势,如自动配置、独立运行等。通过搭建项目、配置数据库等步骤展示技术方案,并结合RESTful API开发实例帮助学习。内容涵盖环境搭建、核心组件应用(Spring MVC、Spring Data JPA、Spring Security)及示例项目——在线书店系统,助你掌握Spring Boot开发全流程。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
1035 2
|
11月前
|
机器学习/深度学习 算法 数据可视化
利用SVM(支持向量机)分类算法对鸢尾花数据集进行分类
本文介绍了如何使用支持向量机(SVM)算法对鸢尾花数据集进行分类。作者通过Python的sklearn库加载数据,并利用pandas、matplotlib等工具进行数据分析和可视化。
1013 70
|
11月前
|
移动开发 前端开发 数据可视化
React 拖拽布局组件 Drag & Drop Layout
本文介绍了如何在React中构建拖拽布局组件,涵盖基础知识、常见问题及解决方案。首先解释了拖拽操作的三个阶段:开始、过程中和结束。接着推荐了几个常用的拖拽库,如`react-beautiful-dnd`,并详细展示了如何使用该库创建基础拖拽组件,包括安装依赖、初始化容器和处理拖拽结束事件。文章还探讨了常见问题,如拖拽不生效、性能优化、嵌套拖拽和跨浏览器兼容性,并提供了进阶技巧,如自定义样式、多列布局和集成其他UI组件。通过这些内容,读者可以掌握构建高效拖拽布局的方法。
800 16
|
存储 缓存 监控
【JVM调优】如何进行JVM调优?一篇文章就够了!
深入解读JVM性能的监控、定位和调优方案,阐述jps/stat/jstack、MAT等常用性能分析工具的使用,提出JVM参数、内存溢出、内存泄漏、CPU飙升、GC频繁等实际场景下JVM调优的方案。
4197 16
【JVM调优】如何进行JVM调优?一篇文章就够了!