如果我从同一应用程序生成多条消息,KafkaTemplate 是否会打开与代理的多个连接?
Would KafkaTemplate open multiple connections to a broker if I produce multiple messages from the same application?
我们正在使用 spring-kafka-2.2.7.RELEASE 来生产和消费 messages.Now 我的问题是,如果我从同一个应用程序?如果是,我们如何控制连接数?
视情况而定;如果您不使用事务,则默认情况下(根据 Kafka javadocs 的建议)使用单个共享生产者进行所有操作。
实际行为由模板使用的 DefaultKafkaProducerFactory
控制,而不是模板本身。
有了2.3.x+,你可以为每个线程创建一个生产者:
/**
* Set to true to create a producer per thread instead of singleton that is shared by
* all clients. Clients <b>must</b> call {@link #closeThreadBoundProducer()} to
* physically close the producer when it is no longer needed. These producers will not
* be closed by {@link #destroy()} or {@link #reset()}.
* @param producerPerThread true for a producer per thread.
* @since 2.3
* @see #closeThreadBoundProducer()
*/
public void setProducerPerThread(boolean producerPerThread) {
this.producerPerThread = producerPerThread;
this.threadBoundProducers = new ThreadLocal<>();
}
当您使用交易时,要么使用一个生产者池(用于生产者发起的交易),要么每个 group/topic/partition
的生产者通常用于消费者发起的交易(用于适当的僵尸防护操作)。
我们正在使用 spring-kafka-2.2.7.RELEASE 来生产和消费 messages.Now 我的问题是,如果我从同一个应用程序?如果是,我们如何控制连接数?
视情况而定;如果您不使用事务,则默认情况下(根据 Kafka javadocs 的建议)使用单个共享生产者进行所有操作。
实际行为由模板使用的 DefaultKafkaProducerFactory
控制,而不是模板本身。
有了2.3.x+,你可以为每个线程创建一个生产者:
/**
* Set to true to create a producer per thread instead of singleton that is shared by
* all clients. Clients <b>must</b> call {@link #closeThreadBoundProducer()} to
* physically close the producer when it is no longer needed. These producers will not
* be closed by {@link #destroy()} or {@link #reset()}.
* @param producerPerThread true for a producer per thread.
* @since 2.3
* @see #closeThreadBoundProducer()
*/
public void setProducerPerThread(boolean producerPerThread) {
this.producerPerThread = producerPerThread;
this.threadBoundProducers = new ThreadLocal<>();
}
当您使用交易时,要么使用一个生产者池(用于生产者发起的交易),要么每个 group/topic/partition
的生产者通常用于消费者发起的交易(用于适当的僵尸防护操作)。