'Development/Kafka'에 해당되는 글 1건

 

 

Kafka를 처음 사용하다보면 신경써야할 부분 중 하나로 Offset 관리가 있다.

 

Offset은 아래 그림과 같이 Producer가 메시지를 Write하면 Partition 별로 Offset이 증가한다.

 

 

여기서 주의할 점은 메시지가 언제까지나 Broker 내 쌓여있지 않는 다는 점이다.

 

'delete.retention.ms' 설정에 따라 메시지의 Delete Tombstone Marker를 유지하는 시간이 결정된다.

 

The amount of time to retain delete tombstone markers for log compacted topics. This setting also gives a bound on the time in which a consumer must complete a read if they begin from offset 0 to ensure that they get a valid snapshot of the final stage (otherwise delete tombstones may be collected before they complete their scan).

 

당연히, 다양한 관련 설정이 존재하지만 이 시간이 지나면 메시지가 삭제된다.

 

이제 문제점이 발생한다. 바로 Commit이다.

 

본래는 Offset 관련 예외 상황이 발생하는 경우 auto.offset.reset 설정에 따라 자동으로 Last Commit 위치를 복구한다.

 

What to do when there is no initial offset in Kafka or if the current offset does not exist any more on the server (e.g. because that data has been deleted):

- earliest: automatically reset the offset to the earliest offset

- latest: automatically reset the offset to the latest offset (default)

- none: throw exception to the consumer if no previous offset is found for the consumer's group

- anything else: throw exception to the consumer.

 

그런데 어떤 Consumer의 Last Commit Offset이 만약 더이상 갱신되지 않고 Retention 정책에 따라 삭제된다면

 

Consumer API를 사용할 때 OffsetOutOfRangeException이 발생할 것이다.

 

이런 경우 'enable.auto.commit'을 활성화하여 가장 최근의 Offset으로 Commit을 수행하거나,

 

If true the consumer's offset will be periodically committed in the background.

 

아직 Retention 상태인 Latest Offset으로 Commit을 수동으로 수행해줘야 한다.

 

 

참조: Apache Kafka

 

블로그 이미지

나뷜나뷜

,