消息标签过滤

最近更新时间: 2024-10-17 17:10:00

说明:

为了更好地和 Pulsar 开源社区统一,自2021年4月30日起,腾讯云版 SDK 将停止功能更新,TDMQ 推荐您使用社区版本的 SDK,该功能仅限存量客户使用。

场景说明

通常,一个 Topic 中存放的是相同业务属性的消息,例如交易流水 Topic 包含了下单流水、支付流水、发货流水等,业务若只想消费者其中一种类别的流水,可在客户端进行过滤,但这种过滤方式会带来带宽的资源浪费。 针对上述场景,TDMQ 提供 Broker 端过滤的方式,用户可在生产消息时设置一个或者多个 Tag 标签,消费时指定 Tag 订阅。

说明:

消息标签过滤的功能仅限腾讯云版 SDK 使用,社区版 SDK 暂不支持。

生产带标签的消息

TDMQ 的消息构造函数中,声明了一个 tags 字段,开发者可以为消息添加一个由字符串组成的 tags,如下所示:

 TypedMessageBuilder<T> tags(String... tags);

TDMQ 的客户端提供了专门为消息附加标签属性的 API,以下为 Java 代码示例:

producer.newMessage().value("my-message".getBytes())
     .tags("TagA", "TagB", "TagC")
     .send();

消费时按标签过滤

开发者在创建 TDMQ 的消费客户端时,可以通过以下三种方式,声明消费者接收消息时按照哪种规则去过滤带有标签的消息:

方式一:按特定格式指定标签的组合

按特定格式指定一个标签的组合时,接口声明如下:

ConsumerBuilder<T> topicByTag(String topicName, String tag);

代码示例如下:

consumer = client.newConsumer()
         .topicByTag(topic, "TagA || TagB")//指定多个 Tag
         .subscriptionName("my-subscription")
         .subscriptionType(SubscriptionType.Shared)
         .subscribe();

注意:

指定多个标签组合后,只要组合中有一个标签匹配,则该消息就会被投递到这个消费者。多个标签之间的过滤规则为“或”的关系。

方式二:使用正则表达式过滤标签

使用正则表达式过滤标签时,接口声明如下:

ConsumerBuilder<T> topicByTagsPattern(String topicName, String tagsPattern);

代码示例如下:

consumer = client.newConsumer()
         .topicByTagsPattern(topic, "Tag.*")//正则表达式
         .subscriptionName("my-subscription")
         .subscriptionType(SubscriptionType.Shared)
         .subscribe();

方式三:通过键值对批量指定标签

通过一个键值对批量指定标签过滤时,接口声明如下:

ConsumerBuilder<T> topicsAndTags(Map<String,String > topicsAndTags);

代码示例如下:

Map<String,String > map = new HashMap<>();
map.put(topic1, "TagB");
map.put(topic2, "TagA");
Consumer consumer = client.newConsumer()
     .topicsAndTags(map)
     .subscriptionName("my-subscription")
     .subscriptionType(SubscriptionType.Shared)
     .subscribe();

通过通配符实现不过滤

除此之外,还可以通过通配符 * 来接收所有消息,代码示例如下:

consumer = client.newConsumer()
         .topic(topic, "*") //订阅所有
         .subscriptionName("my-subscription")
         .subscriptionType(SubscriptionType.Shared)
         .subscribe();