CMQ 的 Topic 模式支持订阅筛选标签(tag)功能,类似于 rabbitMQ 的 direct_routing 模式,topic_pattern 模式在下个迭代提供。由于筛选标签的使用策略较复杂,本文将结合不同场景进行说明。
有4个订阅者 A、B、C、D,A 消息标签是 apple,B 消息标签是 xiaomi,C 的消息标签是 imac+xiaomi,D 没有设置任何标签。
此时,有生产者 publish 到 Topic 100条消息,带的消息标签过滤为:apple、imac、iphone、macbook。此后 Topic 立即投递到 A、B、C、D。
场景分析:
订阅者 | 消息标签 | 消息接收说明 |
---|---|---|
A | apple | 由于 apple 能匹配消息过滤标签中的 apple,则能正常收到100条消息。 |
B | xiaomi | 不能收到任何消息。 |
C | imac+xiaomi | 由于其中一个标签 imac 能匹配,则能正常收到100条消息 。 |
D | - | 可以收到任何消息。 |
Topic 有且仅有4个订阅者 A、B、C、D,四个订阅者都没有设置消息 tag。
此时,有生产者 publish 到 Topic 100条消息,带的消息标签过滤为:apple、imac、iphone、macbook。此后 Topic 立即投递到 A、B、C、D。
场景分析:
订阅者 A、B、C、D 均没有 tag,则投递时不用匹配消息, A、B、C、D 都能收到这100条消息。
Topic 有且仅有1个订阅者 A,A 的订阅标签设置为 xiaomi。
此时,有生产者 publish 到 Topic 100条消息,带的消息标签过滤为:apple、imac、iphone、macbook。此后 Topic 立即投递到 A。
场景分析:
Topic 名为 test1 ,在12点01分,调用了订阅发布的 API,定义该次操作为“发布 test1”,发布后 Topic 投递到订阅者,给 A、B、C 三个订阅者投递了200条消息。
假设结果为:A 有100条消息接收失败,B 有30条消息接收失败,C 的200条消息全部接收成功
场景分析:
每一条消息的 ID,作为 key,value 是关联的订阅者、代表每个订阅者消费成功与否。
Topic 名为 test2 ,在12点01分,调用了订阅发布的 API,定义该次操作为“发布 test2”,给 A、B、C 三个订阅者投递了200条消息。
假设结果为:A、B、C 的200条消息全部接收成功。
场景分析:
若 Topic-test2,有且仅有 A、B、C 三个订阅者,且都确定消费成功后,Topic 会立即删除200条消息。
通过以上不同场景,标签匹配规律如下:
订阅者 | 订阅者有无 tag | 有无消息 tag | 消息接收说明 |
---|---|---|---|
A | 有 | 无 | 订阅者不匹配,不能收到消息。 |
B | 无 | 有 | 投递时消息不用匹配,订阅者都能收到消息。 |
C | 有 | 有 | 两者匹配的,才能收到消息。支持 N:M 匹配,如消息有10个 tag,订阅者有4个 tag,其中有1个 tag 相互能匹配上,则订阅者能收到消息。 |
D | 无 | 无 | 投递后,所有订阅者都能收到消息。 |
本页内容是否解决了您的问题?