企业集成模式:内容路由器与收件人列表
解释企业集成模式中的内容路由器(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)使用