Kafka의 Producer와 Consumer는 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 |