카프카, 데이터 플랫폼의 최강자 의 4장 카프카 프로듀서 요약
카프카 프로듀서
- 프로듀서의 주요 옵션
- 프로듀서 활용 예제
- 다양한 메시지 전송 방법
카프카 프로듀싱 - 자바
- send() 로 메시지를 보내는 방식은 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