我在Spring Boot应用程序中配置了一个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台服务器上并在其中运行,尽管它们的组标识均为kms
,但它们都获得了消息的副本,这意味着我在Elastic中获得了3条相同的记录。当我在本地运行实例时,会写入4个副本。
我已经确认生产者通过检查写入前后主题上所有消息的计数来仅向该主题写入1条消息;它只会增加1。如何预防呢?
答案 0 :(得分:2)
当您手动分配分区时,您负责在实例之间分配分区。
该组将被忽略。
您必须使用组管理并让Kafka为您分配分区,或者为每个实例手动分配分区。
使用topicPartitions
代替topics = "data.all"
答案 1 :(得分:0)
不手动分配分区会发生什么情况
A
)与消费者组(让我们说consumer
)加入A
分配2个分区时就会发生分区重新分配,因为我们只有一个使用者组consumer
B
尝试加入同一消费者组consumer
,然后再次发生分区重新分配,并且A和B都将获得分区以收听消息您的情况是,有1个以上的使用者正在收听相同的分区,因此所有正在收听同一使用者组中相同分区的使用者也将从该分区接收消息。因此,由于一个以上的消费者正在监听相同的分区,因此消费者组中消费者之间的互斥性消失了。