카프카 구현하기 | Message Queue

Faithful Dev·2025년 3월 12일

Message Queue(MQ)비동기 메시지 기반 통신을 제공하는 시스템으로, 데이터를 생산자(Producer)가 생성하여 큐(Queue)에 저장하고, 소비자(Consumer)가 필요할 때 메시지를 가져가 처리하는 방식으로 동작한다.
일반적으로 마이크로 서비스, 이벤트 기반 아키텍처, 비동기 처리 등에 활용된다.


동작 방식

Producer & Consumer

  • Producer: 메시지를 생성하여 큐에 전송
  • Consumer: 큐에서 메시지를 가져와 처리

Queue 구조

  1. Producer가 메시지를 큐에 넣음 (Enqueue)
  2. MQ는 메시지를 저장하고 대기 상태로 유지
  3. Consumer가 메시지를 가져와 처리 (Dequeue)
  4. 메시지 처리 후 삭제 or 재처리 (ACK, Retry)

메시지는 FIFO(First In, First Out) 방식으로 처리되지만, 일부 메시지 큐 시스템에서는 우선순위(priority), 지연(delayed), 라우팅(routing) 등의 기능도 제공함.


장점

  • 비동기 처리
    Producer와 Consumer가 독립적으로 동작 - 빠른 응답 시간 보장
  • 서비스 간 결합도 감소 (Loose Coupling)
    직접 호출 방식(API 호출 등)보다 유연한 구조 -서비스 간 의존성 낮춤
  • 확장성(Scalability)
    여러 Consumer가 병렬로 메시지를 처리 가능 - 수평 확장(Scaling out) 지원
  • 내결함성(Fault Tolerance)
    메시지를 저장해 두고 Consumer가 장애 발생 시 복구 후 다시 처리 가능
  • 트래픽 버퍼링(Buffering)
    갑작스러운 요청 폭주를 큐에 저장하여 안정적인 서비스 운영 가능

주요 패턴

Point-to-Point (P2P)

  • 하나의 Producer - 하나의 Consumer
  • 메시지가 한 번만 처리됨
  • 예제: 주문 처리 시스템 (한 개의 주문을 한 개의 서비스가 처리)

Publish-Subscribe (Pub-Sub)

  • 하나의 Producer - 여러 Consumer
  • 메시지가 여러 Consumer에게 동시에 전달됨
  • 예제: 알림 시스템 (하나의 이벤트를 여러 구독자가 수신)

대표적인 Message Queue 시스템

Kafka (분산 메시지 큐 & 스트리밍 플랫폼)

  • 고성능, 높은 확장성
  • 로그 수집, 이벤트 스트리밍, 데이터 파이프라인에 주로 사용

RabbitMQ (AMQP 기반 메시지 브로커)

  • 복잡한 라우팅 및 메시지 패턴 지원
  • 금융 거래, 주문 처리 시스템에 적합

ActiveMQ (JMS(Java Message Service) 지원)

  • Java 기반 애플리케이션과 호환성이 좋음
  • 기업용 애플리케이션 메시징에 사용

Redis Pub/Sub (인메모리 메시징)

  • 빠른 속도, 캐시 및 메시징 기능 제공
  • 실시간 알림, 채팅 서비스에 적합

AWS SQS | GCP Pub/Sub | Azure Service Bus

  • 클라우드 기반 메시징 서비스
  • 서버리스 환경에서 쉽게 확장 가능

Kafka vs RabbitMQ 비교

특징KafkaRabbitMQ
기능메시지 스트리밍, 로그 저장고급 라우팅, 메시지 브로커
처리 방식Pull 방식 (Consumer가 메시지를 가져감)Push 방식 (Broker가 Consumer에게 메시지 전달)
성능높은 처리량 (Throughput)낮은 지연 시간 (Low Latency)
메시지 보존디스크에 저장 (오래 유지 가능)큐에서 소비되면 삭제
사용 사례실시간 데이터 처리, 이벤트 스트리밍금융, 주문 시스템, IoT 메시징

예제

Kafka 설정 (application.yml)

Kafka 관련 설정을 추가한다.

spring:
  kafka:
    bootstrap-servers: localhost:9092  # Kafka 브로커 주소
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer:
      group-id: my-group  # Consumer 그룹 ID
      auto-offset-reset: earliest  # 가장 처음부터 메시지 읽기
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

Kafka Producer (메시지 전송)

Kafka에 메시지를 전송하는 Producer를 생성한다.

import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

@Service
public class KafkaProducer {
    private final KafkaTemplate<String, String> kafkaTemplate;

    public KafkaProducer(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendMessage(String message) {
        kafkaTemplate.send("test-topic", message); // "test-topic"으로 메시지 전송
        System.out.println("Sent: " + message);
    }
}

Kafka Consumer (메시지 소비)

Kafka에서 메시지를 읽어오는 Consumer를 생성한다.

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

@Service
public class KafkaConsumer {

    @KafkaListener(topics = "test-topic", groupId = "my-group")
    public void listen(ConsumerRecord<String, String> record) {
        System.out.println("Received: " + record.value());
    }
}

정리

  • Message Queue(MQ)는 비동기 처리를 위한 핵심 기술로, 트래픽 제어, 마이크로서비스 간 통신, 이벤트 기반 시스템에 널리 사용됨.
  • Kafka, RabbitMQ, ActiveMQ 등 다양한 MQ 솔루션이 있으며, Kafka는 대용량 데이터 처리, RabbitMQ는 빠른 메시지 전송에 적합.
  • Java, Spring Boot 등과 쉽게 연동 가능하며, 클라우드 기반 SQS, Pub/Sub도 활용 가능.

비동기 처리 & 마이크로서비스 구축 시 Message Queue 사용을 고려해 보자.

profile
Turning Vision into Reality.

0개의 댓글