1. Kafka란?
Kafka는 분산 스트리밍 플랫폼으로 주로 실시간 데이터 피드의 빅 데이터 처리를 목적으로 사용된다. 또한 메시지 큐와 유사하지만 대용량 데이터 스트림을 저장하고 실시간으로 분석하거나 처리하는 데 중점을 둔다.
쉽게 말하자면 많은 데이터를 빠르고 안정적으로 전송하고 저장하는 중간다리 역할을 함!
Kafka는 왜 필요할까?
예를 들어 주문 서비스에서 주문을 생성하면 재고 서비스, 배달 서비스, 알림 서비스 등 여러 서비스가 주문 정보를 알고 있어야 하는데
이때, 직접 Order -> Stock, Order -> Delivery, Order -> Notification 이런식으로 REST API로 각각 호출을 하게 되면 서비스 간 결합도는 높아지고 실패에 민감해진다.
하지만, kafkaf를 쓰게 되면 한 번 발행해서 여러 곳에서 알아서 처리하게 만든다.(비동기 처리)
Order → Kafka (이벤트 발행)
↓
Stock, Delivery, Notification → Kafka에서 읽음
2. Kafka의 기본 구성 요소
1. 메시지(Message)
- 전달하고 싶은 데이터의 한 덩어리
- 예시
- "사용자 A가 로그인함"
- "주문 123번이 생성됨"
- "좌석 B4가 예약됨"
- 하나의 메시지는 보통 다음과 같이 생김
Key(선택) | Value(필수) | Timestamp |
"user-1" | "로그인 성공" | 2025-04-03 13:00 |
2. 프로듀서(Producer)
- Kafka로 메시지를 전송하는 역할, 서비스 간 통신에서 데이터를 Kafka로 던지는 쪽이 Producer이다.
- 예시
- 주문이 들어오면 OrderService가 Kafka에 "주문 생성됨"메시지를 보낸다.
- Sensor 장치가 온도 정보를 Kafka로 보낸다.
- Producer는 메시지를 Topic에 보낼 때 세가지 중 하나로 파티션을 선택한다.(메시지 순서가 중요할 때는 반드시 Key를 사용!)
방식 | 설명 |
Key 사용 | Kafka가 key 해시값으로 파티션 자동 결정 -> 같은 key는 같은 파티션으로 |
직접 지정 | partition=2처럼 코드에서 직접 지정 가능 |
Key 없음(기본) | Kafka가 라운드로빈 방식으로 파티션에 분산 |
3. 토픽(Topic)
- Topic은 메시지를 담는 카테고리 또는 채널이다. Kafka에서는 메시지를 직접 주고받지 않고, Topic을 통해 전달한다.
- 예시
- order-topic -> 주문 관련 메시지
- notification-topic -> 알림 관련 메시지
- Producer는 Topic에 메시지를 보냄
- Consumer는 Topic을 구독해서 메시지를 읽음
4. 파티션(Partition)
- Topic은 내부적으로 여러 파티션으로 분할되어 있으며 각 파티션은 메시지를 순서대로 저장하며, 병렬 처리를 가능하게 해준다.
- 예시
- order-topic에 3개의 파티션이 있으면 -> 3명의 Consumer가 동시에 처리 가능
- 메시지 순서 관련 팁
- 하나의 파티션 안에서는 순서가 보장된다.
- 여러 파티션에 걸치면 전체 순서는 보장되지 않는다.
5. 키(Key)
- Kafka 메시지에 포함되는 선택적인 값으로 메시지를 어느 파티션에 넣을지 정할 수 있다.
- 예시
- "user-123"이라는 키를 사용하면 -> 항상 같은 파티션에 저장됨 -> 같은 사용자 이벤트는 순서 보장 가능
- 실시간 분석, 사용자 이벤트 등은 Key를 꼭 지정해서 순서를 지켜주는 것이 좋다!
6. 컨슈머(Consumer)
- Kafka에서 메시지를 읽는 쪽이다.
- Consumer는 특정 Topic을 구독하고 새로운 메시지가 들어오면 순서대로 처리한다.
- 예시
- StockSerivce가 order-topic을 구독해서 -> 재고 차감 처리
7. 컨슈머 그룹(Consumer Group)
- 여러 Consumer가 팀을 이뤄 파티션을 나눠서 처리할 수 있게 해준다.
- 비유
- 택배 기사 여러 명이 각자 지역 맡아서 배송하는 구조
- 동작 방식
- 한 Consumer Group 안에서 파티션 수만큼 컨슈머가 메시지를 병렬로 처리함
- 하나의 파티션은 오직 한 Consumer에게만 할당됨.(같은 그룹 내에서)
8. 브로커(Broker)
- Kafka의 실제 메시지를 저장하고 처리하는 서버로 하나의 kafka 클러스터는 여러 개의 브로커로 구성된다.
- 예시
- broker-1, broker-2, broker-3이 있으면 -> 파티션이 브로커마다 분산 저장됨
- Kafka는 브로커 간에 복제(replication)도 지원해서 하나가 죽어도 데이터가 유지된다.
9. 주키퍼(Zookeeper)
- Kafka는 예전에는 Zookeeper를 통해 클러스터를 관리했지만 최근에는 KRaft모드를 통해서 Zookeeper 없이도 운영이 가능해졌다
3. Kafka와 RabbitMQ의 차이점
Kafka와 RabbitMQ는 둘 다 메시지를 전달하는 시스템이지만 목적이 다르기 때문에 사용 방식도 잘하는 것도 다르다.
- 설계 철학부터 다르다!
항목 | RabbitMQ | Kafka |
설계 목적 | 안정적인 메시지 전달, 메시지 큐 | 대용량 스트리밍 데이터 처리, 이벤트 저장소 |
핵심 개념 | 큐(Queue) 중심 | 토픽(Topic) + 파티션 중심 |
한 줄 요약 | 정확하고 빠르게 전달! | 많고 빠르고 오래 저장! |
- 메시지를 어떻게 다룰까?
항목 | RabbitMQ | Kafka |
구조 | 메시지를 큐에 넣고 순서대로 꺼냄 | 메시지를 토픽의 파티션에 저장, 각자 읽음 |
Producer -> Queue | 메시지를 넣으면 바로 사라질 수 있음 | 메시지를 넣어도 일정 시간 동안 계속 저장 |
Consumer | 메시지를 꺼내면 큐에서 사라짐 | 메시지를 꺼내도 그대로 유지(로그처럼) |
- 메시지 저장 방식
항목 | RabbitMQ | Kafka |
목적 | 단기 저장 | 장기 저장 |
저장 위치 | 메모리 or 디스크(선택) | 무조건 디스크에 저장 |
보존 기간 | 메시지를 읽으면 삭제 or 짧게 유지 | 설정된 기간 동안 보존(기본 7일 등) |
- 실제로 어디에 써야 할까?
사용 사례 | RabbitMQ가 적합 | Kafka가 적합 |
목적 | 빠른 작업 처리 | 대규모 데이터 수집/ 분석 |
구조 | Request/Response, 작업 분배 | 실시간 로그 수집, 스트리밍 처리 |
특징 | 즉시 처리, 1회 전달 | 데이터 재처리 기능, 확장성 우수 |
- RabbitMQ를 쓰면 좋은 예:
- 이메일 전송 작업 큐
- 비동기 요청 처리
- 단건 작업 분배
- Kafka를 쓰면 좋은 예:
- 사용자 행동 로그 수집(로그인, 클릭 등)
- 주문 이벤트 -> 배송 서비스, 알림 서비스 등 여러 곳에 전달
- 실시간 대시보드 데이터 전송
'Spring > Kafka' 카테고리의 다른 글
[Kafka] Kafka 메시지 전송, 소비 실습 (0) | 2025.04.05 |
---|
1. Kafka란?
Kafka는 분산 스트리밍 플랫폼으로 주로 실시간 데이터 피드의 빅 데이터 처리를 목적으로 사용된다. 또한 메시지 큐와 유사하지만 대용량 데이터 스트림을 저장하고 실시간으로 분석하거나 처리하는 데 중점을 둔다.
쉽게 말하자면 많은 데이터를 빠르고 안정적으로 전송하고 저장하는 중간다리 역할을 함!
Kafka는 왜 필요할까?
예를 들어 주문 서비스에서 주문을 생성하면 재고 서비스, 배달 서비스, 알림 서비스 등 여러 서비스가 주문 정보를 알고 있어야 하는데
이때, 직접 Order -> Stock, Order -> Delivery, Order -> Notification 이런식으로 REST API로 각각 호출을 하게 되면 서비스 간 결합도는 높아지고 실패에 민감해진다.
하지만, kafkaf를 쓰게 되면 한 번 발행해서 여러 곳에서 알아서 처리하게 만든다.(비동기 처리)
Order → Kafka (이벤트 발행)
↓
Stock, Delivery, Notification → Kafka에서 읽음
2. Kafka의 기본 구성 요소
1. 메시지(Message)
- 전달하고 싶은 데이터의 한 덩어리
- 예시
- "사용자 A가 로그인함"
- "주문 123번이 생성됨"
- "좌석 B4가 예약됨"
- 하나의 메시지는 보통 다음과 같이 생김
Key(선택) | Value(필수) | Timestamp |
"user-1" | "로그인 성공" | 2025-04-03 13:00 |
2. 프로듀서(Producer)
- Kafka로 메시지를 전송하는 역할, 서비스 간 통신에서 데이터를 Kafka로 던지는 쪽이 Producer이다.
- 예시
- 주문이 들어오면 OrderService가 Kafka에 "주문 생성됨"메시지를 보낸다.
- Sensor 장치가 온도 정보를 Kafka로 보낸다.
- Producer는 메시지를 Topic에 보낼 때 세가지 중 하나로 파티션을 선택한다.(메시지 순서가 중요할 때는 반드시 Key를 사용!)
방식 | 설명 |
Key 사용 | Kafka가 key 해시값으로 파티션 자동 결정 -> 같은 key는 같은 파티션으로 |
직접 지정 | partition=2처럼 코드에서 직접 지정 가능 |
Key 없음(기본) | Kafka가 라운드로빈 방식으로 파티션에 분산 |
3. 토픽(Topic)
- Topic은 메시지를 담는 카테고리 또는 채널이다. Kafka에서는 메시지를 직접 주고받지 않고, Topic을 통해 전달한다.
- 예시
- order-topic -> 주문 관련 메시지
- notification-topic -> 알림 관련 메시지
- Producer는 Topic에 메시지를 보냄
- Consumer는 Topic을 구독해서 메시지를 읽음
4. 파티션(Partition)
- Topic은 내부적으로 여러 파티션으로 분할되어 있으며 각 파티션은 메시지를 순서대로 저장하며, 병렬 처리를 가능하게 해준다.
- 예시
- order-topic에 3개의 파티션이 있으면 -> 3명의 Consumer가 동시에 처리 가능
- 메시지 순서 관련 팁
- 하나의 파티션 안에서는 순서가 보장된다.
- 여러 파티션에 걸치면 전체 순서는 보장되지 않는다.
5. 키(Key)
- Kafka 메시지에 포함되는 선택적인 값으로 메시지를 어느 파티션에 넣을지 정할 수 있다.
- 예시
- "user-123"이라는 키를 사용하면 -> 항상 같은 파티션에 저장됨 -> 같은 사용자 이벤트는 순서 보장 가능
- 실시간 분석, 사용자 이벤트 등은 Key를 꼭 지정해서 순서를 지켜주는 것이 좋다!
6. 컨슈머(Consumer)
- Kafka에서 메시지를 읽는 쪽이다.
- Consumer는 특정 Topic을 구독하고 새로운 메시지가 들어오면 순서대로 처리한다.
- 예시
- StockSerivce가 order-topic을 구독해서 -> 재고 차감 처리
7. 컨슈머 그룹(Consumer Group)
- 여러 Consumer가 팀을 이뤄 파티션을 나눠서 처리할 수 있게 해준다.
- 비유
- 택배 기사 여러 명이 각자 지역 맡아서 배송하는 구조
- 동작 방식
- 한 Consumer Group 안에서 파티션 수만큼 컨슈머가 메시지를 병렬로 처리함
- 하나의 파티션은 오직 한 Consumer에게만 할당됨.(같은 그룹 내에서)
8. 브로커(Broker)
- Kafka의 실제 메시지를 저장하고 처리하는 서버로 하나의 kafka 클러스터는 여러 개의 브로커로 구성된다.
- 예시
- broker-1, broker-2, broker-3이 있으면 -> 파티션이 브로커마다 분산 저장됨
- Kafka는 브로커 간에 복제(replication)도 지원해서 하나가 죽어도 데이터가 유지된다.
9. 주키퍼(Zookeeper)
- Kafka는 예전에는 Zookeeper를 통해 클러스터를 관리했지만 최근에는 KRaft모드를 통해서 Zookeeper 없이도 운영이 가능해졌다
3. Kafka와 RabbitMQ의 차이점
Kafka와 RabbitMQ는 둘 다 메시지를 전달하는 시스템이지만 목적이 다르기 때문에 사용 방식도 잘하는 것도 다르다.
- 설계 철학부터 다르다!
항목 | RabbitMQ | Kafka |
설계 목적 | 안정적인 메시지 전달, 메시지 큐 | 대용량 스트리밍 데이터 처리, 이벤트 저장소 |
핵심 개념 | 큐(Queue) 중심 | 토픽(Topic) + 파티션 중심 |
한 줄 요약 | 정확하고 빠르게 전달! | 많고 빠르고 오래 저장! |
- 메시지를 어떻게 다룰까?
항목 | RabbitMQ | Kafka |
구조 | 메시지를 큐에 넣고 순서대로 꺼냄 | 메시지를 토픽의 파티션에 저장, 각자 읽음 |
Producer -> Queue | 메시지를 넣으면 바로 사라질 수 있음 | 메시지를 넣어도 일정 시간 동안 계속 저장 |
Consumer | 메시지를 꺼내면 큐에서 사라짐 | 메시지를 꺼내도 그대로 유지(로그처럼) |
- 메시지 저장 방식
항목 | RabbitMQ | Kafka |
목적 | 단기 저장 | 장기 저장 |
저장 위치 | 메모리 or 디스크(선택) | 무조건 디스크에 저장 |
보존 기간 | 메시지를 읽으면 삭제 or 짧게 유지 | 설정된 기간 동안 보존(기본 7일 등) |
- 실제로 어디에 써야 할까?
사용 사례 | RabbitMQ가 적합 | Kafka가 적합 |
목적 | 빠른 작업 처리 | 대규모 데이터 수집/ 분석 |
구조 | Request/Response, 작업 분배 | 실시간 로그 수집, 스트리밍 처리 |
특징 | 즉시 처리, 1회 전달 | 데이터 재처리 기능, 확장성 우수 |
- RabbitMQ를 쓰면 좋은 예:
- 이메일 전송 작업 큐
- 비동기 요청 처리
- 단건 작업 분배
- Kafka를 쓰면 좋은 예:
- 사용자 행동 로그 수집(로그인, 클릭 등)
- 주문 이벤트 -> 배송 서비스, 알림 서비스 등 여러 곳에 전달
- 실시간 대시보드 데이터 전송
'Spring > Kafka' 카테고리의 다른 글
[Kafka] Kafka 메시지 전송, 소비 실습 (0) | 2025.04.05 |
---|