我已将我的生产者配置为:
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
但我去掉了它,我们缩小了服务规模。这个问题仍然存在。这是陈旧配置的情况吗?
问题原来是这个配置:
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值大一些。删除这两种配置停止了问题。
我想您应该先用8个分区创建主题。如果主题已经存在,spring-kafka不会用您的分区配置创建新的主题。
这里是医生https://docs.spring.io/spring-cloud-stream/docs/Brooklyn.RELEASE/reference/html/_apache_kafka_binder.html#:~:text=默认%3A%20Empty%20map.-,Kafka%20binder%20will
Kafka绑定器将使用生产者的partitionCount设置作为创建具有给定分区计数的主题的提示(在与minPartitionCount结合,两者中的最大值为正在使用的值(。配置两者时要小心绑定器的minPartitionCount和应用程序的partitionCount,因为将使用较大的值。如果主题已经存在,并且较小的分区计数,并且autoAddPartitions被禁用(默认设置(,则绑定程序将无法启动
如果主题已存在,且分区计数较小,并且启用了autoAddPartitions,则会添加新分区如果某个主题的分区数已超过最大值(minPartitionCount和partitionCount(,则将使用现有的分区数
您真正的问题是主题pc abc我的主题在60000毫秒后不存在于元数据中。不关心分区计数。
这里是这个的解决方案
org.apache.kafka.commun.errors.TimeoutException:在60000毫秒之后,元数据中不存在主题
https://developpaper.com/topic-xxx-not-present-in-metadata-after-60000-ms/