• [자바(JAVA)][카프카(Kafka)] 프로듀서(Producer) 설정(Acks, Retries)

    2025. 2. 3.

    by. Daramu

    프로듀서의 설정에 대한 부분은 아래의 링크 참고

    https://daramu.tistory.com/63

     

    [자바(JAVA)][카프카(Kafka)] 외부의 데이터를 받는 프로듀서(Producer) 구현

    자바에서 카프카를 사용하기 위한 방법이다.이전 게시글에 있듯이, 카프카는 프로듀서 -> 카프카 클러스터 -> 컨슈머 의 형태로 메시지가 소비된다.우선 프로듀서가 메시지를 카프카 클러스터에

    daramu.tistory.com

     

    프로듀서(Producer/생성자)가 특정 주제의 파티션을 호스트하는 Kafka 클러스터로 데이터를 보낸다.

    이때 프로듀서가 카프카 클러스터로 메시지를 보낼때 그것이 제대로 전송되었는가에 대한 옵션이 있다.

     

    해당 옵션은 acks 옵션으로, 0,1,all or -1 옵션이 있다.

    각각의 옵션은 아래와 같다.

     

    properties.setProperty(ProducerConfig.ACKS_CONFIG, "0");

    acks=0 옵션으로 프로듀서가 메시지를 보낼때 응답을 기다리지 않는다.

    즉, 보냈다면 메시지가 카프카 브로커에 정상적으로 저장되었는지 확인하지 않는다는 의미이다.

    오버헤드가 가장 적으며 확인(응답)을 하지 않기에 데이터(메시지)의 손실의 가능성이 있다. 

    주로 데이터의 손실이 일어날 가능성이 있더라도 성능이 매우 중요한 특수한 경우에 사용한다.

     

    properties.setProperty(ProducerConfig.ACKS_CONFIG, "1");

    acks=1 옵션으로 프로듀서는 리더 브로커에 데이터를 보낸다면, 리더 브로커는 성공적으로 메시지를 수신하였다는 응답을 보낸다.

    리더 브로커가 메시지를 받았다는 확신을 가질 수 있어 성능과 신뢰성의 균형에 있다고 봐도 무방하다.

    다만 1옵션은 복제(replicas) 브로커에 저장되었다는 보장은 하지 않는다(리더 브로커가 받았다는 응답하니까).

     

    properties.setProperty(ProducerConfig.ACKS_CONFIG, "all");

    all, 혹은 -1 옵션은 위의 1에서 리더 브로커가 응답을 자신이 적을 뿐만 아니라 레플리카스에 모두 적혔다면 응답을 진행한다.

    어느정도의 오버헤드는 발생하지만 리더 브로커 및 레플리카스의 저장이 완료되었기에 가장 단단한 신뢰성을 보장한다.

     

    Retries?

    reties는 메시지 실패에 대한 재시도의 방안이다.

    가령 all이나 -1이라 하여도 메시지 실패에 대한 요소는 존재한다.

    레플리카스 설정을 2로 하였다고 가정시, 리더 브로커와 레플리카스 2대가 있는데 여기서 레플리카스 2대가 예기치 못한 사고로 종료되었다.

    그렇다면 리더 브로커는 메시지를 받았지만 레플리카스를 적을 수 없기에 해당 요청에 대하여 에러를 발생시킨다.

    이러한 경우 등에 대응하기 위해 "retries" 세팅이 존재한다.

     

    properties.setProperty(ProducerConfig.RETRIES_CONFIG, "3");

    해당 세팅은 메시지 전송 후 실패시에 재전송의 시도 횟수를 나타낸다.

    3을 입력시 실패한 이후 3번 재전송을 시도한다는 의미이다.

     

    properties.put(ProducerConfig.RETRY_BACKOFF_MS_CONFIG, "1000");

    위의 코드또한 비슷한 이치로, RETRIES가 횟수를 나타낸다면 MS_CONFIG는 재시도 간 대기 시간을 나타낸다.

    안에 숫자는 밀리초로, 1000은 1초를 나타낸다.

     

    댓글