自动创建 Topic

最近更新时间:2025-02-25 15:15:22

我的收藏
本文档介绍自动创建 Topic 的使用方式和常见问题。

前提条件

1. 本功能依赖数据面版本,如果您的集群在2025年1月18日前创建,则不支持该功能,需要升级版本请 联系我们
2. 使用专业集群。
3. 集群级,开启自动创建 Topic。

使用方式

1. 使用自动创建 Topic 功能时,应注意规范 Topic 命名:
Topic 名长度控制在128个字符之内;
Topic 名内容应在合法字符(数字字母以及符号-_=:.)之内;
Topic 名不能包含"-partition-"字符串。
2. 使用自动创建 Topic 功能时,只能创建持久化的分区 Topic 。
3. 避免创建同名的持久化 Topic 和非持久化 Topic :
若在控制台创建一个非持久化主题(non-persistent://tenant/namespcaec/topic1)后,再使用自动创建持久化主题(persistent://tenant/namespce/topic1),该持久化主题 topic1不能在管控台展示,并且会影响监控数据上报。
若出现该问题,可以在管控台删除非持久化主题 topic1,刷新页面后同步数据并展示持久化主题 topic1。
4. 使用重试队列和死信队列,并开启自动创建 Topic 功能时:
若用户在构建消费者的逻辑中,没有配置 deadLetterPolicyretryLetterTopicdeadLetterTopic 参数,会自动创建出名为“订阅名-RETRY”的重试队列 Topic 和“订阅名-DLQ”的死信队列 Topic 并收发消息,会与管控台开启该功能创建出的重试队列主题和死信队列主题存在差异。
其次需要额外注意,若是存量用户没有配置完整的deadLetterPolicy且客户端版本较低,在重启消费者后,会向重试队列(名为“订阅名-RETRY”)和的死信队列(名为“订阅名-DLQ”)进行消息发送与消费,原来使用的重试队列(名为“主题名-订阅名-RETRY”)和死信队列(名为“主题名-订阅名-DLQ”)将会失效,存在消息丢失问题;
为避免上述问题,建议在创建 consumer 的时候,设置 deadLetterPolicy 中的重试主题和死信主题:
Consumer<byte[]> consumer = myClient.newConsumer()
.topic("persistent://wzjtest-tenant/test-ns/topic1")
.subscriptionName("sub")
.enableRetry(true)
.subscriptionType(SubscriptionType.Shared)
.deadLetterPolicy(DeadLetterPolicy.builder().maxRedeliverCount(1)//完整配置
.retryLetterTopic("topic1-sub-RETRY") //命名规范为:主题名-订阅名-RETRY
.deadLetterTopic("topic1-sub-DLQ") //命名规范为:主题名-订阅名-DLQ
.build())
.subscribe();
Java 客户端3.0.6、3.3.1或4.0.0及更高版本,通过优化限制重试队列(名为“订阅名-RETRY”)和的死信队列(名为“订阅名-DLQ”)的自动创建,可以规避该问题,但依旧建议用户在 deadLetterPolicy 中显示配置完整重试主题和死信主题参数信息。Go 客户端目前现有版本暂不支持规避该问题。
5. 不同集群规格的主题数和分区数存在限制
对于使用自动创建主题功能,需控制合适数量的主题数量。
若使用超出集群主题数量限制规格后,将不能继续成功创建出主题,并会报错“Topic Not Found.”。

常见问题

在使用自动创建主题功能过程中,若出现"Topic Not Found."报错信息时,请按照以下原因进行排查:
该主题为非持久化主题。
该主题的名称中包含“-partition-”字符串。
该主题的名称超过最大长度限制(128个字符)。
目前已创建的主题数量,已达到目前集群规格的最大主题数量限制。
该主题的名称包含主题名支持字符(数字字母以及符号“-_=:.”)以外的字符。
该主题的名称不符合三段式命名标准(三段式命名标准:persistent://tenantName/namespacesName/topicName)。