메시지 압축과 배칭 전략을 적절히 활용하면 네트워크 대역폭을 절약하고, 처리량을 증가시키며, 디스크 사용량을 줄일 수 있다.
프로듀서가 Kafka에 데이터를 전송할 때 일반적으로 텍스트 형식(예: JSON)으로 전송한다. 이러한 데이터를 압축하면 다음과 같은 이점이 있다:
Kafka에서 지원하는 압축 알고리즘은 다음과 같다:
| 압축 유형 | 압축률 | CPU 사용량 | 압축 속도 | 네트워크 대역폭 사용량 |
|---|---|---|---|---|
| none (기본값) | 없음 | 없음 | 해당 없음 | 가장 높음 |
| gzip | 가장 높음 | 가장 높음 | 가장 느림 | 가장 낮음 |
| snappy | 중간 | 중간 | 중간 | 중간 |
| lz4 | 낮음 | 가장 낮음 | 가장 빠름 | 높음 |
| zstd (Kafka 2.1+) | 중간 | 중간 | 중간 | 중간 |
압축은 다음과 같이 작동한다:

압축은 두 가지 레벨에서 설정할 수 있다:
compression.type 속성으로 지정브로커 레벨의 compression.type 설정 옵션:
권장 설정: 모든 프로듀서에서 압축을 활성화하고, 브로커는 기본값인 compression.type=producer를 유지하는 것이 가장 효율적이다.
기본적으로 Kafka 프로듀서는 레코드를 가능한 빨리 전송한다. 그러나 배칭을 활용하면 여러 메시지를 하나의 요청으로 묶어 전송할 수 있어 다음과 같은 이점이 있다:
배칭 메커니즘에 영향을 주는 두 가지 핵심 설정이 있다:
배칭은 다음과 같이 작동한다:

linger.ms 시간 동안 기다리며 배치에 메시지를 추가한다.linger.ms 시간이 경과하거나 배치가 batch.size에 도달하면 배치를 전송한다.batch.size를 너무 크게 설정하면 메모리 낭비가 발생할 수 있다.batch.size보다 큰 메시지는 배치에 포함되지 않고 즉시 전송된다.다음은 처리량을 최적화하기 위한 프로듀서 설정 예시:
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로 유지
이러한 설정을 적용하기 전에 실제 환경에서 테스트하여 워크로드에 가장 적합한 구성을 찾는 것이 좋다. 각 애플리케이션의 요구사항에 따라 최적의 설정이 달라질 수 있기 때문이다.