-
운영 배포 전에 챙겼던 Kafka Producer Client 포인트들실무에서 알게된 내용 2022. 6. 22. 11:36
1. 주요 옵션 정리
- buffer.memory
- producer가 kafka 서버로 데이터를 보내기 전에 잠시 기다리는 버퍼 메모리 공간
- 기본값은 33,554,432 byte (32MB),
- compression.type
- producer가 데이터를 보낼 때 압축을 해서 보낼 수 있는데, 이때 압축하는 방식
- 기본값은 none
- retries
- 일시적인 오류로 producer가 데이터 전송에 실패할 경우, 재전송할 횟수
- acks
- producer가 kafka로 데이터를 전송한 뒤 요청 완료를 결정하기 위한 옵션
- 0(빠른 전송), 1(리더만 메시지를 받았는지 확인), all(모두 메시지를 받았는지 확인)
- batch.size
- producer가 여러 데이터를 같은 파티션을 전송할 때 batch방식으로 보내는데 이때의 크기
- 기본값은 16,384 byte (16KB)
- linger.ms 값을 0으로 설정하면 사실상 의미는 없음
- linger.ms
- 배치 형태로 메시지를 보내기 위해 기다리는 대기시간. (참고로 batch.size에 도달하지 않더라도 linger.ms시간이 되면 메시지를 전송한다.)
- 기본값은 0 (지연 없음, 단위는 ms)
[고민했던 포인트]
1. 카프카를 사용하는 목적에 따라 네트워크 I/O를 최소화하면서 처리량을 높일지, 네트워크 I/O는 조금 포기하더라도 지연 없는 전송을 할지를 두고 trade-off를 했던 점.
- 네트워크 I/O를 최소화하면서 처리량을 높이려면 batch.size와 linger.ms 값을 크게 설정해야 하고, 지연 없는 데이터 전송이 목표라면 batch.size와 linger.ms의 값을 작게 설정해야 한다.
2. 메시지 시스템에서 메시지 전송 방식에는 at-least-once(적어도 한 번은 전송), at-most-once(최대 한번 전송), exactly-once(정확히 한번 전송) 방식이 있는데, 내가 수행하고 있는 프로젝트에서는 어떤 방식이 적합한지 고민했던 점.
- 네트워크 회선 장애나 기타 장애 때문에 설령 일부 메시지가 중복 전송이 되더라도 적어도 메시지 한 번은 전송하고 싶었다. 왜냐하면, 어차피 수신하고 있는 Worker 쪽에서 중복처리 방어 로직이 있었기 때문이다. (참고로, 카프카는 기본적으로 at-least once 방식으로 동작한다.)
- enable.idempotence(producer가 정확히 한 번만 전송을 할 건지에 대한 옵션, 기본 값은 false)
[인프라 담당하는 팀에게 확인해야 할 포인트]
- log.retention.hours/log.retention.ms : 로그파일의 보관 주기
- log.retention.byte : 로그파일의 최대 저장 크기
2. 토픽
- 파티션 8개로 설정
- 레플리케이션 2로 설정
- 추후 처리량을 모니터링하면서 카프카 파티션과 레플리케이션 사이즈를 조절해야 함
예시 그림
3. 프로그래밍 language 레벨의 3가지 전송 방식
- 메시지를 보내고 결과를 확인하지 않는 방식
- producer client가 자동으로 재전송 해주기 때문에 대부분의 경우 성공적으로 전송된다. 하지만, 일부 메시지가 손실될 가능성은 있다.
- producer client가 자동으로 재전송 해주기 때문에 대부분의 경우 성공적으로 전송된다. 하지만, 일부 메시지가 손실될 가능성은 있다.
- 결과를 확인하는 방식
- synchronous 방식
- asynchronous 방식
1. 메시지 키를 지정해서 전송하는 방식 - 같은 메시지 키를 가지는 데이터라면 같은 파티션으로 전송하는 방식 (어느 파티션으로 갈지는 모름) - 특정 파티션에 대해 레코드의 순서를 보장하고 싶은 경우 사용 2. 파티션을 지정해서 전송하는 방식 - 원하는 파티션까지 지정해서 전송하는 방식
참고 자료
- https://kafka.apache.org/documentation/#producerconfigs
- https://ksr930.tistory.com/216
- https://jack-vanlightly.com/blog/2018/9/2/rabbitmq-vs-kafka-part-6-fault-tolerance-and-high-availability-with-kafka%20%EC%B6%9C%EC%B2%98:%20https://needjarvis.tistory.com/604%20[%EC%9E%90%EB%B9%84%EC%8A%A4%EA%B0%80%20%ED%95%84%EC%9A%94%ED%95%B4:%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC]
'실무에서 알게된 내용' 카테고리의 다른 글
로그가 간헐적으로 중복 노출되는 이슈 (0) 2022.06.29 ClientAbortException은 언제 발생하는가? (0) 2022.06.23 컬럼 값을 Collection으로 받을 때 Querydsl 이슈 (0) 2022.06.21 Grafana loki에서 에러 로그 하나가 검색이 안 됐던 이슈 (0) 2022.06.14 시스템 별로 Feign Client readTimeout 설정 때문에 내부 동작 코드 분석 (0) 2022.06.14 - buffer.memory