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

在RabbitMQ中四种常见的消息路由模式

1. Fanout模式

Fanout模式的交换机是扇出交换机Fanout Exchange),它会将消息广播给所有绑定到它的队列,而不考虑消息的内容或路由键。

工作原理:
  • 生产者发送消息到Fanout Exchange
  • Fanout Exchange会将消息广播给所有绑定到它的队列,所有绑定的队列都会收到这条消息。
  • 消费者监听绑定的队列,处理收到的消息。
特点:
  • 没有路由键:消息不需要路由键,所有绑定的队列都会接收到消息。
  • 广播机制:消息会被广播到所有与交换机绑定的队列,而不管消息内容。
应用场景:
  • 广播系统消息:适合需要通知多个服务模块或系统节点的场景。
  • 日志系统:将日志消息广播到多个日志处理服务。
exchange_type = 'fanout'
exchange = channel.exchange_declare(exchange='logs', exchange_type=exchange_type)

2. Direct模式

Direct模式使用直连交换机Direct Exchange),通过消息的**路由键(Routing Key)**来精确匹配队列。如果生产者的消息路由键和队列绑定的路由键相同,消息就会被分发到该队列。

工作原理:
  • 生产者发送带有路由键的消息到Direct Exchange
  • Direct Exchange根据消息的路由键,将消息精确地分发给绑定了相同路由键的队列。
  • 消费者监听对应的队列,处理符合路由键的消息。
特点:
  • 精确路由:消息根据路由键精确匹配队列。
  • 一对一或多对一:不同队列可以绑定不同的路由键,确保只有匹配的队列收到消息。
应用场景:
  • 日志系统:将不同级别的日志(info、error、warning)发送到不同的日志处理队列。
  • 分布式任务:根据任务类型(如task_type_1task_type_2)精确分发任务
exchange_type = 'direct'
exchange = channel.exchange_declare(exchange='direct_logs', exchange_type=exchange_type)# Binding with specific routing key
channel.queue_bind(exchange='direct_logs', queue='error_logs', routing_key='error')

3. Topic模式

Topic模式使用主题交换机Topic Exchange),允许使用通配符进行消息路由。消息的路由键由一个点分隔的字符串组成,队列可以通过通配符绑定到交换机,实现模糊匹配。

工作原理:
  • 生产者发送带有路由键的消息到Topic Exchange,路由键由点分隔的多个单词组成,例如"logs.info", "user.create", "order.payment.success".
  • 队列绑定到Topic Exchange时,可以使用通配符匹配多个路由键:
    • *匹配一个单词。
    • #匹配零个或多个单词。
  • 消费者监听队列,接收符合通配符规则的消息。
特点:
  • 模糊匹配:消息根据路由键的模式进行模糊匹配。
  • 灵活路由:支持复杂的路由需求,允许将相似类别的消息路由到同一个队列。
应用场景:
  • 消息分类处理:适合需要对复杂系统中的消息进行分类的场景,比如基于用户操作类型、订单状态等。
  • 多模块事件处理:可以为不同的模块创建灵活的订阅机制。
exchange_type = 'topic'
exchange = channel.exchange_declare(exchange='topic_logs', exchange_type=exchange_type)# Binding queue with topic patterns
channel.queue_bind(exchange='topic_logs', queue='system_logs', routing_key='logs.*')
channel.queue_bind(exchange='topic_logs', queue='all_logs', routing_key='#')

4. 头部模式

头部模式使用头部交换机Headers Exchange),不同于Direct和Topic模式,它不是通过路由键来路由消息,而是通过消息的头部属性来路由。队列绑定到交换机时会指定一组头部键值对,只有当消息的头部属性匹配这些键值对时,消息才会被路由到相应的队列。

工作原理:
  • 生产者发送带有头部属性的消息到Headers Exchange
  • 队列绑定到Headers Exchange时,会指定匹配条件(例如x-match=all表示所有头部键值对都必须匹配,x-match=any表示只要有一个匹配即可)。
  • 交换机根据头部属性将消息分发给符合条件的队列。
特点:
  • 基于头部字段路由:不依赖路由键,消息的头部属性决定消息的路由。
  • 更复杂的路由逻辑:适合需要根据多种属性组合来路由的场景。
应用场景:
  • 消息过滤:适合需要根据消息的多个属性来进行复杂过滤的场景,比如需要根据来源、优先级等多个条件筛选消息。
  • 高度灵活的路由逻辑:当单纯依赖路由键不足以满足需求时,使用头部模式更合适。
exchange_type = 'headers'
exchange = channel.exchange_declare(exchange='header_logs', exchange_type=exchange_type)# Binding queue with header matching criteria
channel.queue_bind(exchange='header_logs', queue='error_logs', arguments={'x-match': 'all', 'type': 'error', 'format': 'json'})

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Red Hat 和 Debian Linux 对比
  • 小程序体验版无法正常请求接口,开启 调试可以正常请求
  • 本地不能訪問linux的kafka服務
  • 大模型教程:使用 Milvus、vLLM 和 Llama 3.1 搭建 RAG 应用
  • this 指向
  • vmware中的ubuntu系统扩容分区
  • uniapp如何实现图片轮播特效?
  • 全面掌握 Jest:从零开始的测试指南(下篇)
  • 【python】OpenCV—Mask RCNN for Object Detection and Instance Segmentation
  • 移动音乐厅:灵活与高效的音乐盛宴空间—轻空间
  • 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)
  • Flume的安装与使用 -- flume自定义拦截器 -- tailDir + Memory + HDFS案例
  • 技术美术一百问(02)
  • 03请求响应(实体参数、集合参数、时间日期参数和Json参数)
  • 一、Numpy入门
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • [deviceone开发]-do_Webview的基本示例
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【笔记】你不知道的JS读书笔记——Promise
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Centos6.8 使用rpm安装mysql5.7
  • Docker入门(二) - Dockerfile
  • egg(89)--egg之redis的发布和订阅
  • Java超时控制的实现
  • Laravel 中的一个后期静态绑定
  • MobX
  • October CMS - 快速入门 9 Images And Galleries
  • 大主子表关联的性能优化方法
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端存储 - localStorage
  • 如何选择开源的机器学习框架?
  • 使用API自动生成工具优化前端工作流
  • 在Mac OS X上安装 Ruby运行环境
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​ssh免密码登录设置及问题总结
  • ​补​充​经​纬​恒​润​一​面​
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (二)WCF的Binding模型
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (简单) HDU 2612 Find a way,BFS。
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十六)一篇文章学会Java的常用API
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转载)hibernate缓存
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .net core docker部署教程和细节问题
  • .net web项目 调用webService
  • .NET 命令行参数包含应用程序路径吗?
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)