我已将我的生产者配置为:
spring.cloud.stream.bindings.pc-abc-out-0.destination=pc-abc-my-topic
spring.cloud.stream.bindings.pc-abc-out-0.producer.partition-count=5
spring.cloud.stream.bindings.pc-abc-out-0.producer.header-mode=headers
spring.cloud.stream.bindings.pc-abc-out-0.producer.partition-count=10
spring.cloud.stream.bindings.pc-abc-out-0.producer.partitionKeyExpression=payload.key
spring.cloud.stream.kafka.bindings.pc-abc-out-0.producer.sync=true然而,在kafka日志中,我一直得到错误:
o.s.kafka.support.LoggingProducerListener - Exception thrown when sending a message with key='byte[14]' and payload='byte[253]' to *topic pc-abc-my-topic and partition 8*: org.apache.kafka.common.errors.TimeoutException: Topic pc-abc-my-topic not present in metadata after 60000 ms.错误消息中的亮点是:主题pc-abc我的主题和分区8。
为什么它要寻找分区8,即使我已经将分区数定义为5,不应该在0-4之间编号。我还有几条分区号超过5的其他错误消息。
在我前面的配置中,我添加了
spring.cloud.stream.kafka.binder.auto-add-partitions=true但我删除了它,我们缩小了规模,扩大了服务范围。这个问题仍然存在。这是陈腐配置的情况吗?
发布于 2022-01-27 14:17:39
事实证明,问题是这种配置:
spring.cloud.stream.bindings.pc-abc-out-0.producer.partitionKeyExpression=payload.key
spring.cloud.stream.kafka.bindings.pc-abc-out-0.producer.sync=true由于payload.key而计算的分区数大约比我们在基础结构上配置和创建的partitionCount值要大。删除这两种配置将停止此问题。
发布于 2022-01-24 13:49:53
我猜您首先用8个分区创建了主题。如果主题已经存在,春季-卡夫卡没有创建新的一个与您的分区吐露。
--卡夫卡绑定器--将使用生产者的partitionCount设置作为提示,用给定的分区计数创建一个主题(与minPartitionCount一起使用,两者中的最大值为所使用的值)。在为绑定程序配置minPartitionCount和为应用程序配置partitionCount时都要小心,因为将使用更大的值。如果主题已经存在,且分区数较小,并且禁用了autoAddPartitions (默认),则绑定程序将无法启动。
如果主题已经存在,且分区数量较小,并且启用了autoAddPartitions,则将添加新的分区。如果一个主题的分区数量已经超过最大值(minPartitionCount和partitionCount),则将使用现有的分区计数.。
您真正的问题是主题problem在60000 ms后没有出现在元数据中。并不关心分区计数。
这里解决了这个问题
org.apache.kafka.common.errors.TimeoutException: Topic not present in metadata after 60000 ms
https://developpaper.com/topic-xxx-not-present-in-metadata-after-60000-ms/
https://stackoverflow.com/questions/70830969
复制相似问题