카프카의 설정은 진짜일까?? - offset(1)

반응형

원래 시나리오대로면, producer를 전부 끝내고 나서 consumer를 학습하려고 하였지만 살짝 우회하기로 결정하였습니다. 그 이유가 뭐냐면 카프카의 주요 특징중 하나가 offset으로 알고 있습니다. 제가 알기로 offset은 카프카(브로커)에서 값을 읽을때 특정 부분까지 읽도록 하는걸로 알고 있습니다. 물론 이게 틀린내용일 수 도 있지만, 뭐 상관없습니다. 다시 제대로 학습하면 되는거니까요. 시작해봅시다.

그래서 offset이 뭐냐면..

offset은 메시지의 위치를 나타내는 번호입니다. kafkasms 메시지를 다음과 같이 저장합니다.

[0] [1] [2] [3] [4] ...

여기서 숫자가 바로 offset입니다. 즉, kafka는 메시지를 순서대로 쌓고, index처럼 offset을 붙입니다.
또한, kafka는 메시지를 삭제하지 않습니다. 대신 어디까지 읽었는지만 관리합니다.

그렇다면, offset은 어떻게 관리가 되어질까요?

offset은 기본적으로 kafka에서 관리하지만, 언제 기록할지는 consumer가 결정하게 됩니다.

그림을 이렇게 그릴 수 있습니다. kafka의 구조를 이해할 때, kafka는 곧 broker라고 볼 수 있습니다.
즉, kafka는 메시지를 저장하고 관리하는 서버 역할을 수행합니다.

따라서 kafka를 이야기할 때는 단일 애플리케이션이라기보다는 메시지를 저장하는 Broker의 집합으로 이해하는 것이 더 적절합니다.
반면에 producer와 consumer는 kafka 내부에 포함된 요소가 아니라, kafka와 통신하는 별도의 애플리케이션입니다.

  • producer는 메시지를 kafka로 전송하는 역할을 하고
  • consumer는 kafka에 저장된 메시지를 읽어가는 역할을 합니다

정리하면, kafka는 데이터를 저장하는 broker이고,
producer와 consumer는 그 데이터를 주고받기 위해 kafka와 상호작용하는 외부 애플리케이션이라고 볼 수 있습니다.

하지만 여기서 한 가지 이상한 점이 있습니다. offset은 kafka에서 메시지를 순서대로 저장하면서,
각 메시지에 index처럼 붙는 값이라고 알고 있습니다. 즉, broker가 관리하는 값이라고 볼 수 있습니다.
그런데 실제로 동작을 살펴보면, offset의 흐름은 오히려 consumer가 주도하는 것처럼 느껴집니다.

  • 어디까지 읽을지 결정하는 것도 consumer이고
  • 언제 offset을 기록할지도 consumer가 결정합니다

이쯤 되면 자연스럽게 이런 의문이 생깁니다.
offset은 kafka(Broker)의 것일까요, 아니면 consumer의 것일까요?

핵심은 소유가 아니라 역할 분리입니다

이 질문의 답은 둘 중 하나가 아니라, 역할이 나뉘어 있다고 보는 것이 더 정확합니다.

  • offset 자체는 broker에 저장됩니다
  • 하지만 offset을 언제, 어디까지 올릴지는 consumer가 결정합니다

즉, offset은 kafka가 보관하고, consumer가 정의하는 값입니다.

좋습니다. consumer가 offset을 정의한다고 하였는데 왜 정의를 하는걸까요? 이미 broker에 순서가 저장이 되었는데 말이죠.
broker에서 메시지를 순서대로 쌓고 offset을 붙입니다. 여기까지는 데이터를 저장하는 역할입니다.
하지만 여기에는 한 가지 중요한 정보가 빠져잇습니다. 이 메시지는 처리가 되었는가 라는 정보입니다.

핵심은 다음과 같이 정리할 수 있습니다. broker는 메시지를 저장하는 역할을 하고,
consumer는 해당 메시지를 실제로 처리하는 역할을 수행합니다.
이 둘은 단순히 데이터를 주고받는 관계가 아니라, "저장"과 "처리"라는 서로 다른 책임을 가진 구조입니다.
그렇다면 consumer는 메시지를 수신한 이후, 자신의 처리 상태를 broker에게 알려줄 필요가 있습니다.

왜냐하면 broker는 메시지를 쌓아두기만 할 뿐, 해당 메시지가 실제로 처리되었는지에 대해서는 알 수 없기 때문입니다.
따라서 consumer는 다음과 같이 동작합니다. "나는 이 메시지들(offset 기준)을 이미 처리했습니다."
이 정보를 Broker에 전달하는 행위가 바로 offset commit입니다.

그렇다면, 저장과 처리를 구분하는 이유가 무엇일까요?

그 이유는 앞서 말했듯이, broker와 consumer가 서로 다른 애플리케이션으로 동작하기 때문입니다.

broker는 메시지를 저장하고 offset을 부여하는 역할만 수행합니다. 하지만 해당 메시지가 실제로 사용되었는지,
즉 처리되었는지 여부는 알 수 없습니다. 이 말은 곧, 이런 상황을 의미합니다.
broker는 메시지를 전달할 수는 있지만, 그 메시지가 성공적으로 처리되었는지는 책임지지 않는습니다.
따라서 Consumer는 단순히 메시지를 읽는 것에서 끝나는 것이 아니라, 자신이 어디까지 처리했는지를 명확하게 알려줄 필요가 있습니다.

즉, "나는 여기까지(offset 기준) 처리 완료했습니다" 라는 상태를 Broker에 전달해야 합니다.
이 과정을 통해서만 kafka는 이후에 어디부터 다시 읽어야 하는지를 판단할 수 있습니다.


이 행위를 offset을 commit한다고 표현합니다. 즉, consumer가 처리한 위치를 기록하여 이후에는 해당 지점 이후부터 메시지를 읽을 수 있도록 만드는 과정입니다. 다음 시간에는 offset이 Broker에 실제로 어떻게 저장되는지,그리고 offset commit이 어떤 방식으로 이루어지는지 이 두 가지를 중심으로 살펴보도록 하겠습니다.

반응형

'개발' 카테고리의 다른 글

batch - step,job  (0) 2026.04.10
Batch - processor, writer  (0) 2026.04.09
Batch- Reader  (0) 2026.04.07
인덱스 정리  (1) 2026.04.06
배치는 언제 사용이 되어질까?  (0) 2026.04.04

댓글

Designed by JB FACTORY