[java] 카프카와 자바를 사용한 이벤트 기반 마이크로서비스 아키텍처 구현하기

마이크로서비스 아키텍처는 이전에 모놀리식 아키텍처에서 벗어나고, 보다 확장 가능하고 유지 보수가 용이한 시스템을 구축하기 위한 패턴 중 하나입니다. 이벤트 기반 아키텍처는 마이크로서비스 간의 통신 방식 중 하나로, 이벤트를 생성하여 전달하고 소비함으로써 느슨한 결합성과 확장성을 제공합니다. 이번 블로그에서는 카프카와 자바를 사용하여 이벤트 기반 마이크로서비스 아키텍처를 구현하는 방법에 대해 알아보겠습니다.

카프카란?

카프카는 분산 스트리밍 플랫폼으로, 대용량의 데이터 처리를 위한 고성능 메시징 시스템입니다. 여러 컨슈머가 동시에 메시지 스트림을 읽을 수 있으며, 데이터의 복제 및 장애 대응을 위해 분산 아키텍처로 구성되어 있습니다.

카프카를 이용한 이벤트 기반 아키텍처 구성요소

이벤트 기반 아키텍처를 구현하기 위해 아래와 같은 구성요소가 필요합니다.

  1. 이벤트 생산자 (Event Producer): 이벤트를 생성하고 카프카에 전송하는 역할을 합니다.

  2. 이벤트 소비자 (Event Consumer): 카프카로부터 이벤트를 받아와 처리하는 역할을 합니다.

  3. 이벤트 토픽 (Event Topic): 카프카에 저장되는 메시지들의 주제를 정의합니다. 이벤트 생산자는 특정 토픽으로 이벤트를 보내고, 이벤트 소비자는 해당 토픽에서 이벤트를 가져옵니다.

카프카와 자바를 이용한 예제 구현

아래는 카프카와 자바를 사용하여 간단한 이벤트 기반 마이크로서비스 아키텍처를 구현한 예제입니다.

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;

public class EventProducer {

    public static void main(String[] args) {

        // 카프카 프로듀서 설정
        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);

        // 이벤트 생성 및 전송
        for (int i = 0; i < 10; i++) {
            String topic = "myevent";
            String key = "key-" + i;
            String value = "value-" + i;

            ProducerRecord<String, String> record = new ProducerRecord<>(topic, key, value);
            producer.send(record);
        }

        producer.close();
    }
}

위의 코드는 카프카에 이벤트를 생성하고 전송하는 이벤트 생산자를 구현한 자바 코드입니다. 카프카 프로듀서 설정을 초기화하고, 특정 토픽으로 이벤트를 전송하는 작업을 수행합니다.

import org.apache.kafka.clients.consumer.*;
import org.apache.kafka.common.TopicPartition;

import java.util.Arrays;
import java.util.Collections;
import java.util.Properties;

public class EventConsumer {

    public static void main(String[] args) {

        // 카프카 컨슈머 설정
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        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);

        // 이벤트 소비
        String topic = "myevent";
        TopicPartition partition = new TopicPartition(topic, 0);
        consumer.assign(Collections.singletonList(partition));

        consumer.seekToBeginning(Collections.singletonList(partition));

        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(1000);
            for (ConsumerRecord<String, String> record : records) {
                System.out.println("Received event: " + record.value());
            }
        }
    }
}

위의 코드는 카프카로부터 이벤트를 가져와 처리하는 이벤트 소비자를 구현한 자바 코드입니다. 카프카 컨슈머 설정을 초기화하고, 특정 토픽에서 이벤트를 가져와 출력하는 작업을 수행합니다.

마무리

카프카와 자바를 사용하여 이벤트 기반 마이크로서비스 아키텍처를 구현하는 방법에 대해 알아보았습니다. 카프카는 신뢰성있는 메시지 큐로서, 이벤트 기반 아키텍처를 구성하는 데 매우 유용합니다. 마이크로서비스 아키텍처의 장점을 활용하여 복잡한 시스템을 구축하고, 유연하고 확장 가능한 아키텍처를 구현해 보세요.

더 자세한 내용은 카프카 공식 문서를 참조하시기 바랍니다.