具有相同 GroupId 的多个 Kafka 侦听器都接收消息
Multiple Kafka Listeners With Same GroupId All Receiving Message
我在 Spring 引导应用程序中配置了一个 kafka 监听器,如下所示:
@KafkaListener(topicPartitions = @TopicPartition(topic = 'data.all', partitions = { "0", "1", "2" }), groupId = "kms")
public void listen(ObjectNode message) throws JsonProcessingException {
// Code to convert to json string and write to ElasticSearch
}
此应用程序被部署到 3 台服务器上 运行,尽管所有服务器的组 ID 都是 kms
,但它们都获得了消息的副本,这意味着我在中获得了 3 条相同的记录松紧带。当我 运行 在本地创建一个实例时,会写入 4 个副本。
我通过检查写入发生前后主题上所有消息的计数,确认生产者只向主题写入了 1 条消息;它只会增加 1。我该如何防止这种情况?
当您像这样手动分配分区时,您负责在实例之间分配分区。
组被忽略。
您必须使用组管理,让 Kafka 为您分配分区,或者为每个实例手动分配分区。
代替topicPartitions
,使用topics = "data.all"
当您不手动分配分区时会发生什么
制作方
- 当生产者在没有任何策略或指定消息应该发送到哪个分区的情况下发送消息时,kafka 会尝试使用循环技术并将所有消息拆分到所有可用分区。
- 2 个分区中的消息是唯一的,因为建议最多只有 1 个消费者收听主题的特定分区。
消费者端
- 例如一个主题有2个分区
- 然后一个消费者(假设
A
)加入消费者组(假设 consumer
)
- 只要有新的消费者加入并且 2 个分区被分配给
A
就会发生分区重新分配,因为我们只有一个消费者组 consumer
- 现在,消费者
B
尝试加入同一个消费者组 consumer
然后分区重新分配将再次发生并且 A 和 B 都将获得分区来收听消息
- 因为我们只有2个分区,即使我们向同一个消费者组添加更多的消费者,也只有2个消费者会监听发送到主题的消息,因为一次只有2个消费者可以得到1个-1 分区。保持消费者消费的消息的排他性。
您的情况是,不止 1 个消费者正在收听相同的分区,因此在同一消费者组中收听相同分区的所有消费者也将收到来自该分区的消息。因此,由于超过 1 个消费者正在侦听相同的分区,消费者组中的消费者之间的互斥性丢失。
我在 Spring 引导应用程序中配置了一个 kafka 监听器,如下所示:
@KafkaListener(topicPartitions = @TopicPartition(topic = 'data.all', partitions = { "0", "1", "2" }), groupId = "kms")
public void listen(ObjectNode message) throws JsonProcessingException {
// Code to convert to json string and write to ElasticSearch
}
此应用程序被部署到 3 台服务器上 运行,尽管所有服务器的组 ID 都是 kms
,但它们都获得了消息的副本,这意味着我在中获得了 3 条相同的记录松紧带。当我 运行 在本地创建一个实例时,会写入 4 个副本。
我通过检查写入发生前后主题上所有消息的计数,确认生产者只向主题写入了 1 条消息;它只会增加 1。我该如何防止这种情况?
当您像这样手动分配分区时,您负责在实例之间分配分区。
组被忽略。
您必须使用组管理,让 Kafka 为您分配分区,或者为每个实例手动分配分区。
代替topicPartitions
,使用topics = "data.all"
当您不手动分配分区时会发生什么
制作方
- 当生产者在没有任何策略或指定消息应该发送到哪个分区的情况下发送消息时,kafka 会尝试使用循环技术并将所有消息拆分到所有可用分区。
- 2 个分区中的消息是唯一的,因为建议最多只有 1 个消费者收听主题的特定分区。
消费者端
- 例如一个主题有2个分区
- 然后一个消费者(假设
A
)加入消费者组(假设consumer
) - 只要有新的消费者加入并且 2 个分区被分配给
A
就会发生分区重新分配,因为我们只有一个消费者组consumer
- 现在,消费者
B
尝试加入同一个消费者组consumer
然后分区重新分配将再次发生并且 A 和 B 都将获得分区来收听消息 - 因为我们只有2个分区,即使我们向同一个消费者组添加更多的消费者,也只有2个消费者会监听发送到主题的消息,因为一次只有2个消费者可以得到1个-1 分区。保持消费者消费的消息的排他性。
您的情况是,不止 1 个消费者正在收听相同的分区,因此在同一消费者组中收听相同分区的所有消费者也将收到来自该分区的消息。因此,由于超过 1 个消费者正在侦听相同的分区,消费者组中的消费者之间的互斥性丢失。