사내에서 Kafka 클러스터를 구축하여 사용하던 중 특수한 현상을 발견하였다.
일정 시간이 지난 후 프로듀서에서 메시지를 발행을 하는데 새롭게 발행하는 첫 번째 메시지만 발행 시간이 상대적으로 오래 걸린다는 점을 알게 되었다.
첫 메시지 발행 시간이 오래 걸릴 때는 초단위까지 나오고 후속 메시지는 10ms 미만의 메시지가 발행되는 것을 확인하였고, 이와 관련된 정보를 찾아보았다.
https://stackoverflow.com/questions/64228639/why-kafka-producer-is-very-slow-on-first-message
위 스택오버 플로우의 글을 토대로 말하자면, Producer에서 send 메서드를 호출할 때, 캐싱된 토픽의 파티션 메타데이터를 참고하게 되는데 캐싱된 데이터가 없다면, 첫 메시지 발행 때 메타데이터를 가져오기 때문에 메시지 발행에 시간이 오래 걸린다는 것이었다.
애플리케이션이 초기에 구동할 때, 메타데이터를 캐싱하기 위해 가져오지만, 설정 값에 따라서 특정 시간이 지나면 메타데이터를 비우고 다시 가져오도록 되어 있기 때문에, 이와 같은 현상이 발생한 것이었다.
관련 옵션
https://kafka.apache.org/documentation/#producerconfigs
위 사이트에서 Kafka Producer 부분의 Config를 볼 수 있다.
아래 목록은 메타데이터 관련 옵션들이다.
1. metadata.max.age.ms
: Default는 5분(300,000 ms)이며, 리더 파티션 변경이 없더라도 새로운 브로커나 파티션을 발견하기 위하여 메타데이터를 가져오도록 하는 시간
2. metadata.max.idle.ms
: Default는 5분(300,000 ms)이며, Idle 상태 토픽에 존재하는 메타데이터를 프로듀서가 캐시 하는 시간을 의미.
토픽 생성 후 유휴 상태가 되고, 해당 시간을 초과하면 토픽의 메타데이터는 제거되고, 다음 접근 시 메타데이터를 가져오게 된다.
위 옵션들은 메타데이터의 갱신과 관련된 부분이기 때문에, 프로듀서가 초기화되며 발생하는 지연에 대한 해결책이라고 볼 수는 없다.
결론
Github 이슈를 참고하자면 Confluent사의 kafka에는 topic.metadata.refresh.interval.ms라는 옵션이 있는데, 이 또한 메타데이터의 업데이트 주기에 관한 옵션(구 버전의 Apache Kafka에는 존재하였으나 제거됨)이라서 메타데이터 요청에 관한 근본적인 해결책이라고 볼 수 없다.
https://github.com/confluentinc/confluent-kafka-dotnet/issues/701
프로듀서의 메시지 발행 지연의 원인을 파악했으나 정확한 해결방법이 아직 존재하지 않고, 개인의 상황에 맞는 옵션 값과 조치를 연구해봐야 할 것으로 보인다.
'Data > Kafka' 카테고리의 다른 글
[Kafka] Kafka가 빠른 이유 (0) | 2024.04.19 |
---|---|
[Kafka] 멱등성/At least once/At most once/Exactly once (0) | 2023.07.01 |
[Kafka] Kafka란? (0) | 2023.04.28 |