Kafka에서 Consumer를 구성하고 실행하면, 다양한 Exception 상황을 맞이합니다.
그중에서 BufferUnderflowException, IllegalStateException 오류를 알아보겠습니다.
아래는 오류 중에 일부를 요약한 내용입니다.
[org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer] 0 0 - Consumer exception org.springframework.kafka.KafkaException: Seek to current after exception; nested exception is java.nio.BufferUnderflowException Caused by: java.nio.BufferUnderflowException: null [org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer] 0 0 - Consumer exception org.springframework.kafka.KafkaException: Seek to current after exception; nested exception is java.lang.IllegalStateException: There are no in-flight requests for node 0 Caused by: java.lang.IllegalStateException: There are no in-flight requests for node 0
원인은 다양하지만, 보통 Kafka 서버의 포트 문제인 경우가 많습니다.
특히 로컬에서 개발을 위해 Kafka 서버를 구동하는 경우, 여러 포트간 충돌이 발생합니다.
사실 서버나 클라우드 환경에서는 포트 충돌이 일어날 확률이 높지 않습니다.
보통은 Kafka 단독으로 세팅하기 때문입니다.
그리고 일부 Topic, Consumer Group, Offset 등도 문제가 됩니다.
일부긴 하지만 Topic에 문제가 있는 경우가 있습니다.
그래서 해당 Topic을 삭제하고 다시 생성해 줍니다.
Group 역시 다른 이름으로 재지정 해서 테스트 해봅니다.
SpringBoot에서 내장 Tomcat의 기본 포트는 8080입니다.
그런데 Zookeeper 서버의 기본 포트 역시 8080입니다.
둘 중 하나의 포트를 변경해 줍니다.
Kafka 서버의 기본 포트는 9092입니다.
만약 해당 포트를 다른 프로그램에서 사용 중이라면 오류가 발생합니다.
마찬가지로 둘 중 하나의 포트를 변경해 줍니다.
참고로 9092는 SonarQube가 사용하는 Embeded H2 포트입니다.
Kafka를 실행하기 위해서는 8080, 9092 포트를 허용해야 합니다.
하지만 방화벽이나 바이러스 프로그램에서 해당 포트를 허용하지 않으면 오류가 발생합니다.
일단 방화벽과 바이러스 프로그램을 끄고 테스트 해봅니다.
정상 처리 된다면 해당 포트만 허용하는 설정을 진행합니다.