我在制作Kafka主题的唱片时遇到以下例外:
java.lang.RuntimeException: This server is not the leader for that topic-partition.
下面是向Kafka主题发送记录的代码。
AtomicReference<Exception> exRef = new AtomicReference<>();
while([some condition]) {
producer.send(new ProducerRecord<>(topic, message), (metadata, exception) -> {
if (exception != null) {
exRef.set(exception);
}
});
if (exRef.get() != null) {
throw new RuntimeException(exRef.get().getMessage(), exRef.get().getCause());
}
}
我只想知道这个例外的原因是什么?如何预防?
1条答案
按热度按时间aelbi1ox1#
每个主题分区都有一个leader代理,负责服务于来自客户端的所有读/写请求(如果复制大于一个,则多个follower代理只复制来自该分区leader代理的数据,而不服务于来自客户端的任何读/写请求)。在启动客户机时,客户机查询集群以获取它需要从/写入的每个分区的前导,并缓存此元数据。
可能会发生这样的情况:主题分区的领导层由于不同的原因从一个代理移动到另一个代理(即,跟随者成为领导层)(例如,代理发生故障--在恢复之后,它可能不再是领导层,而是跟随者,因为不需要将领导层转移回去--或者如果发出了管理命令,将分区移动到其他代理)。
如果发生这种情况,客户机的元数据将不再正确,您将得到相应的异常。因此,从客户的Angular 来看,您无法阻止这种情况的发生。但是,您可以简单地创建一个新的客户端示例,它将重新发现新的领导者,并且您的应用程序可以从此处恢复。