실시간 프로젝트 도중 발생했던 프로듀서 관련 이슈 해결에 대해서 적어본다.
타겟 카프카로 메세지를 보내는 도중 장애를 일으키는 상황을 테스트 중
타겟 카프카 브로커가 내려갔음에도 불구하고 에러상황을 캐치못하는 상황이 발생되었다.
모듈 점검을 하다보니 Producer Option이 모두 default 값으로 되어 있다보니 우리가 원하는 시간내에 장애를 캐치하지 못하는 상황이 발생한것이다.
처음에는 retries 옵션에 경우 레코드 send 후 에러발생 시 재시도하는 횟수를설정하는데 기본값이 2147483647로 되어있어 해당 값만 수정하게 되면 문제를 해결할 수 있을거라고 생각했지만 아니였다.
옵션을 찾아보니 재시도 횟수를 다채우지않아도 재시도를 멈추는 설정이 바로 delivery.timeout.ms 였다.
delivery.timeout.ms 레코드를 send 하고 성공/실패를 결정하는 시간에 옵션이다. 브로커로부터 ack를 받기 위해 대기하는 시간이며 실패 시 재전송에 대해서도 허용되는 시간이다. 복구할수 없는 에러가 발생하거나 재시도 횟수를 다 소모하게되면 delivery.timeout.ms 설정시간보다 적어도 에러를 발생할 수 있다.
그리하여 delivery.timeout.ms 옵션을 수정하게 되었는데 delivery.timeout.ms 는 request.timeout.ms / linger.ms 두 옵션에 값에 합보다 같거나 커야하는 규칙이 있다.
request.timeout.ms 옵션은 요청한 응답에 대해 클라이언트가 기다리는 최대 시간이다. 해당 시간동안 응답받지못하면 그시간동안은 재시도를 한다.
linger.ms 옵션은 메세지를 보내는데 있어서 약간의 딜레이를 주는 옵션이다.
그 이유는 브로커에게 주는 부하를 줄이기 위함이라고 보면된다.
delivery.timeout.ms /request.timeout.ms / linger.ms / retries 옵션을 수정하게 되어 이슈를 해결하게 되었다.
이미지 참조 : https://www.conduktor.io/kafka/kafka-producer-retries