이 가이드에서는 메시지 소비 진행 상황을 추적하는 데 중요한 Kafka 소비자 그룹 오프셋을 살펴봅니다. 각 소비자 그룹은 사용하는 각 파티션에 대한 오프셋을 유지하여 마지막으로 처리된 레코드를 나타냅니다. 이를 통해 소비자는 다시 시작한 후 올바른 위치에서 다시 시작할 수 있습니다.
소비자 그룹 오프셋은 Kafka 주제 파티션 내에서 소비자의 위치를 추적하는 간단한 숫자 식별자입니다. 각 파티션에는 모든 레코드에 대한 순차적 오프셋이 있습니다. 소비자 그룹은 이러한 오프셋을 사용하여 중단된 위치를 기억합니다. 예를 들어, 두 개의 파티션 주제(P1 및 P2)에서 읽는 소비자 그룹은 각각 P1 및 P2의 마지막 읽기 레코드를 나타내는 별도의 오프셋을 갖습니다.
오프셋 스토리지는 Kafka 자체 내에서 또는 외부 시스템(데이터베이스 또는 파일)에서 두 가지 방법으로 처리할 수 있습니다. 이 기사에서는 Kafka의 내부 오프셋 저장 메커니즘에 중점을 둡니다.
Kafka는 __consumer_offsets
이라는 특별한 내부 주제에 오프셋을 저장합니다. Kafka 클라이언트 라이브러리는 오프셋 저장 및 검색을 처리하므로 소비자가 다시 시작한 후 마지막으로 알려진 위치에서 원활하게 재개할 수 있습니다.
소비자에 대한 오프셋이 발견되지 않으면 auto.offset.reset
구성에 따라 소비자의 동작이 결정됩니다.
latest
(기본값): 소비자는 기존 메시지를 무시하고 주제의 끝부터 시작합니다.earliest
: 소비자는 주제의 처음부터 시작하여 사용 가능한 모든 메시지를 처리합니다.none
: 오프셋이 발견되지 않으면 예외가 발생합니다.자동 커밋은 오프셋을 Kafka에 주기적으로 커밋하여 오프셋 관리를 단순화합니다. 이는 기본적으로 5초마다 자동으로 발생합니다(enable.auto.commit
에 의해 제어됨). 편리하지만 데이터 손실 위험이 있습니다.
자동 커밋은 별도의 스레드에서 작동하기 때문에 진행 중인 기록 처리를 추적하지 않습니다. 처리가 완료되기 전에 소비자가 여러 레코드를 폴링하고 자동 커밋하는 경우 실패 시 데이터 손실이 발생할 수 있습니다.
수동 커밋을 통해 정확한 제어가 가능합니다. 자동 커밋(enable.auto.commit=false
)을 비활성화하면 레코드를 성공적으로 처리한 후 commitSync()
또는 commitAsync()
을 사용하여 오프셋을 명시적으로 커밋합니다. 이를 통해 데이터 손실을 방지할 수 있습니다.
<code class="language-java">while (true) { records = consumer.poll(timeout); // process records consumer.commitSync(); // or consumer.commitAsync() }</code>
자동 커밋은 다음과 같은 애플리케이션에 적합합니다.
그렇지 않은 경우 수동 커밋을 권장합니다.
수동 커밋은 동기(commitSync()
) 및 비동기(commitAsync()
) 옵션을 제공합니다. commitSync()
커밋이 확인될 때까지 차단하여 지속성을 보장하지만 성능에 영향을 미칩니다. commitAsync()
은 비차단이지만 잠재적인 예외를 처리해야 합니다.
소비자 그룹 오프셋은 안정적인 Kafka 사용을 위한 기본입니다. 자동 커밋은 작업을 단순화하는 반면, 수동 커밋은 더 큰 제어력과 데이터 안전성을 제공합니다. 동기식 커밋과 비동기식 커밋 사이의 선택은 애플리케이션의 요구 사항, 성능과 안정성의 균형에 따라 달라집니다. 강력하고 내결함성이 있는 Kafka 애플리케이션을 구축하려면 이러한 메커니즘을 이해하는 것이 중요합니다.
Coding Harbour에서 제공되는 무료 Kafka 미니 강좌를 살펴보세요.
사진 출처: @kencheungphoto
위 내용은 Kafka Consumer - 커밋 소비자 그룹 오프셋의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!