Kafka:在生成有关 Kafka 主题的记录时出现异常
Kafka: Exception while producing records on Kafka topic
我在生成有关 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());
}
}
我只想知道这个异常的原因是什么?如何预防?
每个主题分区都有一个负责服务来自客户端的所有 read/write 请求的领导代理(如果复制大于一个,则多个跟随代理只从该分区的领导代理复制数据但不处理来自客户的任何 read/write 请求)。在客户端启动时,客户端查询集群以获取它需要的每个分区的领导者 read/write from/to 并缓存此元数据。
可能会发生这样的情况,主题分区的领导权由于不同的原因(例如,代理人宕机——恢复后可能不会不再是领导者,但成为追随者,因为不需要将领导权转移回来——或者如果发出管理命令,则将分区移动到不同的代理)。
如果发生这种情况,则客户端的元数据不再正确,您将得到相应的异常。因此,从客户的角度来看,您无法阻止这种情况的发生。但是,您可以简单地创建一个新的客户端实例,它将重新发现新的领导者,您的应用程序可以从那里恢复。
我在生成有关 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());
}
}
我只想知道这个异常的原因是什么?如何预防?
每个主题分区都有一个负责服务来自客户端的所有 read/write 请求的领导代理(如果复制大于一个,则多个跟随代理只从该分区的领导代理复制数据但不处理来自客户的任何 read/write 请求)。在客户端启动时,客户端查询集群以获取它需要的每个分区的领导者 read/write from/to 并缓存此元数据。
可能会发生这样的情况,主题分区的领导权由于不同的原因(例如,代理人宕机——恢复后可能不会不再是领导者,但成为追随者,因为不需要将领导权转移回来——或者如果发出管理命令,则将分区移动到不同的代理)。
如果发生这种情况,则客户端的元数据不再正确,您将得到相应的异常。因此,从客户的角度来看,您无法阻止这种情况的发生。但是,您可以简单地创建一个新的客户端实例,它将重新发现新的领导者,您的应用程序可以从那里恢复。