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 表达式,但是不建议,单—职责,多个队列常见错误
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
剑鸣秋朔