카프카 프로듀서

카프카, 데이터 플랫폼의 최강자 의 4장 카프카 프로듀서 요약

카프카 프로듀서

  • 프로듀서의 주요 옵션
  • 프로듀서 활용 예제
  • 다양한 메시지 전송 방법

카프카 프로듀싱 - 자바

  • send() 로 메시지를 보내는 방식은 3가지
  1. 메시지를 보내고 확인하지 않기
  2. 동기 전송
  3. 비동기 전송

메시지를 보내고 확인하지 않기

  • 프로듀서에서 서버로 메시지를 보내고 난 후에 성공적으로 도착했는지 까지 확인하지 않음
  • 프로듀서가 자동으로 재전송하기 때문에 대부분의 경우 성공적으로 전송
    • 일부 메시지는 손실 될 수도 있음
  • 메시지는 버퍼에 저장되고 별도의 스레드를 통해 브로커로 전달
  • send() 는 자바 퓨처(Future) 객체로 RecordMetadata를 리턴 받음
    • 리턴값을 무시하기 때문에 메시지가 성공적으로 전송되었는지 알 수 없음
    • 메시지 손실 가능성이 있기 때문에 일반적인 서비스에서는 사용하지 않음
  • 브로커에게 메시지를 보낸 후의 에러는 무시하지만, 보내기 전에 에러가 발생하면 예외를 처리할 수 있음

동기 전송

  • get() 메소드를 통해 Future 를 기다린 후, send() 가 성공했는지 실패했는지 확인
    • 에러가 없다면 메시지가 기록된 오프셋을 알 수 있는 RecordMetadata 를 획득
    • RecordMetadata 를 이용해 파티션과 오프셋 정보를 출력
  • 메시지마다 브로커에게 전송한 메시지가 성공했는지 실패했는지 확인하여 신뢰성 있는 메시지 전송
  • 재시도가 가능한 예외
    • 커넥션 에러
  • 재시도가 불가능한 예외
    • 메시지가 너무 큰 경우

비동기 전송

  • 프로듀서는 send() 메소드를 콜백과 같이 호출
  • 카프카 브로커에서 응답을 받으면 콜백 함수를 실행
  • 카프카가 오류를 리턴하면 onCompletion()은 예외를 전달 받음
    • 실제 운영환경에서는 추가적인 예외처리를 진행

프로듀서 주요 옵션

bootstrap.servers

  • 카프카 클러스터에 처음 연결을 하기 위한 호스트와 포트 정보로 구성된 리스트 정보
  • 전체 카프카 리스트가 아닌 호스트 하나만 입력해 사용할 수 있지만 추천되지 않음
    • 카프카 클러스터는 살아 있는 상태지만 해당 호스트만 장애가 발생하는 경우 접속이 불가
    • 주어진 리스트의 서버 중 하나에서 장애가 발생할 경우 클라이언트는 자동으로 다른 서버로 재접속을 시도

acks

  • 토픽의 리더에게 메시지를 보낸 후 요청을 완료하기 전 ack 수
  • follower 들의 ack를 받을 것인지를 의미
  • acks = 0
    • 프로듀서는 서버로부터 어떠한 ack도 기다리지 않음
    • 서버가 데이터를 전달받았는지 보장하지 않음
    • 클라이언트는 전송 실패에 대한 결과를 알지 못하기 때문에 재요청 설정도 적용되지 않음
    • 서버의 응답을 기다리지 않기 때문에 매우 빠르게 메시지를 보낼 수 있어 높은 처리량을 획득
  • acks = 1
    • 리더는 데이터를 기록하지만, 모든 팔로워는 확인하지 않음
  • acks = all or -1
    • 리더는 ISR의 팔로워로부터 데이터에 대한 ack를 기다림
    • 하나의 팔로워가 있는 한 데이터는 손실되지 않음
    • 데이터 무손실에 대해서 강하게 보장

batch.size

  • 프로듀서는 같은 파티션으로 보내는 여러 데이터를 함께 배치로 보내려고 시도
  • 배치 크기 바이트 단위를 조정
  • 정의된 크기보다 큰 데이터는 배치를 시도하지 않음
  • 배치를 보내기 전 클라이언트 장애가 발생하면 배치 내에 있던 메시지는 전달되지 않음
  • 고가용성이 필요한 경우라면 배치 사이즈를 주지 않는 것도 방법이 될 수 있음

max.request.size

  • 프로듀서가 보낼 수 있는 최대 메시지 사이즈
  • 기본값은 1MB

메시지 손실 가능성이 높지만 빠른 전송이 필요한 경우

  • acks = 0 으로 설정
  • 프로듀서는 카프카 서버에서 응답을 기다리지 않고, 메시지를 보낼 준비가 되는 즉시 다음 요청을 보냄
    • 카프카로부터 응답을 기다리지 않고 프로듀서만 준비되면 즉시 보내기 때문에 매우 빠르게 메시지를 전달
  • 일반적인 운영환경의 경우 메시지 손실 없이 빠르게 전달
  • 브로커가 다운되는 장애 등의 상황에서 메시지 손실 가능성이 높음

메시지 손실 가능성이 적고 적당한 속도의 전송이 필요한 경우

  • acks = 1
  • acks = 0과 비교해 메시지 손실률은 매우 낮음
    • 메시지 전송 시간은 다소 느림
  • 리더에 장애가 발생하는 경우, 아주 예외적으로 메시지 일부가 손실
    • 리더에 장애가 발생한다고 100%의 확률로 메시지가 손실되는 것은 아님
  • 프로듀서 애플리케이션으로 많이 사용되는 로그스태시나 파일비트등에서는 프로듀서의 acks 옵션을 1로 설정
  • 특별한 경우가 아니라면 속도와 안전성을 확보할 수 있는 acks=1로 사용

전송 속도는 느리지만 메시지 손실이 없어야 하는 경우

  • acks = all
    • acks 옵션 중 가장 느리지만 메시지 손실을 허용하지 않을 경우 사용
  • 토픽의 리더와 팔로워 모두 메시지를 전달 받았는지 확인
  • acks = all 을 완벽하게 사용하고자 할 경우 브로커의 설정도 같이 조정
  • 프로듀서 acks = all + 브로커 min.insync.replicas=1
    • acks = 1과 동일하게 동작
    • 프로듀서만 acks=all이 메시지 무손실을 보장해주지 않음
  • 프로듀서 acks = all + 브로커 min.insync.replicas=2
    • 카프카 문서에서 손실없는 메시지 전송을 위한 조건으로 권장 ( + 토픽의 리플리케이션 팩터 3)
    • 1대 정도의 서버 장애가 발생하더라도 손실 없는 메시지 전송을 유지할 수 있음
    • acks = all + min.insync.replicas = 2 + 리플리케이션 팩터 3
  • 프로듀서 acks = all + 브로커 min.insync.replicas = 3
    • 3개의 브로커 중 한 개가 다운 되었을 경우, 리플리케이션 팩터가 부족하다는 에러 메시지 발생
    • 프로듀서는 메시지를 전송할 수 없음
카프카 컨슈머 카프카 디자인

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×