Spring Cloudstream Kafka를 사용중, 종종 아래와 같은 INFO 로그를 보게 되었다.
Found no committed offset for partition [topic name-partition]
처음에는 INFO 로그이기에 대수롭지 않게 넘겼는데, 이후 consumer에서 이해가 가지 않는 상황들이 발생하며 해당 로그를 다시 들여다보게되었다. consumer가 한번씩 이미 consuming한 record를 다시 처음부터 consuming하고있는 상황이었다.
그로 인해 구글링을 해본 결과 아래의 두 article을 발견했고 실마리를 찾았다.
Kafka offset은 broker가 관리하게 된다. (0.8.x까지는 Zookeeper가 관리하였으나, 0.9부터 변경되었다), Kafka broker에는 offsets.retention.minutes 이라는 property가 있는데, 이것은 consumer offset을 얼마나 저장할지를 나타낸다. default값은 Kafka 1.x에서는 1440, 즉 24시간이고, Kafka 2.x에서는 7일이다.
이 property로 인해서, 새로운 record가 들어오지 않은 상태에서 offsets.retention.minutes만큼의 시간이 경과하고 나면 consumer offset이 리셋되고, consumer는 auto.offset.reset에 명시된 곳으로 다시 offset을 설정하게 된다. 우리의 경우 해당 값은 earliest였고, 그로 인해 데이터가 자주 들어오지 않는 개발 장비에서 계속해서 offset이 리셋되어 처음부터 다시 consuming하게 된 것이다.
해결책으로는, 간단하게 auto.offset.reset값을 earliest -> latest로 변경해주었다.
하지만, producer가 동작하는 도중 consumer가 오랜 시간 내려가있는 일이 잦다면, 이는 consumer가 latest 이전의 unconsumed record를 consuming할 수 없게 되기 때문에(Reference 2번 참고), 서비스 요구사항에 맞는 설정이 필요할듯하다 🙂
Kafka의 기본 개념과 consumer의 offmset management에 대한 더 자세한 내용은 아래 링크를 참고 ⬇️
References
1. http://www.yunsobi.com/blog/666
2. https://medium.com/@praveenganesh/apache-kafka-consumer-group-offset-retention-bfe21285033a
'Kafka' 카테고리의 다른 글
Apache Kafka 기본 개념 (Partition / Consumer / Consumer Group/ Offset Management) (1) | 2021.01.19 |
---|