오프셋(Offset)

CosmoNumb·2024년 8월 20일
0

MSA

목록 보기
13/13

Apache Kafka에서 오프셋(Offset)은 Kafka에서 메시지를 추적하고 관리하는 핵심 개념 중 하나입니다. 오프셋은 Kafka 파티션 내에서 메시지의 고유한 위치를 나타내는 숫자입니다. 이를 통해 Kafka는 메시지의 순서를 관리하고, 각 메시지가 정확히 어디에 위치하는지, 소비자가 어디까지 메시지를 처리했는지를 알 수 있습니다.

1. Kafka의 기본 구조

Kafka는 데이터를 토픽(Topic)에 저장합니다. 각 토픽은 여러 개의 파티션(Partition)으로 나누어질 수 있으며, 파티션은 데이터를 순서대로 저장하는 로그 파일처럼 동작합니다.

  • 토픽(Topic): 메시지 스트림의 카테고리나 이름입니다. 예를 들어, "user_signups"라는 토픽은 모든 사용자 가입 이벤트를 포함할 수 있습니다.
  • 파티션(Partition): 토픽이 나뉘는 부분으로, 각 파티션은 메시지의 순서를 보장합니다. 파티션은 여러 서버에 분산되어 저장될 수 있습니다.
  • 오프셋(Offset): 각 파티션에서 메시지의 고유한 위치를 나타내는 숫자입니다. 새로운 메시지가 파티션에 추가될 때마다 오프셋이 증가합니다.

2. 오프셋의 역할

  • 메시지 추적: 오프셋은 Kafka가 각 파티션 내에서 메시지를 순차적으로 추적할 수 있도록 합니다. 메시지가 파티션에 기록될 때마다 오프셋은 0부터 시작하여 1씩 증가합니다.

  • 소비자 위치 관리: Kafka의 소비자(Consumer)는 오프셋을 사용하여 어디까지 메시지를 처리했는지를 추적합니다. 소비자는 마지막으로 처리한 메시지의 오프셋을 기억하고, 다음 오프셋부터 메시지를 처리하기 시작합니다.

  • 재처리: 소비자는 오프셋을 조정하여 이전에 처리한 메시지를 다시 읽고 처리할 수 있습니다. 이를 통해 메시지 재처리나 장애 복구를 할 수 있습니다.

3. 오프셋 관리

Kafka의 소비자는 메시지를 처리할 때, 현재 처리한 오프셋을 Kafka에 커밋(commit)합니다. 이 커밋된 오프셋은 소비자가 다음에 읽을 위치를 결정하는 데 사용됩니다.

자동 커밋 (Auto Commit)

  • Kafka는 소비자가 메시지를 처리할 때 자동으로 오프셋을 커밋할 수 있습니다. 기본적으로 enable.auto.commit=true로 설정되어 있으며, 이는 소비자가 메시지를 처리하면 오프셋을 자동으로 커밋합니다.
  • 자동 커밋의 경우, 메시지를 소비한 즉시 오프셋이 커밋되므로, 실패한 경우 메시지를 다시 처리하기 어려울 수 있습니다.

수동 커밋 (Manual Commit)

  • 수동 커밋은 소비자가 명시적으로 오프셋을 커밋하는 방식입니다. 소비자가 메시지를 성공적으로 처리한 후에 오프셋을 커밋할 수 있으므로, 실패 시 동일한 메시지를 다시 처리할 수 있는 유연성을 제공합니다.

  • 수동 커밋을 사용하려면 enable.auto.commit=false로 설정하고, commitSync() 또는 commitAsync() 메서드를 사용하여 오프셋을 커밋합니다.

    consumer.commitSync();  // 동기적으로 오프셋 커밋
    consumer.commitAsync(); // 비동기적으로 오프셋 커밋

4. 오프셋의 사용 예시

  • 처리 확인: 소비자가 메시지를 처리한 후 오프셋을 커밋하여 처리된 위치를 Kafka에 기록합니다. 이후, 소비자가 재시작되거나 장애가 발생해도 마지막 커밋된 오프셋부터 메시지를 다시 처리할 수 있습니다.

  • 재처리: 소비자가 오프셋을 조정하여 특정 시점의 메시지부터 다시 읽을 수 있습니다. 예를 들어, 특정 장애나 오류로 인해 메시지를 재처리해야 할 경우, 오프셋을 해당 시점으로 설정하여 재처리할 수 있습니다.

    consumer.seek(new TopicPartition("my_topic", 0), 100L);  // 파티션 0의 오프셋 100부터 시작

5. 결론

Kafka 오프셋은 Kafka 파티션 내에서 메시지의 위치를 나타내는 중요한 개념으로, 메시지의 순서 추적, 소비자의 메시지 처리 상태 관리, 메시지 재처리 등에 사용됩니다. 오프셋을 적절하게 관리함으로써 메시지 처리의 정확성과 신뢰성을 유지할 수 있으며, 대규모 데이터 스트리밍 애플리케이션에서 중요한 역할을 합니다.

Kafka를 사용하는 시스템에서는 오프셋 관리가 매우 중요하며, 이를 통해 메시지의 처리 상태를 추적하고, 오류나 장애 발생 시에도 데이터 일관성을 유지할 수 있습니다.

0개의 댓글