컨슈머 기본 동작 및 주요 옵션
컨슈머 기본 동작과 주요 옵션에 대해 설명
Categories:
개요
컨슈머는 카프카 토픽에 저장된 메시지를 읽어가는 역할을 담당합니다. 단순히 데이터를 가져오는 것에 그치지 않고, 내부적으로는 컨슈머 그룹 구성, 파티션 할당, 리밸런싱 같은 동작을 함께 수행합니다.
핵심 내용
기본 동작
프로듀서가 카프카의 토픽으로 메시지를 전송하면 해당 메시지들은 브로커들의 로컬 디스크에 저장되며 컨슈머를 이용해 토픽에 저장된 메시지를 가져올 수 있음.
컨슈머 그룹은 하나 이상의 컨슈머들이 모여 있는 그룹을 의미하고, 컨슈머는 반드시 컨슈머 그룹에 속하게 됨. 그리고 컨슈머 그룹은 각 파티션의 리더에게 카프카 토픽에 저장된 메시지를 가져오기 위한 요청을 보냄.
이때 파티션 수와 컨슈머 수(하나의 컨슈머 그룹 안에 있는 컨슈머 수)는 1:1로 매핑되는 것이 이상적 임.
주의: 파티션 수와 컨슈머 수의 비율을 반드시 1:1로 매핑해야 하는 것은 아니지만, 파티션 수보다 더 많다고 해서 더 빠르게 토픽의 메시지를 가져오거나 처리량이 높아지는 것이 아니라 더 많은 수의 컨슈머들이 대기 상태로 존재하기 때문.
컨슈머 주요 옵션
| Consumer Option | Description |
|---|---|
| bootstrap.servers | 프로듀서와 동일하게 브로커의 정보를 입력. |
| fetch.min.bytes | 한 번에 가져올 수 있는 최소 데이터 크기. 지정한 크기보다 작은 경우, 요청에 응답하지 않고 데이터가 누적될 때까지 대기. |
| group.id | 컨슈머가 속한 컨슈머 그룹을 식별하는 식별자. 동일한 그룹 내의 컨슈머 정보는 모두 공유 됨. |
| heartbeat.interval.ms | 하트 비트가 있다는 것은 컨슈머의 상태가 active임을 의미. session.timeout.ms와 밀접한 관계가 있으며, session.timeout.ms보다 낮은 값으로 설정해야 함. 일반적으로 session.timeout.ms의 1/3로 설정. |
| max.partition.fetch.bytes | 파티션 당 가져올 수 있는 최대 크기 |
| session.timeout.ms | 이 옵션을 이용해, 컨슈머가 종료된 것인지를 판단. 컨슈머는 주기적으로 하트 비트를 보내야 하고, 만약 이 시간 전까지 하트 비트를 보내지 않았다면 해당 컨슈머는 종료된 것으로 간주하고 컨슈머 그룹에서 제외 후, 리밸런싱을 시작 함. |
| enable.auto.commit | 백그라운드로 주기적으로 오프셋을 커밋 |
| auto.offset.reset | 카프카에서 초기 오프셋이 없거나 현재 오프셋이 더 이상 존재하지 않는 경우에 다음 옵션으로 reset 함.
|
| fetch.max.bytes | 한 번의 가져오기 요청으로 가져올 수 있는 최대 크기 |
| group.instance.id | 컨슈머의 고유 식별자. 만약 설정한다면 static 멤버로 간주되어, 불필요한 리밸런싱을 하지 않음. |
| isolation.level | 트랜잭션 컨슈머에서 사용되는 옵션.
|
| max.poll.records | 한 번의 poll() 요청으로 가져오는 최대 메시지 수. |
| partition.assignment.strategy | 파티션 할당 전략.(Default : range) |
| fetch.max.wait.ms | fetch.min.bytes에 의해 설정된 데이터보다 적은 경우 요청에 대한 응답을 기다리는 최대 시간. |
정리
컨슈머는 단순 조회 클라이언트가 아니라 컨슈머 그룹과 파티션 할당 전략 위에서 동작하는 구성 요소입니다. 따라서 운영 시에는 group.id, session.timeout.ms, heartbeat.interval.ms, auto.offset.reset 같은 옵션을 함께 보며 처리량과 안정성을 조정하는 접근이 필요합니다.