我有一个Kafka主题,有10个分区。我计划在不同的服务器上部署两个应用程序。一个应用程序将读取分区0到4。而另一个将读取分区5到9。
部署1
@KafkaListener(topicPartitions =
{ @TopicPartition(topic = "testpartition", partitions = { "0", "1","2", "3","4" })
})
public void receive(ConsumerRecord record) {
System.out.println(String.format("Listener 1 -Topic - %s, Partition - %d, Value: %s", kafkaTopic, record.partition(), record.value()));
}
部署2
@KafkaListener(topicPartitions =
{ @TopicPartition(topic = "testpartition", partitions = { "5", "6","7", "8","9" })
})
public void receive(ConsumerRecord record) {
System.out.println(String.format("Listener 2 -Topic - %s, Partition - %d, Value: %s", kafkaTopic, record.partition(), record.value()));
}
因此,我们将有两个用户组,因为应用程序分别部署在不同的服务器上。
由于每个应用程序都使用不同的分区,这是否会导致Kafka主题上不需要的消息复制?
将所有消息复制两次。如果是这种情况,那么会有消息重复吗?
这是在分布式环境中部署使用者应用程序的正确方法还是有更好的方法?
1条答案
按热度按时间sz81bmfz1#
因为您是手动分配分区,所以不会有重复,并且每个示例将只从其分配的分区接收记录。
当你说“复制”;这取决于创建主题时的复制因子。副本用于确保在不同的代理示例上有多个副本,以便处理服务器故障。复制与复制不同。
但是,即使以这种方式复制记录,每个记录也只有一个逻辑示例。
在某些(罕见的)故障场景中,可能会获得重复的记录,除非您只启用一次语义。
部署它的另一种方法是使用kafka组管理,并让kafka使用其默认算法或自定义算法在示例之间分布分区
ConsumerPartitionAssignor
.