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

【RabbitMQ】直连交换机_扇形交换机_主题交换机

一、直连交换机(Direct Exchange)

1. 特点
  • 精确匹配:直连交换机要求消息的路由键与队列的绑定键完全匹配,才能将消息路由到该队列。
  • 简单高效:由于只需进行简单的字符串匹配,直连交换机的路由效率较高。
  • 一对一或多对一:适用于一对一或多对一的消息传递场景,即一个消息对应一个队列或多个队列通过相同的路由键接收同一消息。
2. 应用场景
  • 任务分发:在任务分发系统中,可以将不同的任务分配给不同的处理队列,每个队列对应一个或多个消费者。
  • 日志处理:根据日志的级别或类型,将日志消息路由到不同的处理队列中。
  • 订单处理:在电商系统中,根据订单号将订单消息路由到特定的处理队列,以便进行后续的订单处理流程。
3. 工作原理
  • 绑定:当队列与直连交换机绑定时,需要指定一个绑定键(Binding Key)。这个绑定键是队列与交换机之间的“纽带”,用于匹配消息的路由键。
  • 发送消息:生产者发送消息到直连交换机时,需要指定一个路由键。交换机将根据这个路由键来查找与之匹配的队列。
  • 路由消息:如果找到与路由键完全匹配的队列,交换机就会将消息路由到该队列中。如果没有找到匹配的队列,消息可能会被丢弃(取决于交换机的配置)。
4.优势限制
优势
  1. 简单直观:直连交换机的路由规则简单直观,易于理解和配置。
  2. 高效可靠:由于只需进行简单的字符串匹配,直连交换机的路由效率较高,且可靠性较好。
限制
  1. 灵活性不足:直连交换机只能根据路由键进行精确匹配,无法实现更复杂的路由逻辑。
  2. 扩展性受限:在需要实现复杂路由逻辑的场景中,可能需要结合其他类型的交换机来实现,从而增加了系统的复杂性和维护成本。
5.配置示例

在RabbitMQ中配置直连交换机通常涉及以下几个步骤:

  1. 声明交换机:使用RabbitMQ的API或管理界面声明一个直连交换机。
  2. 绑定队列:将队列与直连交换机绑定,并指定绑定键。
  3. 发送消息:生产者发送消息到直连交换机,并指定路由键。
6.注意事项
  1. 路由键的唯一性:在直连交换机中,路由键的唯一性对于确保消息正确路由到目标队列至关重要。
  2. 队列的持久性:为了确保消息在RabbitMQ重启后不会丢失,可以配置队列和消息的持久性。
  3. 负载均衡:在多个消费者同时监听同一个队列时,RabbitMQ会自动进行负载均衡,将消息均匀分配给各个消费者。

二、扇形交换机(Fanout Exchange)

1. 特点
  • 广播模式:扇形交换机将接收到的每一条消息广播到所有与之绑定的队列中,而无需考虑消息的路由键(Routing Key)。
  • 无路由键依赖:与直连交换机和主题交换机不同,扇形交换机在路由消息时不会查看消息的路由键。
  • 一对多传递:由于消息会被广播到所有绑定的队列,因此扇形交换机非常适合实现一对多的消息传递场景。
2. 应用场景
  • 实时监控系统:在需要实时更新多个消费者或系统状态的场景中,扇形交换机可以将监控数据广播给所有相关的消费者。
  • 日志收集系统:在日志收集系统中,可以将日志消息广播到多个处理队列中,以便进行不同的处理或分析。
  • 通知服务:在需要向多个用户或系统发送通知的场景中,扇形交换机可以将通知消息广播给所有相关的用户或系统。
3. 工作原理
  • 绑定:当队列与扇形交换机绑定时,不需要指定绑定键(Binding Key),因为扇形交换机会忽略路由键。
  • 发送消息:生产者发送消息到扇形交换机时,不需要指定路由键,因为扇形交换机会忽略它。
  • 广播消息:扇形交换机将接收到的每一条消息广播到所有与之绑定的队列中,无论队列的绑定键或消息的路由键是什么。
4.优势与限制
优势
  1. 高效广播:扇形交换机能够快速地将消息广播到所有绑定的队列中,实现高效的广播机制。
  2. 解耦:通过扇形交换机,生产者和消费者之间实现了完全的解耦。生产者只需要将消息发送到扇形交换机,而不需要关心具体的消费者或队列。
限制
  1. 无法根据路由键过滤:由于扇形交换机会忽略路由键,因此无法根据路由键对消息进行过滤或选择性地发送到特定的队列。
  2. 可能导致消息冗余:在需要将消息发送给特定消费者的场景中,扇形交换机可能会导致消息冗余,因为消息会被广播到所有绑定的队列中,包括那些不感兴趣的消费者。
5.配置示例

在RabbitMQ中配置扇形交换机通常涉及以下几个步骤:

  1. 声明交换机:使用RabbitMQ的API或管理界面声明一个扇形交换机。
  2. 绑定队列:将队列与扇形交换机绑定。由于扇形交换机忽略路由键,因此在绑定时不需要指定绑定键。
  3. 发送消息:生产者发送消息到扇形交换机。由于扇形交换机会忽略路由键,因此在发送消息时也不需要指定路由键。

三、主题交换机(Topic Exchange)

1. 特点
  • 路由键模糊匹配:主题交换机使用通配符(* 和 #)对路由键进行模糊匹配。其中,* 表示匹配一个单词,# 表示匹配零个或多个单词。
  • 灵活路由:由于主题交换机支持路由键的模糊匹配,因此可以实现更加灵活的路由策略,满足复杂的消息传递需求。
  • 多对多传递:一个主题交换机可以绑定多个队列,并且一个队列也可以绑定到多个主题交换机上,从而实现多对多的消息传递关系。
2. 应用场景
  • 新闻分类:在新闻系统中,可以将不同类型的新闻按照主题进行分类,然后使用主题交换机将新闻消息发送到对应的分类队列中。
  • 消息过滤:在需要根据消息内容进行过滤的场景中,可以使用主题交换机和路由键的模糊匹配功能来实现。
  • 日志系统:在日志系统中,可以根据日志的级别(如INFO、WARN、ERROR等)和来源(如系统A、系统B等)来定义路由键,并使用主题交换机将日志消息发送到相应的处理队列中。
3.工作原理
  1. 声明交换机和队列:首先,需要在RabbitMQ中声明一个主题交换机和一个或多个队列。
  2. 绑定队列:然后,将队列与主题交换机进行绑定,并指定绑定键(Binding Key)。绑定键是一个带有通配符的路由键,用于指定队列可以接收哪些路由键的消息。
  3. 发送消息:生产者发送消息到主题交换机时,需要指定一个路由键。主题交换机会根据路由键和绑定键的模糊匹配结果,将消息路由到匹配的队列中。
4.配置示例

在RabbitMQ中配置主题交换机通常涉及以下几个步骤:

  1. 声明主题交换机:使用RabbitMQ的API或管理界面声明一个主题交换机。

  2. 声明队列:声明一个或多个队列,用于接收消息。

  3. 绑定队列:将队列与主题交换机进行绑定,并指定绑定键。例如,可以创建一个绑定键为*.error的绑定关系,表示该队列将接收所有以.error结尾的路由键的消息。

  4. 发送消息:生产者发送消息到主题交换机,并指定一个路由键。例如,发送一个路由键为systemA.error的消息,该消息将被路由到所有绑定键与*.error匹配的队列中。

5.注意事项
  1. 通配符使用:在使用通配符时,需要注意它们的匹配规则。* 只能匹配一个单词,而 # 可以匹配零个或多个单词。

  2. 路由键设计:合理的路由键设计对于实现有效的消息路由至关重要。需要根据实际业务需求来设计路由键的结构和命名规则。

  3. 性能考虑:虽然主题交换机提供了灵活的路由策略,但在处理大量消息时可能会引入一定的性能开销。因此,在设计消息传递系统时,需要综合考虑性能需求和业务需求之间的平衡。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vision Pro 3D 目标跟踪实战案例:厨房场景应用
  • QTableView使用示例-Qt模型视图代理(Model-View-Delegate)使用示例
  • Go-反射
  • 2024最新最全面的Selenium 3.0 + Python自动化测试框架
  • LeetCode每日一题_572.另一棵树的子树
  • C#学习笔记14:SYN6288语音模块_Winform上位机控制软件
  • 使用Variadic Templates(可变参数模板)实现printf
  • electron 配置、打包 -报错解决
  • RocketMQ 的认证与授权机制
  • Hive自定义Serde,实现自定义多字符串作为分隔符
  • 【C++】对象模型和this指针
  • vivado ODT
  • 【HarmonyOS NEXT星河版开发学习】小型测试案例01-今日头条置顶练习
  • 【算法速刷(4/100)】LeetCode —— 155.最小栈
  • Java反序列化漏洞实战:原理剖析与复现步骤
  • 【css3】浏览器内核及其兼容性
  • 【翻译】babel对TC39装饰器草案的实现
  • 2019.2.20 c++ 知识梳理
  • 2019年如何成为全栈工程师?
  • angular2开源库收集
  • cookie和session
  • eclipse(luna)创建web工程
  • ES2017异步函数现已正式可用
  • ES6系列(二)变量的解构赋值
  • export和import的用法总结
  • HTTP中的ETag在移动客户端的应用
  • JavaScript对象详解
  • Javascript基础之Array数组API
  • js
  • JS笔记四:作用域、变量(函数)提升
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python实现BT种子转化为磁力链接【实战】
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 爬虫模拟登陆 SegmentFault
  • 浅谈Golang中select的用法
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何实现 font-size 的响应式
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • AI算硅基生命吗,为什么?
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (AngularJS)Angular 控制器之间通信初探
  • (C++20) consteval立即函数
  • (pycharm)安装python库函数Matplotlib步骤
  • (Python) SOAP Web Service (HTTP POST)
  • (待修改)PyG安装步骤
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (六)激光线扫描-三维重建
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)甲方乙方——赵民谈找工作
  • (转载)跟我一起学习VIM - The Life Changing Editor