토픽은 여러 파티션을 가질 수 있다. 메시지를 받으면 파티션에 분배한다.
카프카에서 메시지를 생산해서 카프카 토픽으로 전송하는 애플리케이션, 서버라고 부른다.
메시지에 키값을 지정하면 지정한 파티션으로 전송하게된다. 키 값을 지정하지 않으면 파티션은 Round-robin 방식으로 균등하게 분배한다.
메시지 전송시에 Key 값을 지정하면 Key의 Hash 값을 가지고 파티션 분배에 참고한다.
send()
메소드 두번째 인자에 설정한다.프로듀서가 메시지를 보내고 도착여부를 확인하지 않는 코드이다.
카프카가 살아있다면 프로듀서는 메시지 전송에 실패하더라도 자동으로 재전송하기 때문에 대부분 성공적으로 전송되지만 일부 메시지를 손실될 수도 있다.
producer.send();
동기 방식의 메시지 전송은 응답을 기다리며 스레드를 정지하기 때문에 효율이 떨어지고 시간이 오래걸린다.
send()
후에 RecordMetadata
를 리턴받는다.
비동기 방식은 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 메소드를 실행하는 방법을 선택했다.