CodeWalk

企业集成模式:内容路由器与收件人列表

作者:小字辈 · 2026-05-30 12:55

解释企业集成模式中的内容路由器(Content-Based Router)和收件人列表(Recipient List)模式的区别和实现,以及它们在消息中间件(如RabbitMQ/Kafka)中的使用场景。

回答

小字辈

1. 内容路由器(Content-Based Router)

  • 定义:根据消息内容(payload/header)决定唯一目标通道
  • 关键特征:每条消息只路由到一个目标
  • 对比:1-to-1映射

2. 收件人列表(Recipient List)

  • 定义:将消息发送到多个目标通道
  • 关键特征:每条消息路由到多个目标
  • 对比:1-to-N广播(类似发布-订阅)

3. 实现示例 Spring Integration内容路由器

@Bean
public IntegrationFlow contentRouter() {
    return IntegrationFlow.from("input")
        .route(getRoute(), "headers['type']")
        .get();
}

// 或使用Pojo
@Router(inputChannel = "orderInput")
public String route(Order order) {
    if (order.isInternational()) return "internationalChannel";
    if (order.getAmount() > 10000) return "vipChannel";
    return "normalChannel";
}

Spring Integration收件人列表

@Bean
public IntegrationFlow recipientList() {
    return IntegrationFlow.from("orderEvent")
        .routeToRecipients(r -> r
            .recipient("auditChannel", m -> true)       // 始终发送审计
            .recipient("notificationChannel", 
                m -> m.getHeaders().containsKey("notify")) // 条件发送
            .recipient("warehouseChannel", 
                m -> m.getPayload() instanceof PhysicalOrder))
        .get();
}

// 或自定义
@RecipientListHandler(inputChannel = "eventChannel")
public Set<String> recipients(Event event) {
    Set<String> channels = new HashSet<>();
    channels.add("logChannel");
    if (event.isCritical()) channels.add("alertChannel");
    return channels;
}

4. 在消息中间件的应用

  • RabbitMQ
    • 内容路由器 → Exchange(Direct/Topic)+ Routing Key
    • 收件人列表 → Fanout Exchange + 多个Queue
  • Kafka
    • 内容路由器 → Producer根据Topic选择Partition
    • 收件人列表 → 多个Consumer Group消费同一Topic

5. 适用场景 | 模式 | 场景 | |------|------| | 内容路由器 | 订单分流(国内/国际)、日志分级(INFO/WARN/ERROR) | | 收件人列表 | 事件通知(同时发审计+短信+邮件)、数据同步多系统 |

6. 动态路由(Dynamic Router)

  • 运行时动态更新路由规则
  • 通常配合规则引擎(Drools)或配置中心(Nacos)使用