Kafka 컨슈머 설정: 읽기와 오프셋 다루기
Kafka 컨슈머 설정: 읽기와 오프셋 다루기
Kafka 컨슈머는 토픽의 이벤트를 구독해 읽고 처리하는 클라이언트예요. 프로듀서와 달리 "어디까지 읽었는지"를 오프셋으로 추적해야 해요. 이 페이지에서는 컨슈머가 제일 자주 만지는 설정들을 중심으로 흐름을 짚어볼게요.
연결과 역직렬화
프로듀서와 마찬가지로 bootstrap.servers로 클러스터에 붙고, key.deserializer와 value.deserializer로 브로커에서 받은 바이트를 다시 객체로 되돌려요. 역직렬화는 org.apache.kafka.common.serialization.Deserializer 인터페이스를 구현한 클래스를 쓰는 식이에요.
bootstrap.servers=broker1:9092,broker2:9092
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
컨슈머 그룹과 하트비트
group.id는 이 컨슈머가 속한 컨슈머 그룹을 식별하는 고유 문자열이에요. subscribe(topic)으로 그룹 관리 기능을 쓰거나, Kafka 기반 오프셋 관리 전략을 쓰려면 이 값이 필수예요.
group.protocol은 컨슈머가 쓰는 그룹 프로토콜로, classic 또는 consumer를 지원해요. 기본값은 classic이에요. classic일 때는 heartbeat.interval.ms로 컨슈머 코디네이터에 하트비트를 보내는 주기를 정해요. 하트비트는 컨슈머 세션이 살아 있는지 확인하고, 새 컨슈머가 그룹에 들어오거나 나갈 때 리밸런싱을 돕는 역할을 해요. 이 값은 반드시 session.timeout.ms보다 낮아야 하고, 보통 그 값의 1/3을 넘지 않게 잡아요.
group.id=orders-consumer-group
heartbeat.interval.ms=3000
session.timeout.ms=45000
group.protocol이 consumer면 하트비트 주기는 브로커가 group.consumer.heartbeat.interval.ms로 제어하므로 컨슈머 쪽 설정은 무시돼요.
페치 크기: 한 번에 얼마나 읽을까
fetch.min.bytes는 페치 요청에 대해 서버가 돌려줘야 하는 최소 데이터량이에요. 기본값(1바이트)은 요청 시점에 그만큼 데이터가 있거나 페치가 타임아웃될 때 즉시 응답하는 의미예요. 값을 키우면 데이터가 더 모일 때까지 기다려 서버 처리량은 올라가지만 지연이 조금 늘어날 수 있어요.
max.partition.fetch.bytes는 서버가 파티션 하나당 돌려줄 최대 데이터량이에요. 기본값은 1048576(1메비바이트)이에요. 페치의 첫 번째 논-빈 파티션의 첫 레코드 배치가 이 한계보다 크면, 컨슈머가 진행할 수 있도록 그 배치를 그대로 돌려줘요.
fetch.min.bytes=1
max.partition.fetch.bytes=1048576
더 알아보기
- 프로듀서 쪽 궁금증은 Producer Configs 문서를 보세요.
- 오프셋의 설계적 의미는 Kafka 설계 문서를 보세요.
- 컨슈머 그룹과 리밸런싱은 Core APIs 문서에서 다뤄요.