Kafka Producer

h블로그·2021년 7월 29일
0

topic

partition

토픽은 여러 파티션을 가질 수 있다. 메시지를 받으면 파티션에 분배한다.

Producer

카프카에서 메시지를 생산해서 카프카 토픽으로 전송하는 애플리케이션, 서버라고 부른다.
메시지에 키값을 지정하면 지정한 파티션으로 전송하게된다. 키 값을 지정하지 않으면 파티션은 Round-robin 방식으로 균등하게 분배한다.

Key

메시지 전송시에 Key 값을 지정하면 Key의 Hash 값을 가지고 파티션 분배에 참고한다.

  • 원하는 파티션 지정하길 원하면 Key 값 지정
  • Key값이 null이면 Round robin 방식으로 분배
    Key값은send() 메소드 두번째 인자에 설정한다.

전송 결과를 확인하지 않고 전송

프로듀서가 메시지를 보내고 도착여부를 확인하지 않는 코드이다.
카프카가 살아있다면 프로듀서는 메시지 전송에 실패하더라도 자동으로 재전송하기 때문에 대부분 성공적으로 전송되지만 일부 메시지를 손실될 수도 있다.

producer.send();

Sync 전송

동기 방식의 메시지 전송은 응답을 기다리며 스레드를 정지하기 때문에 효율이 떨어지고 시간이 오래걸린다.
send() 후에 RecordMetadata를 리턴받는다.

Async 전송

비동기 방식은 callback 메소드를 함께 보내서 성공/실패에 따라서 callback 메소드를 실행하게 한다.

 public void sendMessage(String message) {
        ListenableFuture<SendResult<String, String>> future = orderTemplate.send(topicName, message);
        future.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {

            @Override
            public void onSuccess(SendResult<String, String> result) {
                log.debug("전송 성공!!");
            }

            @Override
            public void onFailure(Throwable ex) {
                throw new TomsException("전송에 실패했습니다. ");
            }
        });
    }

전송 성공시 수행해야 하는 로직이 있었는데, sync 를 사용해서 효율을 떨어뜨리는 것이 맞지 않는다고 생각해서 Async 로 callback 메소드를 실행하는 방법을 선택했다.

profile
😎🙈🙈🙈🤓

0개의 댓글