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

Rabbitmq direct 模式与 finout区别

在 RabbitMQ 中,direct 和 fanout 是两种不同的 交换机(Exchange)类型,它们决定了消息如何被路由到队列。以下是它们的核心区别和适用场景:


1. Direct Exchange(直连交换机)

核心特点

  • 路由规则:基于 精确匹配的 routing_key 绑定队列。

  • 工作方式

    • 生产者发送消息时指定 routing_key(如 payment.success)。

    • 交换机将消息 仅投递到与该 routing_key 完全匹配的队列

  • 绑定示例

    python

    # 队列绑定到 direct exchange,指定 routing_key
    channel.queue_bind(queue="payment_queue",exchange="direct_logs",routing_key="payment.success"  # 精确匹配
    )

适用场景

  • 点对点精确路由
    例如:订单支付成功消息(routing_key=payment.success)只发送给支付服务,日志错误消息(routing_key=error)只发送给日志服务。

  • 多消费者选择性消费
    不同消费者绑定不同的 routing_key,实现消息分类。

图示

text

Producer → [Direct Exchange] → 匹配 routing_key → 目标队列||-- routing_key="A" → Queue1|-- routing_key="B" → Queue2

2. Fanout Exchange(扇出交换机)

核心特点

  • 路由规则忽略 routing_key,广播到所有绑定的队列

  • 工作方式

    • 生产者发送的消息会被 复制到所有绑定的队列,无论 routing_key 是什么。

    • 类似广播模式。

  • 绑定示例

    python

    # 队列绑定到 fanout exchange(无需 routing_key)
    channel.queue_bind(queue="email_queue",exchange="fanout_logs"  # 无 routing_key
    )
    channel.queue_bind(queue="sms_queue",exchange="fanout_logs"  # 无 routing_key
    )

适用场景

  • 事件广播
    例如:用户注册成功后,同时通知邮件服务、短信服务、数据分析服务。

  • 多服务并行处理
    多个消费者需要同一消息的副本,各自独立处理。

图示

text

Producer → [Fanout Exchange] → 所有绑定的队列||→ Queue1|→ Queue2|→ Queue3

3. 关键区别对比

特性Direct ExchangeFanout Exchange
路由依据精确匹配 routing_key忽略 routing_key,广播到所有队列
消息副本1 条消息只路由到 1 个队列(默认)1 条消息复制到所有绑定的队列
性能更高(无消息复制)较低(消息复制开销)
典型场景精准投递(如订单支付)广播通知(如用户注册事件)

4. 如何选择?

  • 用 direct 如果:

    • 需要 选择性投递(如不同服务消费不同消息)。

    • 消息只需被 一个消费者处理(如任务分发)。

  • 用 fanout 如果:

    • 需要 广播消息(如日志收集、多服务通知)。

    • 多个消费者需要 同一消息的副本


5. 混合使用案例

实际系统中,可以组合多种交换机类型:

  1. 用户注册事件(广播)→ fanout 通知邮件、短信服务。

  2. 支付成功消息(精准)→ direct 仅发送给订单服务。

python

# Fanout 示例:广播用户注册事件
channel.basic_publish(exchange="fanout_events",routing_key="",  # 被忽略body="user_created:123"
)# Direct 示例:精准投递支付消息
channel.basic_publish(exchange="direct_orders",routing_key="payment.success",  # 必须匹配body="order_paid:456"
)

总结:

  • direct = 精准投递fanout = 广播。

  • 根据业务是否需要 消息过滤 或 全量广播 来选择。

Direct Exchange(直连交换机)

http://www.dtcms.com/a/283811.html

相关文章:

  • Apache Ignite 的 Pages Writes Throttling(页面写入节流)
  • C++ - 仿 RabbitMQ 实现消息队列--C++11 异步操作实现线程池
  • InfluxDB 3与Apache Parquet:打造高性能时序数据存储与分析解决方案
  • Apache DolphinScheduler介绍与部署
  • UE5 Nanite使用
  • 下班倒计时
  • 链路聚合实训
  • 管家婆价格折扣跟踪管理:查询、新增、修改、删除
  • JAVA中的Map集合
  • 【01背包】P1466 [USACO2.2] 集合 Subset Sums
  • 华为云容器产品分析
  • HTML表格基础
  • 【Linux】第一个小程序—进度条
  • HikariCP数据库连接池高性能优化实战指南
  • Spring Boot 参数校验:@Valid 与 @Validated
  • 线上协同办公时代:以开源AI大模型等工具培养网感,拥抱职业变革
  • 【前沿技术动态】【AI总结】Spring Boot 4.0 预览版深度解析:云原生时代的新里程碑
  • Fair-code介绍(Fair code)(一套新型软件模型:旨在“开源”“商业可持续性”中找到平衡)
  • Spring Boot Jackson 序列化常用配置详解
  • redis速记
  • Jenkins Git Parameter 分支不显示前缀origin/或repo/
  • 【37】MFC入门到精通——MFC中 CString 数字字符串 转 WORD ( CString, WORD/int 互转)
  • 我爱学算法之—— 前缀和(下)
  • 破局 Meme 币永续:跨界融合 Ormer + AI + 舆情监控 的颠覆性框架
  • 日志采集——ZeroMQ的配置
  • MyBatis 之配置与映射核心要点解析
  • 林曦词典|文质彬彬
  • 如何查询pg账号权限 能否创建模式 删表建表
  • Vim多列打开不同文件操作指南
  • 什么是AI-AIGC-AGI-Agent?基本概念与区别的详细解析