본문 바로가기
Kafka

[Apache Kafka] Kafka Producer

by J_Remind 2024. 12. 26.

Kafka Producer는 메시지를 생성하고 Kafka 토픽에 전송하는 역할을 담당하는 클라이언트이다.

1. Kafka Producer의 주요 기능

1. 메시지 전송 

  • Producer는 메시지를 생성한 후 Kafka 토픽으로 전송
  • 메시지는 특정 토픽의 하나 이상의 파티션으로 저장

2. 파티셔닝 (Partitioning)

  • Producer는 메시지가 어느 파티션에 저장될지 결정
  • Key 값을 가지는 경우 키를 기준으로 파티션을 선택
  • Key 값을 가지지 않는 경우 라운드 로빈 또는 스티키 방식으로 파티션을 선택

3. 메시지 직렬화

  • 메시지를 전송하기 전에 데이터를 바이트 배열로 직렬화
  • 메시지의 키와 값을 각각 지정된 Serializer를 사용해 직렬화

4. ACK (Acknowledgment)

  • Producer는 메시지가 성공적으로 브로커에 기록 되었는지 확인하기 위해 ACK 설정
    • acks=0 : 리더 파티션에 데이터를 전송하고 응답값을 받지 않음, 데이터가 정상적으로 전송되고 복제되었는지 알 수 없음, 속도는 빠르지만 데이터 유실 가능성이 있음
    • acks=1 : 리더 파티션에 데이터를 전송하고 응답값을 받음, 다만 나머지 파티션에 복제 되었는지는 모름
    • acks=all 또는 acks=-1: 리더 파티션에 데이터를 전송하고 팔로우 파티션에 복제가 되었는지 확인 함, 데이터 유실이 없지만, 데이터가 복제 되었는지 확인하는 과정으로 인해 속도가 느림

5. 재시도 (Retries)

2. Kafka Producer 동작 과정

 

1. 데이터 생성 및 전송

  • Send 메소드는 비동기(Async)이며 호출하면 내부 Buffer에 메시지를 저장 후 별도의 Thread가 Kafka Broker에게 전송

2. 메시지의 키와 값을 설정된 Serializer를 통해 바이트 배열로 변환

  • 메시지가 전송될 파티션 결정
  • Producer는 성능/로드밸런싱/가용성/업무 정합성등을 고려하여 어떤 브로커의 파티션으로 메시지를 보내야 할지 전락젹으로 결정

3. Record Accumulator의 배치에 저장

4. Sender의 별도 Thread를 통해 브로커로 전송

  • Kafka Producer 전송은 Kafka Producer Client의 별도 Thread가 전송을 담당하며 기본적으로 Thread간 Async 전송

5. ACK 수신

3. Kafka Producer 주요 구성

옵션 설명

bootstrap.servers Kafka 브로커의 호스트와 포트 정보
key.serializer 메시지 키를 직렬화하는 클래스
value.serializer 메시지 값을 직렬화하는 클래스
acks 메시지 전송 확인 대한 수준
retries 전송 실패 시 재시도 횟수
retry.backoff.ms 전송 재시도를 위한 대기 시간
batch.size 배치로 전송되는 메시지의 최대 크기
linger.ms 배치를 전송하기 전에 대기하는 시간
request.timeout.ms 전송에 걸리는 최대 시간
deliver.timeout.ms 배치 전송에 허용된 최대 시간
max.in.flight.requests.per.connection 브로커의 응답 없이 한번에 보낼 수 있는 배치의 개수 (default : 5)
enable.idempotence 메시지 중복 전송 방지 (kafka 3.0 이후 default : true 적용)

유의사항

delivery.timeout.mslinger.ms + request.timeout.ms 으로 설정

  • retries 횟수가 설정 되어 있어도 delivery.timeout.ms가 초과되면 재시도를 중단

enable.idempotence = true 설정 시 이 외의 파라미터 설정이 잘 못 된 경우 제대로 동작 하지 않음 (명시적 ture 설정 시 config 오류 발생)

  • max.in.flignt.requests.per.connection 은 1~5 설정
  • acks=all 설정
  • retries는 0 보다 큰 값

4. Key 값을 가지지 않는 메시지 전송

  • 메시지는 Producer를 통해 전송 시 Partitioner를 통해 토픽의 어떤 파티션으로 전송되어야할 지 미리 결정
  • Key값을 가지지 않는 경우 라운드 로빈, 스티키 파티션등의 파티션 전략등으로 선택되어 파티션 별로 메시지가 전송될 수 있음
  • Topic이 여러 개의 파티션을 가질 때 메시지의 전송 순서가 보장되지 않은 채로 Consumer에서 읽혀질 수 있음

라운드 로빈(Round Robin)

  • Kafka 2.4 이전 버전의 기본 파티션 분배 전략
  • 최대한 메시지를 파티션에 균일하게 분배하려는 전략으로 메시지 배치를 순차적으로 다른 파티션으로 전송
  • 메시지가 배치 데이터를 빨리 채우지 못하면서 전송이 늦어지거나 배치를 다 채우지 못하고 전송 하면서 전송 성능이 떨어지는 문제 발생

스티키 파티셔닝(Sticky Partitioning)

  • Kafka 2.4 이후 버전의 기본 파티션 분배 전략
    • 라운드로빈 방식의 성능을 향상시킨 방식
  • 특정 파티션으로 전송되는 하나의 배치에 메시지를 빠르게 먼저 채워서 보내는 방식
  • 배치를 채우지 못하고 전송을 하거나 배치를 채우는데 시간이 너무 오래 걸리는 문제를 개선

5. Key 값을 가지는 메시지 전송

  • 메시지 Key는 업무 로직이나 메시지 Produce/Consume 시 분산 성능 영향을 고려하여 생성
  • 특정 Key값을 가지는 메시지는 특정 파티션으로 고정되어 전송
  • 특정 Key 값을 가지는 메시지는 단일 파티션 내에서 전송 순서가 보장되어 Consumer에서 읽혀짐

'Kafka' 카테고리의 다른 글

[Apache Kafka] Kafka Group Consumer Rebalance  (0) 2024.12.28
[Apahce Kafka] Kafka Consumer  (1) 2024.12.28
[Apache Kafka] Kafka Replication란?  (0) 2024.09.18
[Apache Kafka] 카프카란 무엇인가?  (0) 2024.09.18