4.5. 오프셋을 커밋할 때 데이터 손실 또는 복제 방지
Kafka 자동 커밋 메커니즘을 사용하면 소비자가 메시지 오프셋을 자동으로 커밋할 수 있습니다. 활성화하면 소비자는 브로커 폴링에서 5000ms 간격으로 수신된 오프셋을 커밋합니다.
자동 커밋 메커니즘은 편리하지만 데이터 손실 및 복제 위험이 있습니다. 소비자가 여러 메시지를 가져와서 변환했지만 시스템이 자동 커밋을 수행할 때 소비자 버퍼에서 처리된 메시지와 충돌하면 해당 데이터가 손실됩니다. 메시지를 처리한 후 시스템이 충돌하지만 자동 커밋을 수행하기 전에 시스템이 재조정 후 다른 소비자 인스턴스에서 데이터가 복제됩니다.
자동 커밋은 브로커에 대한 다음 폴링 전에 모든 메시지가 처리되거나 소비자가 종료될 때만 데이터 손실을 방지할 수 있습니다.
데이터 손실 또는 복제 가능성을 최소화하기 위해 enable.auto.commit 을 false 로 설정하고 클라이언트 애플리케이션을 개발하여 오프셋 커밋을 더 잘 제어할 수 있습니다. 또는 auto.commit.interval.ms 를 사용하여 커밋 간 간격을 줄일 수 있습니다.
# ...
enable.auto.commit=false 1
# ...- 1
- 자동 커밋은 커밋 오프셋에 대한 더 많은 제어를 제공하기 위해 false로 설정됩니다.
enable.auto.commit 을 false 로 설정하여 모든 처리가 수행되고 메시지가 사용된 후 오프셋을 커밋할 수 있습니다. 예를 들어 Kafka 커밋Sync 및 커밋 API를 호출하도록 애플리케이션을 설정할 수 있습니다.
commit Async
commitSync API는 폴링에서 반환된 메시지 일괄 처리에 오프셋을 커밋합니다. 일괄 처리의 모든 메시지 처리가 완료되면 API를 호출합니다. commitSync API를 사용하는 경우 일괄 처리의 마지막 오프셋이 커밋될 때까지 애플리케이션은 새 메시지를 폴링하지 않습니다. 이로 인해 처리량에 부정적인 영향을 미치는 경우 자주 커밋하거나 commitAsync API를 사용할 수 있습니다. commitAsync API는 브로커가 커밋 요청에 응답할 때까지 기다리지 않지만 재조정할 때 더 많은 중복이 발생할 위험이 있습니다. 일반적인 접근 방식은 소비자를 종료하거나 재조정하기 전에 사용되는 commitSync API와 함께 애플리케이션에서 커밋 API를 결합하는 것입니다.
4.5.1. 트랜잭션 메시지 제어
생산자 측에서 트랜잭션 ID와 idempotence(enable.idempotence=true)를 사용하여 정확히 한 번 제공을 보장하는 것이 좋습니다. 그런 다음 소비자 측에서 isolation.level 속성을 사용하여 소비자가 트랜잭션 메시지를 읽는 방법을 제어할 수 있습니다.
isolation.level 속성에는 두 가지 유효한 값이 있습니다.
-
read_committed -
read_uncommitted(기본값)
커밋된 트랜잭션 메시지만 소비자가 읽을 수 있도록 read_committed 를 사용합니다. 그러나 이는 소비자가 브로커가 트랜잭션 결과를 기록하는 트랜잭션 마커를 작성할 때까지 메시지를 반환할 수 없기 때문에 엔드 투 엔드 대기 시간이 증가합니다.
# ...
enable.auto.commit=false
isolation.level=read_committed 1
# ...- 1
- 사용자가 커밋한 메시지만 읽도록
read_committed로 설정합니다.