pulsar的 Topic 自动删除
出现的现状:
为了生产环境的安全及清洁,pulsar关闭自动创建topic的配置,broker.conf: allowAutoTopicCreation=false
,这就导致了在手动创建项目依赖的topic之后,代码尚未发布成功,导致新建的topic处于不活跃状态,于是触发自动删除topicbroker.conf: brokerDeleteInactiveTopicsEnabled=true
,导致应用程序启动报错,而Pulsar 在自动删除 partitioned topic 时,不会删除分区数量这个元数据。所以再次创建时会报错,需要删除后再重新创建。
# 查看topic
pulsar-admin topics list public/default
# 创建topic
pulsar-admin topics create-partitioned-topic persistent://public/default/my-topic --partitions 3
#删除topic
pulsar-admin topics delete-partitioned-topic persistent://public/default/my-topic
关闭Topic 自动删除
Pulsar 默认开启 Topic 自动删除。但 partitioned topic 被自动删除后,KoP 将无法访问它:
Error: NOT_LEADER_OR_FOLLOWER (org.apache.kafka.clients.producer.internals.Sender)
原因如下:
- Pulsar 在自动删除 partitioned topic 时,不会删除分区数量这个元数据。
- Kafka 协议在 METADATA 请求获取分区的 Leader Broker 后,直接向其发送 PRODUCE 请求。(而 Pulsar 协议则多了一个对分区创建 Producer 的请求)
解决方法 1:禁止 Topic 自动删除
broker.conf:
brokerDeleteInactiveTopicsEnabled=false
解决方法 2:启用分区数量自动删除
broker.conf:
brokerDeleteInactivePartitionedTopicMetadataEnabled=true
如果生产环境中比较依赖 Topic 自动删除,可以选择第二种方法。