들어가며
카프카는 기본적으로 1MB 이상의 큰 메시지를 고려하고 만들어진 메시지 시스템이 아닙니다. 하지만 그럼에도 1MB 이상의 메시지로 파이프라인을 구성해야 할 때가 있습니다. 예로 이미지 혹은 정말 큰 JSON 메시지로 파이프라인 구성할 때가 있습니다. 이때, 프로듀서, 브로커, 컨슈머는 그 파이프라인 성격에 맞게 직접적 혹은 간접적으로 영향을 받는 설정들을 조정해줘야 합니다. 이번 글은 각 카프카 컴포넌트들이 1MB 이상의 메시지를 보낼 때 고려해야 하는 설정들을 정리했습니다.
참고로 아래 설정들을 전부 테스트해보지 못했습니다. 몇 가지 설정은 주관적인 판단에 의해 명시되어 있습니다. 혹여나 잘못되거나 부족한 부분은 댓글로 피드백 부탁드립니다. :)
1. 프로듀서 측
1.1. 직접적인 영향을 미치는 설정들
max.request.size
- 프로듀서가 브로커에 한 번 요청할 때 보낼 수 있는 최대 크기
- 메시지 크기가 이 설정 값보다 클 경우 프로듀싱 불가
- 브로커의 message.max.byte 설정과 연관
- 기본 값 : 1048576 (1MB)
1.2. 간접적인 영향을 미치는 설정들
buffer.memory
- 프로듀서가 버퍼(+압축)에 사용할 총메모리의 양
- 메시지 자체가 커지므로 버퍼의 양도 커져야 함
- 기본 값 : 33554432 (32MB)
request.timeout.ms
- 프로듀서가 요청 후 브로커의 응답을 대기하는 최대 시간
- 만약 ack=all 인 상태에서 메시지 크기가 클 경우, 브로커 내부에서 복제할 때 시간이 걸릴 수 있음
- 기본 값 : 30000 (30초)
2. 브로커 측
2.1. 직접적인 영향을 미치는 설정들
message.max.bytes
- 레코드 배치(단일 요청)의 최대 크기
- 토픽 별로 설정 가능 (max.message.bytes)
- 이 값보다 클 경우 메시지를 받을 수 없음
- 프로듀서의 max.request.size 설정과 연관
- 기본 값 : 1048588 (1MB)
fetch.max.bytes
- 각 fetch 요청에 따라 반환할 최대 바이트 수
- 이 설정보다 메시지 바이트가 클 경우 처리되지 않음
- 기본 값 : 57671680 (55MB)
2.2. 간접적인 영향을 미치는 설정들
log.segment.bytes
- 각 세그먼트 파일의 크기
- 메시지의 크기가 커질수록 기존보다 더 많은 세그먼트가 만들어지고, 이는 파일 핸들러 자원을 더 많이 점유하게 됨
- 기본 값 : 1073741824 (1GB)
request.timeout.ms
- 요청하고 응답까지 대기하는 최대 시간
- 메시지 크기가 커질수록 대기 시간이 길어질 확률이 높아짐
- 기본 값 : 30000 (30초)
replica.fetch.max.bytes
- 각 복제 과정에서 fetch 시도할 수 있는 최대 바이트 수
- 만약 이 설정보다 메시지 크기가 크다면 별도의 조정 과정이 진행
- 기본 값 : 1048576 (1MB)
replica.fetch.response.max.bytes
- 전체 fetch 응답의 최대 바이트 수
- 만약 이 설정보다 메시지 크기가 크다면 별도의 조정 과정이 진행
- 기본 값 : 10485760 (10MB)
3. 컨슈머 측
3.1. 직접적인 영향을 미치는 설정들
없는 것으로 판단됩니다.
3.2. 간접적인 영향을 미치는 설정들
max.partition.fetch.bytes
- 브로커에서 각 파티션 별로 최대로 반환할 수 있는 바이트 수
- 만약 이 설정보다 메시지 크기가 크다면 별도의 조정 과정이 진행
- 기본 값 : 1048576 (1MB)
fetch.max.bytes
- 브로커에서 최대로 반환할 수 있는 바이트 수
- 만약 이 설정보다 메시지 크기가 크다면 별도의 조정 과정이 진행
- 기본 값 : 52428800 (50MB)
max.poll.interval.ms
- poll() 메서드 처리할 때, 컨슈머 그룹에서의 최대 대기 시간
- 메시지 크기가 커지고 처리에 시간이 길어진다면 컨슈머 그룹에서 제외되고 컨슈머 그룹 리밸런싱이 발생할 확률이 높아짐
- 기본 값 : 300000 (5분)
request.timeout.ms
- 요청하고 응답까지 대기하는 최대 시간
- 메시지 크기가 커질수록 대기 시간이 길어질 확률이 높아짐
- 기본 값 : 30000 (30초)
출처: https://always-kimkim.tistory.com/entry/kafka-operations-settings-concerned-when-the-message-has-more-than-1-mb [언제나 김김:티스토리]