Kafka Producer Thread,即使没有消息发送也有大量线程

时间:2018-10-23 07:24:44

标签: spring-boot apache-kafka spring-kafka

我目前分析了我的kafka生产者春季启动应用程序,并发现许多“ kafka生产者网络线程”正在运行(总共47个)。即使没有数据发送,它也永远不会停止运行。 我的应用程序看起来像这样:

var kafkaSender = KafkaSender(kafkaTemplate, applicationProperties)
kafkaSender.sendToKafka(json, rs.getString("KEY"))

使用KafkaSender:

@Service
class KafkaSender(val kafkaTemplate: KafkaTemplate<String, String>, val applicationProperties: ApplicationProperties) {

@Transactional(transactionManager = "kafkaTransactionManager")
fun sendToKafka(message: String, stringKey: String) {
   kafkaTemplate.executeInTransaction { kt ->
       kt.send(applicationProperties.kafka.topic, System.currentTimeMillis().mod(10).toInt(), System.currentTimeMillis().rem(10).toString(),
               message)
   }
}

companion object {
    val log = LoggerFactory.getLogger(KafkaSender::class.java)!!
}
}

由于每次我想向Kafka发送消息时,我都会实例化一个新的KafkaSender,因此我认为将创建一个新线程,然后将该消息发送到kafka队列。 目前看来,生成器池已生成,但从未清理过,即使它们无事可做。

此行为是故意的吗?

在我看来,该行为应该与数据源池几乎相同,使线程保持活动状态一段时间,但是当无事可做时,请清除它。

1 个答案:

答案 0 :(得分:1)

使用事务时,生产者缓存会按需增长,并且不会减少。

如果要在侦听器容器(消费者)线程上生成消息;每个主题/分区/消费者组都有一个生产者。这是解决僵尸防护问题所必需的,因此,如果发生重新平衡并且分区移至其他实例,则事务ID将保持不变,以便代理可以正确处理这种情况。

如果您不关心僵尸防护问题(并且可以处理重复的交货),请在producerPerConsumerPartition上将DefaultKafkaProducerFactory属性设置为false,并且生产者的数量会少得多。