Apache Kafka - 프로듀서 최적화: 메시지 압축과 배칭 전략

이건·2025년 5월 6일

Kafka

목록 보기
14/18

메시지 압축과 배칭 전략을 적절히 활용하면 네트워크 대역폭을 절약하고, 처리량을 증가시키며, 디스크 사용량을 줄일 수 있다.


메시지 압축(Message Compression)의 이해

압축의 필요성과 이점

프로듀서가 Kafka에 데이터를 전송할 때 일반적으로 텍스트 형식(예: JSON)으로 전송한다. 이러한 데이터를 압축하면 다음과 같은 이점이 있다:

  • 네트워크 대역폭 절약: 압축된 메시지는 크기가 작아 전송 속도가 빨라짐
  • 디스크 공간 절약: 브로커에 저장되는 데이터 크기가 줄어듬
  • 처리량 증가: 더 작은 크기의 데이터를 더 빠르게 전송할 수 있음
  • 지연 시간 감소: 네트워크 전송 시간이 줄어듬

압축 유형(compression.type)

Kafka에서 지원하는 압축 알고리즘은 다음과 같다:

압축 유형압축률CPU 사용량압축 속도네트워크 대역폭 사용량
none (기본값)없음없음해당 없음가장 높음
gzip가장 높음가장 높음가장 느림가장 낮음
snappy중간중간중간중간
lz4낮음가장 낮음가장 빠름높음
zstd (Kafka 2.1+)중간중간중간중간
  • 메시지가 텍스트(로그 텍스트, JSON 문서)라면 snappy는 CPU 사용량과 압축률의 균형이 좋기 때문에 아주 유용하다.

압축 작동 방식

압축은 다음과 같이 작동한다:

  1. 프로듀서가 메시지 배치(예: 100개 메시지)를 생성한다.
  2. 압축이 활성화되면 이 배치가 압축된다.
  3. 압축된 배치는 원래 크기보다 훨씬 작아진다(경우에 따라 1/4 수준).
  4. 압축된 배치가 Kafka 브로커로 전송된다.
  5. 브로커는 설정에 따라 이를 그대로 저장하거나 재압축한다.
  6. 컨슈머는 메시지를 읽을 때 압축을 해제한다.

프로듀서 압축 vs 브로커 압축

압축은 두 가지 레벨에서 설정할 수 있다:

  1. 프로듀서 레벨: 프로듀서 설정에서 compression.type 속성으로 지정
  2. 브로커/토픽 레벨: 브로커 설정 또는 토픽 설정에서 지정

브로커 레벨의 compression.type 설정 옵션:

  • producer(기본값): 프로듀서가 압축한 형식 그대로 저장(권장)
  • none: 모든 배치를 압축 해제하여 저장(비효율적)
  • 특정 압축 유형(gzip, lz4 등):
    • 프로듀서의 압축 유형과 일치하면 그대로 저장
    • 일치하지 않으면 브로커가 압축 해제 후 재압축(CPU 사용량 증가)

권장 설정: 모든 프로듀서에서 압축을 활성화하고, 브로커는 기본값인 compression.type=producer를 유지하는 것이 가장 효율적이다.


배칭(Batching) 메커니즘 최적화

배칭의 중요성

기본적으로 Kafka 프로듀서는 레코드를 가능한 빨리 전송한다. 그러나 배칭을 활용하면 여러 메시지를 하나의 요청으로 묶어 전송할 수 있어 다음과 같은 이점이 있다:

  • 처리량 증가: 더 적은 요청으로 더 많은 데이터 전송
  • 네트워크 효율성 향상: 요청 오버헤드 감소
  • 압축률 향상: 더 큰 배치는 더 나은 압축률 제공

배칭 관련 주요 설정

배칭 메커니즘에 영향을 주는 두 가지 핵심 설정이 있다:

1. linger.ms

  • 기본값: 0 (즉시 전송)
  • 역할: 배치를 전송하기 전에 기다리는 최대 시간(밀리초)
  • 최적화 방법: 값을 증가시키면(예: 5-10ms) 약간의 지연 시간이 추가되지만, 배치 크기와 처리량이 증가한다.

2. batch.size

  • 기본값: 16KB
  • 역할: 배치의 최대 크기(바이트)
  • 최적화 방법: 값을 증가시키면(예: 32KB 또는 64KB) 더 큰 배치를 전송할 수 있어 처리량이 향상된다.

배칭 작동 방식

배칭은 다음과 같이 작동한다:

  1. 프로듀서가 메시지를 생성한다.
  2. linger.ms 시간 동안 기다리며 배치에 메시지를 추가한다.
  3. linger.ms 시간이 경과하거나 배치가 batch.size에 도달하면 배치를 전송한다.
  4. 압축이 활성화된 경우, 전송 전에 배치가 압축된다.

배칭 최적화 시 고려사항

  • 배치는 파티션별로 생성되므로, batch.size를 너무 크게 설정하면 메모리 낭비가 발생할 수 있다.
  • batch.size보다 큰 메시지는 배치에 포함되지 않고 즉시 전송된다.
  • Kafka Producer Metrics를 통해 평균 배치 크기를 모니터링하여 설정을 조정할 수 있다.

최적의 프로듀서 설정 예시

다음은 처리량을 최적화하기 위한 프로듀서 설정 예시:

Properties props = new Properties();

// 압축 활성화
props.put("compression.type", "snappy");  // 또는 lz4

// 배칭 최적화
props.put("linger.ms", 5);  // 5-10ms 권장
props.put("batch.size", 32768);  // 32KB로 증가

// 기타 중요 설정
props.put("acks", "1");  // 또는 "all"
props.put("enable.idempotence", true);  // 멱등성 활성화

결론

Kafka 프로듀서의 성능을 최적화하기 위해서는 메시지 압축과 배칭 메커니즘을 적절히 활용하는 것이 중요하다. 특히 처리량이 많은 스트림에서는 이러한 최적화가 큰 차이를 만들 수 있다.

권장 사항:
1. 프로듀서 레벨에서 압축 활성화(snappy 또는 lz4 권장)
2. linger.ms를 5-10ms로 설정하여 배치 형성 시간 확보
3. batch.size를 32KB 또는 64KB로 증가
4. 브로커의 compression.type은 기본값인 producer로 유지

이러한 설정을 적용하기 전에 실제 환경에서 테스트하여 워크로드에 가장 적합한 구성을 찾는 것이 좋다. 각 애플리케이션의 요구사항에 따라 최적의 설정이 달라질 수 있기 때문이다.

0개의 댓글