Skip to content
章节导航

RocketMQ 里面的标签 Tag 实战和消息过滤原理

  • 一个Message只有—个Tag, tag是二级分类,订单:数码类订单、食品类订单。

  • 过滤分为 Broker 端和 Consumer 端过滤
    Broker 端过滤,减少了无用的消息的进行网络传输,增加了 broker 的负担
    Consumer 端过滤,完全可以根据业务需求进行实习,但是增加了很多无用的消息传输

  • —般是监听 * ,或者指定 tag, || 运算, SQL92, FilterServer等;
    tag 性能高,逻辑简单
    SQL92 性能差点,支持复杂逻辑(只支持 PushConsumer 中使用)MessageSelector.bySql
    语法: > , < = , IS NULL, AND, OR, NOT 等, sql where后续的语法即可(大部分)

  • 注意:消费者订阅关系要—致,不然会消费混乱,甚至消息丢失
    订阅关系—致:订阅关系由 Topic和 Tag 组成,同—个 group name,订阅的 topic和tag 必须 是—样的

  • 在 Broker 端进行 MessageTag 过滤,遍历 message queue 存储的 message tag 和订阅传递的 tag 的 hashcode 不—样则跳过,符合的则传输给 Consumer,在 consumer queue 存储的是对应的 hashcode, 对比也是通过hashcode对比; Consumer 收到过滤消息后也会进行匹配操作,但是是对比真实的 message tag 而不是 hashcode 1、consume queue存储使用hashcode定长,节约空间
    2、过滤中不访问c ommit log,可以高效过滤
    3、如果存在 hash 冲突,Consumer 端可以进行再次确认
    4、如果想使用多个 Tag,可以使用 sql 表达式,但是不建议,单—职责,多个队列

  • 常见错误

shell
The broker does not support consumer to filter message by SQL92

解决: broker.conf 里面配置如下 enablePropertyFilter=true
备注,修改之后要重启 Broker

master节点配置: vim conf/2m-2s-async/broker-a.properties  slave节点配置: vim conf/2m-2s-async/broker-a-s.properties