Apache Kafka
kafka는 분산 스트리밍 플랫폼으로서 메시지큐 역할을 할 수 있는 시스템이다.
대규모 실시간 데이터 스트림을 안정적으로 처리할수 있는장점이 있다.
message queue 는 뭘까?
발신자(Producer)가 전송한 메시지를 임시로 저장해 두었다가
수신자(Consumer)가 필요한 시점에 꺼내 처리할수 있도록 해주는 중간 버퍼(큐) 시스템이다.
- 비동기 처리: 발신자와 수신자가 동시에 동작하지 않아도 된다.
- 신뢰성: 메시지를 유실 없이 저장하고 전달한다.
- 버퍼링: 처리량 차이를 흡수해 서비스 안정성을 높인다.
- 확장성: 여러 Consumer를 두어 병렬 처리할 수 있다.
- 시스템 간 결합도 감소: 서비스들을 느슨하게 연결해 유지보수성이 좋아진다.
그럼 왜 쓸까?
사실 이게 가장 중요하다. 모든 기술은 도입할때 왜..? 가 필요하기때문이다.
예를 들어 채팅 서버(spring boot) 에서 메시지를 저장하고 해당 푸시알림까지 보낸다고 가정을 하겠다.
그럼 클라이언트에서 채팅 입력 -> spring boot 서버로 전송 -> 채팅 내용 DB 저장 + 알림을 전송하는 과정이 일어난다.
[사용자] → [Spring 서버] → [DB 저장 + 알림 전송] -> 그후 사용자에 응답
위 과정은 동기적으로 일어나게 되는데, 동기적으로 일어나게 되면 DB저장을 완료 한 후 알림을 전송하기 때문에 응답 지연이 발생하게 된다. (채팅 전송을 눌렀는데 서버 부하로 인해 응답이 오래 걸릴수도 있다.)
그럼 여기에서 kafka(메시지 큐)를 쓰게 되면 ?
[사용자] → [Spring 서버] → [메시지 큐]
↓
[알림 서버], [DB 저장 서버] 각각 처리
각 서버는 메시지 큐에만 던지고 바로 응답처리를 하게 된다.
메시지 큐로 보낸 서버들은 각각 비동기적으로 꺼내서 작업을 수행하게 된다.
Apache Kafka 실행하기
kafka는 버전별로 띄우는 방법에 차이가 있는데 기존에는 zookeeper 위에 kafka를 설치해서 둘다 설치해서 띄우는 방식이 필요했다. (도커 없이 윈도우로 구현하는 경우 여전히 이 방법이 편하다. ( 설치방법: https://veams.tistory.com/130 참고 )
kafka 4.0 버전부터는 그냥 kafka만 단독으로 띄워서 구현이 가능하다.
나는 window에 docker를 설치하였고 컨테이너를 띄워 구현하였다.
setting/docker-compose.yml
version: '3.8'
services:
kafka:
image: bitnami/kafka:4.0.0
container_name: kafka
ports:
- "9092:9092"
- "9093:9093"
environment:
- KAFKA_CFG_NODE_ID=1
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LOG_DIRS=/bitnami/kafka/data
- KAFKA_KRAFT_CLUSTER_ID=kraft-cluster-01
volumes:
- ./kafka_data:/bitnami/kafka
docker compose up -d
이렇게 작성하고 서버를 띄워 두었다.
kafka test
kafka는 위에서도 말했지만 발신자(Producer)가 전송한 메시지를 임시로 저장해 두었다가
수신자(Consumer)가 필요한 시점에 꺼내 처리할수 있도록 해주는 중간 버퍼(큐) 시스템이다.
이를 위한 약간의 정보들을 추가로 알아둘 필요가 있다.
용어설명
Producer (생산자) | 데이터를 Kafka에 전송하는 애플리케이션 메시지를 생산해서 topic으로 메시지를 보낸다. |
Topic (토픽) | 메시지를 분류하는 방식 (카테고리), 데이터를 구분하기 위한 저장소 kafka는 데이터를 지정된 토픽으로 주고 받는다. |
Consumer (소비자) | kafka의 topic에서 메시지를 꺼내 소비한다. |
나는 도커 기반으로 테스트를 진행해 보았다.
Topic 발행하기
컨테이너 내부에 접근해서
topic-test 라는 이름으로 토픽을 발행하였고.
안녕! 세상이라고 데이터를 입력해 저장해 두었다.
docker exec -it kafka bash
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic topic-test --partitions 1 --replication-factor 1
Topic 읽어들이기
위에 topic-test 로 작성한 topic 부분의 데이터를 읽어온다.
docker exec -it kafka bash
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic-test --from-beginning
이렇게 까지 구현하면 기본적인 카프카 구동 테스트는 완료된다.
다음엔 위 테스트를 spring boot에서 진행할 예정이다.
'프로젝트 > 미니 프로젝트' 카테고리의 다른 글
spring boot + apache kafka 를 활용한 미니 채팅앱 만들어보기(3) - socket.io를 활용한 채팅 구현하기 (0) | 2025.05.06 |
---|---|
spring boot + apache kafka 를 활용한 미니 채팅앱 만들어보기(2) - spring boot 에서 producer, consumer 구현하기 (0) | 2025.05.05 |
원격 로그 수집 시스템 구성하기 (elastic stack) (0) | 2022.11.17 |
데이터 백업 시스템 구성하기 (0) | 2022.10.26 |
Docker + PM2 + nestjs + winston.js를 활용한 무중단 운영 시스템 구축하기 (0) | 2021.08.25 |