본문 바로가기

만들어 봐요/Kafka

Kafka Producer

이번에는 카프카 프로듀서(Producer)가 무엇인지 살펴보도록 하겠습니다. 프로듀서 클라이언트의 역할은 이름 그대로 메시지를 생성하는 일을 합니다. 이 과정을 앞서 살펴봤던 카프카의 기본 구조인 Pub-Sub 시스템에서 Publish를 담당하는 것입니다. 프로듀서 클라이언트를 통해 사용자는 메시지를 브로커를 통해 보내게 됩니다. 브로커는 카프카 클라이언트들의 요청에 응답하거나 토픽을 관리하는 등 중요 역할을 하는데요. 자세한 내용은 다른 글을 통해서 따로 설명하도록 하겠습니다. 

 

프로듀서 클라이언트를 사용하는 방법은 여러가지가 있습니다. 우선 가장 쉽게 접근하는 방법은 kafka-console-producer라는 CLI를 이용하는 것 입니다. 여기서는 자바를 통해 프로듀서 클라이언트를 이용하는 방법에 대해 설명하겠습니다. 카프카 클라이언트를 이용하려면 kafka-clients 라이브러리를 dependency에 추가해야 합니다. 현재 2.5.0 버전까지 공개가 되어있는 상태입니다. 현재도 활발히 프로젝트가 진행 중이므로 최신 버전은 카프가 공식 홈페이지(https://kafka.apache.org/)에서 확인하시기 바랍니다. 사용하시는 빌드 툴에 따라 dependency를 추가하는 방법은 여기(https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients/2.5.0)를 참조하시면 됩니다.

 

카프카 프로듀셔 객체를 만들 때 가장 중요한 세 가지 설정이 있습니다. 첫 번 째는 bootstap server의 주소, 즉, 브로커의 주소입니다. 하나 이상의 브로커 목록을 입력해주면 됩니다. 그리고 중요한 두 가지 값은 key-serializer와 value-serializer입니다. 카프카는 메시지를 전송 효율을 높이기 위해 바이트 객체로 데이터를 주고받게 됩니다. 그래서 key와 value에 각각 serializer를 설정해 줘야 합니다. 참고로 메시지를 받는 컨슈머는 deserilizer를 설정해줘야 합니다. CLI를 이용하는 경우 기본값은 StringSerializer를 사용합니다. 


private Properties kafkaProps = new Properties();
kafkaProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "broker1:9092, broker2:9092");
kafkaProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
kafkaProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(kafkaProps);

 

사용자가 카프카를 통해 전송하는 메시지는  ProducerRecord라는 객체에 담기게 됩니다. 다음 예제를 보면서 설명하도록 하겠습니다.


ProducerRecord<String, String> record = new ProducerRecord<>("Topic1", "Key1", "Value1");
try {
  producer.send(record);
} catch (Exception e) {
  e.rpintStackTrace();
}

ProducerRecord 객체를 생성할 때 필수로 들어가야 하는 것은 토픽 이름과 전송하려는 메시지 값을 생성자에 넣어줘야 합니다. 키 값을 지정하지 않으면 기본적으로 null을 입력 하는 것과 동일하게 동작합니다. 키 값이 null이라면 Round-robin 알고리즘에 따라 파티션을 할당하게 됩니다. 키 값을 지정하게 되면 동일한 키 값을 가진 메시지는 같은 토픽 파티션으로 할당되는 것을 카프카는 보장합니다. 메시지의 순서가 중요한 경우에는 이 키 값을 반드시 지정해야 합니다. 카프카는 동일한 토픽 파티션 내에서는 순서를 보장해주지만 파티션 간에는 순서를 보장해주지 않기 때문에 순서가 섞여서 처리될 수가 있습니다.

 

간단하게 Kafka Producer API를 활용하여 메시지를 전송하는 방법을 알아봤습니다. 카프카 프로듀서는 정말 많은 설정들을 가지고 있습니다. 이번글에서는 단지 3개만 사용했었는데요 더 자세한 목록은 카프카 공식 페이지(https://kafka.apache.org/documentation/#producerconfigs)에서 확인이 가능합니다. 이 환경설정의 각 항목에 대해서 설명하려면 엄청 길어질거 같아 다음 글에서 나눠서 쓰도록 하겠습니다.

 

반응형

'만들어 봐요 > Kafka' 카테고리의 다른 글

Broker, Topic, Offset, Partition  (1) 2020.02.16
Apache Kafka란 무엇인가  (1) 2020.01.07