RocketMQ Tag/SQL92 过滤实战:客户端拉取无效消息浪费带宽?Broker 端精准过滤,网络开销降 70%!
公司做物流系统,订单状态变更通过 RocketMQ 广播。刚开始只有一个消费者,所有消息照单全收。后来业务拆分,多了十几个微服务各自订阅感兴趣的消息。问题来了——每个服务都从 Broker 拉全量消息,然后自己过滤。一天几千万条消息,每个服务实际需要的不到 10%,90% 拉过来就扔了。内网带宽跑满,消息堆积,消费延迟越来越大。 这个问题特别容易被忽视。因为消息队列用起来太简单了,Producer 发、Consumer 收,中间不用管。但当你有了十几个 Consumer 各自只需要不同子集的消息时,全量拉取就是在用带宽换便利。 今天聊聊 RocketMQ 的 Tag 和 SQL92 两种 Broker 端过滤方式,把过滤逻辑从消费端前移到 Broker,让不需要的消息根本不出 Broker 的门。 客户端过滤的问题在哪 默认的 Push Consumer 模式,客户端从 Broker 拉消息的流程是这样的: Broker ──拉取──→ Consumer(全量消息) │ ├─ 需要的消息(10%)→ 处理 └─ 不需要的消息(90%)→ 丢弃 看起来没什么问题?你丢你的,又不占硬盘....