一条消息多个标签组合,消费端如何过滤是否包含指定字符串标签; 例如: 消息体 :aaa tag: 1;2;3;4
三个消费组,A消费组只想要tag包含1和3的消息;B消费组只想要tag包含2的消息;C消费组只想要tag包含4的消息; 因为是同一条消息而且消息体可能会比较大,不可能让生产者把同一条消息发送多次来区分;这种情况使用tag过滤应该如何处理?
一条消息多个标签组合,消费端如何过滤是否包含指定字符串标签; 例如: 消息体 :aaa tag: 1;2;3;4
三个消费组,A消费组只想要tag包含1和3的消息;B消费组只想要tag包含2的消息;C消费组只想要tag包含4的消息; 因为是同一条消息而且消息体可能会比较大,不可能让生产者把同一条消息发送多次来区分;这种情况使用tag过滤应该如何处理?
这个场景使用 tag 可能并不合适,因为一条消息只能具有一个 tag。可以尝试使用 sql 过滤,详见官网文档
tag不同的消息, 消息体也不一样吧?
@lironghai 你上面的例子就是一个标签,只是你标签用了分隔符分割。 如果你一定需要用tag来区分,消费设置tag=*, 然后将消息的tag拿出来进行比对。如果满足你的这个消费组的需求你就消费,不满足就丢弃这样也是可以的。正常来说tag不同应该消息体也不一样。
@lironghai 你上面的例子就是一个标签,只是你标签用了分隔符分割。 如果你一定需要用tag来区分,消费设置tag=*, 然后将消息的tag拿出来进行比对。如果满足你的这个消费组的需求你就消费,不满足就丢弃这样也是可以的。正常来说tag不同应该消息体也不一样。
您说的对的,一条消息的标签是拼接多个的; 我举个简单场景例子可能我的理解有问题: 例如这条消息是一个快照消息,这个快照需要执行多个分析处理,而每次执行的检测都是不同的是动态的,每个检测都是不同的服务并不是集成在一起的,所以需要多个消费者组来处理自己需要的类型消息;
因为我们的消息可能会比较大,可能是图片快照的base64,如果每个消费组都接收带宽和brocker的传输压力都很大,所以期望还是通过mq来处理这件事情; 当然我也考虑过将标签细化一次只设置一个,但是这就导致再生产者需要推送多次,这明显不太合理;目前我们折中的处理方式是使用sql92通过设置不同key来区分处理,但其实这些key都是tag细化的标签,都是同一类属性应该放在一个字段中,但是目前sql92的过滤并不支持数组类型。
之前我们使用的是rabbitmq,它可以同步多级队列名称和队列路由的通配符进行匹配分发,但是切换到rocketmq这种消费的分发复制只能借助消费者组和tag来进行匹配。
这个场景使用 tag 可能并不合适,因为一条消息只能具有一个 tag。可以尝试使用 sql 过滤,详见官网文档
感谢回复! 我明白tag用来标明一类消息更合适,但是我们是想标明更细化标签,用来做消息过滤和分发,其中会包含部分业务功能信息;官网文档我也查看过了,sql92实现复杂过滤,但是暂时还不能支持contain包含的处理,只能是通过不同的key设置对应值来过滤。如果没有最理想的方式我们只能是通过属性key来区分过滤。
这个场景使用 tag 可能并不合适,因为一条消息只能具有一个 tag。可以尝试使用 sql 过滤,详见官网文档
感谢回复! 我明白tag用来标明一类消息更合适,但是我们是想标明更细化标签,用来做消息过滤和分发,其中会包含部分业务功能信息;官网文档我也查看过了,sql92实现复杂过滤,但是暂时还不能支持contain包含的处理,只能是通过不同的key设置对应值来过滤。如果没有最理想的方式我们只能是通过属性key来区分过滤。
SQL92 支持 LIKE 操作符,可以用类似 operation LIKE '%op1%' 的语法来满足你的需求
tag不同的消息, 消息体也不一样吧?
感谢回复! 消息体是一样,只是需要动态设置多级标签,现在是拼接在一起的,所以在消费端不好处理。
这个场景使用 tag 可能并不合适,因为一条消息只能具有一个 tag。可以尝试使用 sql 过滤,详见官网文档
感谢回复! 我明白tag用来标明一类消息更合适,但是我们是想标明更细化标签,用来做消息过滤和分发,其中会包含部分业务功能信息;官网文档我也查看过了,sql92实现复杂过滤,但是暂时还不能支持contain包含的处理,只能是通过不同的key设置对应值来过滤。如果没有最理想的方式我们只能是通过属性key来区分过滤。
SQL92 支持 LIKE 操作符,可以用类似 operation LIKE '%op1%' 的语法来满足你的需求
sql92支持吗,我在官方文档并没有看到,还是隐藏的彩蛋 <手动狗头>
@lironghai 图片作为二进制大对象,不建议放在 payload 中,如果 payload 是一个 json,包含图片路径,时间,属性等信息,把图片放到其他对象存储系统去。这样单条消息就很小了,使用客户端过滤的方式可以满足你的需求。当然由于消息被各个订阅组消费,所以有一些网络开销。
如何实现客户端过滤,可以消费逻辑里面直接返回成功就好,也可以用拦截器。