2017-03-14 1 views
0

에 생산 기록을 내가 예외 아래에 무엇입니까 동안 :카프카 : 예외 카프카의 주제에 대한 기록을 생산하면서 카프카 주제

java.lang.RuntimeException: This server is not the leader for that topic-partition. 

아래는 카프카 주제에 레코드를 전송하는 코드입니다.

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()); 
    } 
} 

이 예외가 발생하는 이유는 무엇입니까? 그것을 막는 방법?

답변

2

각 토픽 파티션에는 클라이언트의 모든 읽기/쓰기 요청을 처리하는 리더 브로커가 있습니다 (복제가 1보다 큰 경우이 파티션에 대한 리더 브로커의 데이터 만 복사하는 다중 팔로워 중개자이지만, 클라이언트로부터의 모든 읽기/쓰기 요청을 제공). 클라이언트를 시작할 때 클라이언트는 클러스터를 쿼리하여 읽기/쓰기가 필요한 각 파티션의 리더를 가져오고이 메타 데이터를 캐시합니다.

여러 가지 이유로 토픽 파티션의 리더십이 한 브로커에서 다른 브로커로 이동하게됩니다 (예를 들어, 브로커가 다운되었을 때 복구되지 않을 수도 있습니다). 지도자는 더 이상 리더가 아니지만 추종자가 될 필요가 없기 때문에 리더쉽을 이전하거나 관리 명령이 발행되면 파티션을 다른 브로커로 옮길 수 있습니다.

이 경우 클라이언트의 메타 데이터가 더 이상 올바르지 않으며 해당 예외가 발생합니다. 따라서 클라이언트 관점에서 볼 때 이러한 일이 발생하는 것을 막을 수는 없습니다. 그러나 새로운 리더를 재발견 할 수있는 새로운 클라이언트 인스턴스를 만들면 앱이 다시 시작될 수 있습니다.

관련 문제