当有多个 Producer 实例时,会创建多个 ProducerId
Multiple ProducerIds are created when there are multiple instances of Producers
在.yaml文件中,我们设置了
spring.cloud.stream.kafka.binder.configuration.enable.idempotence as true.
现在当应用程序启动时,我们可以看到类似
的日志
[kafka-producer-network-thread | test_clientId] org.apache.kafka.clients.producer.internals.TransactionManager - [Producer clientId=test_clientId] ProducerId set to 0 with epoch 0
当第一条消息生成到主题时,我们可以看到正在使用另一个 ProducerId,如下面的日志所示
[Ljava.lang.String;@720a86ef.container-0-C-1] org.apache.kafka.clients.producer.KafkaProducer - [Producer clientId=test_clientId] Instantiated an idempotent producer.
[Ljava.lang.String;@720a86ef.container-0-C-1] org.apache.kafka.common.utils.AppInfoParser - Kafka version : 2.0.1
[Ljava.lang.String;@720a86ef.container-0-C-1] org.apache.kafka.common.utils.AppInfoParser - Kafka commitId : fa14705e51bd2ce5
kafka-producer-network-thread | test_clientId] org.apache.kafka.clients.Metadata - Cluster ID: -9nblycHSsiksLIUbVH6Vw
-9nblycHSsiksLIUbVH6Vw
1512361 INFO [kafka-producer-network-thread | test_clientId] org.apache.kafka.clients.producer.internals.TransactionManager - [Producer clientId=test_clientId] ProducerId set to 1 with epoch 0
ProducerId 设置为 1 后,当从此应用程序发送任何新消息时,不会创建新的 ProducerId。
但是如果我们有多个应用程序运行(都连接到同一个kafka服务器),
然后在启动和发送第一条消息时也会在该实例中创建新的 ProducerIds。
请建议我们是否可以限制创建新的 ProducerId 并使用在创建应用程序时创建的相同 ProducerId。
此外,由于创建了很多 ProducerId,是否有一些方法可以让我们重新使用已经创建的 ProducerId?(假设应用程序有多个生产者并且每个生产者都创建多个 ProducerId)
第一个生产者是临时的 - 创建它是为了在初始化期间找到主题的现有分区。立即关闭。
第二个生产者是用于后续记录发送的单个生产者。
producerId和epoch由broker分配。它们必须是独一无二的。
对于新经纪人,您将获得第一个实例的 0 和 1,第二个实例的 2 和 3,4 和 5,...
即使您停止所有实例,下一个实例也会得到 7 和 8。
你为什么担心这个?
另一方面,如果您将 client.id
设置为 foo
,您将始终在所有实例上获得 foo-1
和 foo-2
。
在.yaml文件中,我们设置了
spring.cloud.stream.kafka.binder.configuration.enable.idempotence as true.
现在当应用程序启动时,我们可以看到类似
的日志[kafka-producer-network-thread | test_clientId] org.apache.kafka.clients.producer.internals.TransactionManager - [Producer clientId=test_clientId] ProducerId set to 0 with epoch 0
当第一条消息生成到主题时,我们可以看到正在使用另一个 ProducerId,如下面的日志所示
[Ljava.lang.String;@720a86ef.container-0-C-1] org.apache.kafka.clients.producer.KafkaProducer - [Producer clientId=test_clientId] Instantiated an idempotent producer.
[Ljava.lang.String;@720a86ef.container-0-C-1] org.apache.kafka.common.utils.AppInfoParser - Kafka version : 2.0.1
[Ljava.lang.String;@720a86ef.container-0-C-1] org.apache.kafka.common.utils.AppInfoParser - Kafka commitId : fa14705e51bd2ce5
kafka-producer-network-thread | test_clientId] org.apache.kafka.clients.Metadata - Cluster ID: -9nblycHSsiksLIUbVH6Vw
-9nblycHSsiksLIUbVH6Vw
1512361 INFO [kafka-producer-network-thread | test_clientId] org.apache.kafka.clients.producer.internals.TransactionManager - [Producer clientId=test_clientId] ProducerId set to 1 with epoch 0
ProducerId 设置为 1 后,当从此应用程序发送任何新消息时,不会创建新的 ProducerId。
但是如果我们有多个应用程序运行(都连接到同一个kafka服务器), 然后在启动和发送第一条消息时也会在该实例中创建新的 ProducerIds。
请建议我们是否可以限制创建新的 ProducerId 并使用在创建应用程序时创建的相同 ProducerId。 此外,由于创建了很多 ProducerId,是否有一些方法可以让我们重新使用已经创建的 ProducerId?(假设应用程序有多个生产者并且每个生产者都创建多个 ProducerId)
第一个生产者是临时的 - 创建它是为了在初始化期间找到主题的现有分区。立即关闭。
第二个生产者是用于后续记录发送的单个生产者。
producerId和epoch由broker分配。它们必须是独一无二的。
对于新经纪人,您将获得第一个实例的 0 和 1,第二个实例的 2 和 3,4 和 5,...
即使您停止所有实例,下一个实例也会得到 7 和 8。
你为什么担心这个?
另一方面,如果您将 client.id
设置为 foo
,您将始终在所有实例上获得 foo-1
和 foo-2
。