Producer가 메시지를 만들어 보내는 과정이 음악을 연주하는 쪽이라면,

Consumer는 그 음악을 받아 자기 방식대로 다시 해석하는 쪽이다.

Kafka에서 Consumer는 단순히 "메시지를 가져오는 역할" 정도가 아니다.

그들의 움직임은 전체 시스템의 병렬성, 안정성, 처리 속도와 직결된다.

이번 글에서는 Consumer가 메시지를 읽어가는 흐름을 차근히 따라가며,

그 과정에서 일어나는 Rebalance, Offset 관리, Partition 할당 전략처럼

Kafka를 실제로 운영할 때 중요한 개념들을 자연스럽게 정리해본다.


Consumer의 세계는 결국 “오프셋(Offset)”에서 시작된다

Kafka의 Consumer는 “지금 어디까지 읽었는가”라는 질문에서 시작한다.

이 정보가 없다면 Consumer는 매번 처음부터 다시 읽어야 하고,

Kafka는 그냥 거대한 로그 파일에 지나지 않게 된다.

Kafka는 이 정보를 직접 브로커에 저장하며

이 기록들은 __consumer_offsets라는 내부 토픽에 보관된다.

덕분에 Consumer는 중단되었다 재시작해도

자연스럽게 이어서 읽을 수 있다.

아래는 Consumer가 Offset을 어떻게 바라보는지 단순하게 그려본 모습이다.

flowchart LR
    A["Partition<br/>0"] --> B["Offset 0<br/>메시지 A"]
    B --> C["Offset 1<br/>메시지 B"]
    C --> D["Offset 2<br/>메시지 C"]
    D --> E["Offset 3<br/>메시지 D"]
    style C fill:#d8f1ff,stroke:#5aa4d6,stroke-width:2px
    F["Consumer<br/>현재 읽는 위치 = Offset 2"] --> C

Consumer는 결국 이 “위치”를 움직여가며 메시지를 읽는 존재다. 이 위치를 얼마나 자주, 어떤 방식으로 저장하느냐가 실전 운영에서 큰 차이를 만든다.

Consumer Group — 혼자 일하는 듯하지만 혼자가 아니다