Kafka 컨슈머 설정: 읽기와 오프셋 다루기

Kafka 컨슈머 설정: 읽기와 오프셋 다루기

Kafka 컨슈머는 토픽의 이벤트를 구독해 읽고 처리하는 클라이언트예요. 프로듀서와 달리 "어디까지 읽었는지"를 오프셋으로 추적해야 해요. 이 페이지에서는 컨슈머가 제일 자주 만지는 설정들을 중심으로 흐름을 짚어볼게요.

출처: Apache Kafka — Consumer Configs

연결과 역직렬화

프로듀서와 마찬가지로 bootstrap.servers로 클러스터에 붙고, key.deserializervalue.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.protocolconsumer면 하트비트 주기는 브로커가 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 문서에서 다뤄요.