Kafka는 대규모 데이터를 빠르고 안정적으로 처리·전달하기 위한 분산 메시징 플랫폼을 말한다.
메시지 브로커(Message Broker)
생산자(Producer)
주문 생성 이벤트를 발행소비자(Consumer)
주문 생성 이벤트를 구독해서 배송 요청 처리브로커(Broker)
토픽(Topic)
order-events, user-login-events파티션(Partition)
로그 구조 저장
오프셋(offset)
| 특징 | 설명 |
|---|---|
| 고성능 / 고처리량 | 초당 수십~수백만 건의 메시지 처리 가능 |
| 확장성 | 브로커와 파티션을 늘려 부하를 분산 가능 |
| 내구성 / 장애 복구 | 메시지를 디스크에 저장하고 복제(replication)하여 장애 시에도 데이터 유실 방지 |
| 실시간 처리 | 스트림 데이터를 실시간으로 처리 (예: IoT 센서, 로그, 결제 이벤트 등) |
| Pub/Sub 구조 | 한 Producer가 보낸 메시지를 여러 Consumer가 동시에 구독 가능 |
| 키워드 | 설명 |
|---|---|
| 실시간 스트리밍 | 데이터가 생성되는 즉시 전달 |
| 분산 처리 | 여러 서버(브로커)가 병렬로 처리 |
| 높은 내구성 | 로그 기반 저장 + 복제 |
| 확장성 | 파티션 확장으로 처리량 증가 |
| 사용 분야 | 실시간 로그, IoT, 이벤트 기반 마이크로서비스 |
| 사례 | 설명 |
|---|---|
| 로그 수집 시스템 | 각 서버의 로그를 Kafka에 모은 뒤 ELK(ElasticSearch, Logstash, Kibana)로 전송 |
| 주문/결제 이벤트 처리 | 주문, 결제, 배송 서비스를 비동기 이벤트 기반으로 연결 |
| 실시간 데이터 분석 | 클릭스트림, 트래픽 데이터, 금융 거래를 실시간 분석 |
| IoT 데이터 스트리밍 | 수많은 센서 데이터 실시간 수집 및 처리 |
| 데이터 파이프라인 중간 버퍼 | Spark, Flink, Hadoop 등으로 데이터를 전달하는 중간 허브 역할 |
Spring Boot에서는 Spring for Apache Kafka 라이브러리로 쉽게 연동할 수 있다.
// Producer 예시
@Service
@RequiredArgsConstructor
public class OrderProducer {
private final KafkaTemplate<String, String> kafkaTemplate;
public void sendOrderEvent(String orderData) {
kafkaTemplate.send("order-created", orderData);
}
}
// Consumer 예시
@Component
@KafkaListener(topics = "order-created", groupId = "delivery-service")
public void consumeOrderEvent(String message) {
System.out.println("받은 주문 이벤트: " + message);
}
Producer → [Kafka Broker] → Consumer
| Topic |
┌──────────────┐
│ Partition 0 │ → 메시지 A, B, C ...
│ Partition 1 │ → 메시지 D, E, F ...
└──────────────┘
| 항목 | Kafka | RabbitMQ |
|---|---|---|
| 구조 | 로그 기반 분산 스트리밍 | 큐 기반 메시지 브로커 |
| 메시지 순서 | 파티션 단위 순서 보장 | 큐 단위로 메시지 순서 보장 |
| 처리 목적 | 대규모 데이터 스트림 (실시간 분석) | 트랜잭션성 메시징 (요청-응답, 워크큐 등) |
| 저장 방식 | 디스크 로그에 저장 (내구성 높음) | 메모리 중심 (빠름, 하지만 유실 가능성 있음) |
| 소비 방식 | Consumer Group 단위로 병렬 처리 | 각 큐에 한 소비자 그룹만 처리 |
| 사용 예 | 로그, 이벤트, IoT, 데이터 파이프라인 | 주문 처리, 이메일 발송, 알림 등 |
Kafka는 RabbitMQ 같은 메시지 큐보다 더 큰 규모, 로그 저장/스트리밍 처리에 특화된 게 특징이다.
- RabbitMQ: 작업 큐, 요청/응답 패턴, 비동기 작업 처리 등 전통적인 메시지 큐 사용 사례에 적합.
- Kafka: 실시간 데이터 스트리밍, 로그 수집 및 분석, 이벤트 소싱 등 대규모 데이터 스트림 처리에 적합.