Microservices Architecture / / 2024. 11. 7. 10:16

Kafka의 Producer와 Consumer

Kafka의 ProducerConsumer는 Kafka의 핵심 구성 요소로, 각각 메시지를 생성하고 소비하는 역할을 합니다.

 

1. Kafka Producer

 

Producer는 Kafka에서 메시지를 생성하고 특정 토픽으로 전송하는 역할을 합니다.

 

주요 특징

 

토픽 지정: 메시지를 전송할 때 특정 토픽을 지정하며, 해당 토픽이 존재하지 않으면 자동으로 생성됩니다.

파티션: Kafka 토픽은 여러 파티션으로 나뉘어 데이터가 분산 저장되므로, Producer는 메시지를 특정 파티션으로 보내는 전략을 가집니다.

파티션 전략: 메시지 키를 지정하여 특정 파티션에 메시지를 보낼 수 있고, 키가 없을 경우 라운드 로빈 방식으로 분배됩니다.

부하 분산: 여러 파티션으로 데이터가 분산되기 때문에 소비자는 데이터를 병렬로 처리할 수 있습니다.

메시지 신뢰성 설정: acks 옵션을 통해 메시지가 성공적으로 전송되었는지 확인할 수 있으며, 일반적으로 acks=1은 빠른 성능을, acks=all은 높은 신뢰성을 제공합니다.

 

Producer 동작 방식

 

1. 메시지 생성: Producer는 데이터 또는 이벤트를 메시지로 생성합니다.

2. 토픽 및 파티션 선택: Producer는 메시지 키를 통해 파티션을 선택하거나, 라운드 로빈 방식으로 자동 분배합니다.

3. 전송 및 확인: acks 설정에 따라 메시지 전송 확인을 기다립니다.

4. 데이터의 배치 전송: 대량의 메시지를 배치하여 전송할 수 있어 효율적으로 성능을 높입니다.

 

예시 코드 (Java)

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

KafkaProducer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("my_topic", "key", "value"));
producer.close();

 

2. Kafka Consumer

 

Consumer는 Kafka에서 특정 토픽에 전송된 메시지를 읽어들이고 처리하는 역할을 합니다.

 

주요 특징

 

소비자 그룹: Consumer는 **소비자 그룹(Consumer Group)**에 속하며, 같은 그룹에 속한 소비자는 각 파티션을 서로 독립적으로 읽습니다. 이로 인해 여러 소비자가 동시에 처리할 수 있습니다.

오프셋 관리: Kafka는 각 메시지의 위치(오프셋)를 관리하여 Consumer가 어디까지 읽었는지 추적할 수 있습니다.

자동 커밋: enable.auto.commit=true로 설정 시, Kafka가 주기적으로 오프셋을 자동으로 커밋합니다.

수동 커밋: 필요에 따라 수동으로 커밋하여 원하는 타이밍에 오프셋을 저장할 수 있습니다.

토픽의 파티션과 매칭: 소비자 그룹 내에서 각 파티션은 하나의 Consumer에만 할당되어 중복 처리를 방지하고, 새 Consumer가 추가되면 자동으로 리밸런싱됩니다.

 

Consumer 동작 방식

 

1. 토픽 구독: 특정 토픽을 구독하고 해당 토픽의 메시지를 읽기 시작합니다.

2. 오프셋 관리: Kafka가 제공하는 오프셋을 사용하여 메시지 읽기 위치를 관리합니다.

3. 메시지 처리: Consumer는 메시지를 처리하고 필요한 경우 오프셋을 커밋합니다.

4. 리밸런싱: Consumer가 추가되거나 제거되면 Kafka가 파티션을 재할당하여 균형을 맞춥니다.

 

예시 코드 (Java)

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("my_topic"));

while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
    }
}

 

요약

 

Producer는 메시지를 생성하고 Kafka 브로커로 전송하며, 파티션을 통해 메시지를 분산시킵니다.

Consumer는 특정 토픽의 메시지를 읽어들이고, 오프셋을 관리하여 메시지를 중복 없이 소비합니다.

Producer와 Consumer는 비동기 메시징 시스템을 통해 실시간 데이터 처리를 가능하게 하며, MSA 또는 분산 시스템에서 매우 유용하게 사용됩니다.

'Microservices Architecture' 카테고리의 다른 글

Amazon EC2, SC3  (9) 2024.11.08
Kafka의 Source, Target, Topic, Partition  (1) 2024.11.07
Kafka의 Lag와 Burrow  (0) 2024.11.07
Kafka의 Broker, Replication, ISR (In-Sync Replica)  (1) 2024.11.07
JMS API  (0) 2024.11.06
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유