728x90
반응형
SMALL

Producer

Producer는 메시지를 생산해서 Kafka의 Topic으로 메시지를 보내는 애플리케이션이다. Producer와 Consumer는 서로 알지 못하며, Producer와 Consumer는 각각 고유의 속도로 Commit Log에 Write 및 Read를 수행한다.

 

Message, Record, Event, Data

모두 같은 표현이며, 다음과 같은 구조를 가지고 있다.

  • Key, Value는 JSON, Avro 등 다양한 형태가 가능하다.

Serializer / Deserializer

  • Producer가 데이터를 생산해서 Kafka에 전송할 때 데이터를 Byte 형태로 Serialize를 수행한다.
  • Consumer는 데이터를 Kafka로부터 읽을 때 Byte 형태의 데이터를 원하는 형태로 Deserialize한다. 

그래서, 실제 애플리케이션에서는 Key와 Value용 Serializer를 각각 설정한다. 다음과 같이 말이다.

private Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, " broker101:9092,broker102:9092 ");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, org.apache.kafka.common.serialization.StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, org.apache.kafka.common.serialization.StringSerializer.class);
KafkaProducer producer = new KafkaProducer(props);

 

Producing to Kafka

  • 개발자가 하는 것은 데이터를 만들어서 send()하는 것밖에 없다. 그 이후부터는 Kafka 라이브러리에서 전부 다 해준다.
  • 데이터를 send()하면 내부적으로 먼저 설정된 Serializer로 Serialize를 수행한다.
  • 그리고, Partitioner라는 녀석이 있는데 이 녀석은 어떤 파티션으로 데이터를 전송할지를 결정해주는 녀석이다. 그래서 이 녀석을 통해 특정 파티션이 선정된다.
  • 추가적으로 압축 설정을 했다면 압축 과정이 일어난 후 데이터를 Kafka로 전송한다.
  • 정상적으로 전송이 됐다면 전송이 잘 됐다는 메타데이터를 Producer에 보내고, 전송에 실패하면 재시도를 하거나 재시도를 할 수 없으면 예외를 반환한다. 

Partitioner

  • 위에서 Partitioner에 대해 말했는데, 이 녀석은 메시지를 Topic의 어떤 Partition으로 보낼지 결정한다.
  • 해시값을 구해서 특정 파티션으로 보내는 게 일반적이다. 단, Key가 null이 아닌 경우에만 이 알고리즘을 수행한다.
  • 다시 말해, 동일한 Key를 보내면 동일한 파티션으로만 데이터가 전송될 것이다.

그럼 Key가 null인 경우엔?

  • 라운드 로빈 방식으로 데이터를 보내는 게 2.4 이전의 방식이었는데, 이 방식을 사용하면 데이터가 6개면 6번의 네트워크 과정이 일어난다. 즉, 비효율적이라는 것. 그래서 2.4 이후의 방식은 하나의 Batch가 닫힐때까지 하나의 파티션에게만 데이터를 쭉 보낸다. 즉, 배치단위로 보내서 6번을 보낼것을 2번으로 줄일 수 있다는 의미이다.

 

728x90
반응형
LIST

'Apache Kafka' 카테고리의 다른 글

p6. Replication  (0) 2025.03.15
p5. Consumer  (0) 2025.03.15
p3. Broker  (0) 2025.03.15
p2. Topic, Partition, Segment  (0) 2025.03.15
p1. Apache Kafka란  (0) 2025.03.15

+ Recent posts