我负责的OMS结算系统,日均处理订单量数十万单,涉及销售结算、费用分摊、对账等核心业务。系统采用微服务架构,在消息中间件选型上,我们同时使用了 RabbitMQ 和 Kafka,根据不同场景各司其职。
我们实现了一套延时消息机制,用于异步任务调度。比如结算单生成后,需要延时等待上游数据同步完成再处理。
技术要点:
延时自动升格逻辑:
java// 首次1分钟,逐步升格到最长30分钟
if (DelayRouteEnum.DELAY_MINUTE_1.equals(delay)) {
targetDelay = DelayRouteEnum.DELAY_MINUTE_5;
} else if (DelayRouteEnum.DELAY_MINUTE_5.equals(delay)) {
targetDelay = DelayRouteEnum.DELAY_MINUTE_10;
} else if (DelayRouteEnum.DELAY_MINUTE_10.equals(delay)) {
targetDelay = DelayRouteEnum.DELAY_MINUTE_15;
} else {
targetDelay = DelayRouteEnum.DELAY_MINUTE_30;
}
我们设计了均衡队列机制,避免单点消费压力过大。通过消息hash分发到多个消费实例。
应用场景:
我们通过多虚拟主机隔离不同业务域,避免相互影响。
├── oms_async_delay_trade_main_g001 # 主业务队列 ├── oms_async_delay_trade_expand_g001 # 扩展业务队列 ├── oms_async_delay_trade_sub_g001 # 子业务队列 └── examples # DMS业务队列
其他应用:
Kafka 我们主要用在日志收集和数据同步场景,特点是高吞吐、数据量大、允许多消费者独立消费。
业务日志 → Kafka → Logstash → Elasticsearch → Kibana
优势:
结算数据需要实时同步到BI系统做报表分析,通过Kafka实现数据管道。
OMS结算单 → Kafka(oms-trade-order) → BI系统消费
系统运行指标、接口调用链路通过Kafka采集,用于性能监控和问题排查。
| 维度 | RabbitMQ | Kafka |
|---|---|---|
| 定位 | 业务消息队列 | 日志/数据管道 |
| 消息模型 | 点对点、发布订阅 | 发布订阅、日志流 |
| 延时支持 | ✅ 原生支持(死信+TTL) | ❌ 需要外部实现 |
| 吞吐量 | 万级/秒 | 十万级/秒 |
| 消息持久化 | 支持 | 默认持久化 |
| 消费模式 | 推模式,实时性高 | 拉模式,批量消费 |
| 适用场景 | 业务异步、延时任务 | 日志收集、数据同步 |
一句话总结:
RabbitMQ 用于业务流程编排,需要延时、重试、精确控制;Kafka 用于数据管道,需要高吞吐、多消费者独立消费。
publisherConfirms=true通过 死信队列 + TTL:
也可以用 rabbitmq_delayed_message_exchange 插件。
本文基于 OMS结算系统实际项目经验整理