Java/Kotlin Kafka消费者在web应用程序中使用多个实例(容器)

Java/Kotlin Kafka消费者在web应用程序中使用多个实例(容器),java,spring-boot,kotlin,apache-kafka,Java,Spring Boot,Kotlin,Apache Kafka,对于我的SpringBootWeb应用程序,在应用程序启动后,我想调用一个类的方法来保持它运行,直到应用程序关闭 但是,如果我的应用程序部署到Kubernetes集群,那么它通常会有多个web应用程序实例,比如说4个实例(因此我假设还有4个Kafkanconsumer)。我想知道下面的代码是线程安全的还是可以水平伸缩的 当我的应用程序停止时,我收到如下警告: kafka消费者对多线程访问不安全 @Component class KafkaConsumerService : Application

对于我的SpringBootWeb应用程序,在应用程序启动后,我想调用一个类的方法来保持它运行,直到应用程序关闭

但是,如果我的应用程序部署到Kubernetes集群,那么它通常会有多个web应用程序实例,比如说4个实例(因此我假设还有4个
Kafkanconsumer
)。我想知道下面的代码是线程安全的还是可以水平伸缩的

当我的应用程序停止时,我收到如下警告:
kafka消费者对多线程访问不安全

@Component
class KafkaConsumerService : ApplicationRunner {
  private lateinit var kafkaConsumer: KafkaConsumer<String, String>

  init {
    val props = Properties()
    props[ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG] = "127.0.0.1:9092"
    props[ConsumerConfig.GROUP_ID_CONFIG] = "AnotherDemoConsumer"
    props[ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG] = StringDeserializer::class.java.name
    props[ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG] = StringDeserializer::class.java.name

    kafkaConsumer = KafkaConsumer(props)
  }

  override fun run(args: ApplicationArguments?) {
    receiveFromKafka()
  }

  fun receiveFromKafka() {
    kafkaConsumer.subscribe(listOf("test-topic"))

    while (true) {
      val consumerRecords = kafkaConsumer.poll(3000)

      consumerRecords.forEach { record ->
        logger.info("Receive Kafka message having key: ${record.key()}, value: ${record.value()}, " +
            "partition: ${record.partition()}, offset: ${record.offset()}")
      }
    }
  }
}
@组件
Kafka类消费者服务:ApplicationRunner{
私人lateinit var kafkaConsumer:kafkaConsumer
初始化{
val props=Properties()
道具[ConsumerConfig.BOOTSTRAP\u SERVERS\u CONFIG]=“127.0.0.1:9092”
道具[ConsumerConfig.GROUP\u ID\u CONFIG]=“另一个DemoConsumer”
props[ConsumerConfig.KEY\u反序列化程序\u CLASS\u CONFIG]=StringDeserializer::CLASS.java.name
props[ConsumerConfig.VALUE\u反序列化程序\u类\u配置]=StringDeserializer::CLASS.java.name
卡夫卡消费者=卡夫卡消费者(道具)
}
覆盖有趣的运行(参数:ApplicationArguments?){
从卡夫卡()收到
}
从卡夫卡那里得到的乐趣(){
kafkaConsumer.subscribe(列表(“测试主题”))
while(true){
val consumerRecords=kafkaConsumer.poll(3000)
consumerRecords.forEach{record->
info(“接收Kafka消息,其键:${record.key()},值:${record.value()},”+
分区:${record.partition()},偏移量:${record.offset()})
}
}
}
}

kubernetes吊舱是否创建新实例?或者访问同一个实例?我认为k8s pods应该创建应用程序的新实例?所以它应该是安全的?但是仍然不能确定关于线程不安全的警告。根据这个警告,我相信POD不会创建新实例,如果它们使用相同的使用者实例,那么多个线程正在访问相同的使用者实例。这将导致此错误消息