본문 바로가기

프로젝트/미니 프로젝트

spring boot + apache kafka 를 활용한 미니 채팅앱 만들어보기(1) - kafka 개요 및 테스트

Apache Kafka 

 

kafka는 분산 스트리밍 플랫폼으로서 메시지큐 역할을 할 수 있는 시스템이다.

대규모 실시간 데이터 스트림을 안정적으로 처리할수 있는장점이 있다.  

 

message queue 는 뭘까?

 

발신자(Producer)가 전송한 메시지를 임시로 저장해 두었다가

수신자(Consumer)가  필요한 시점에 꺼내 처리할수 있도록 해주는 중간 버퍼(큐) 시스템이다.

  • 비동기 처리: 발신자와 수신자가 동시에 동작하지 않아도 된다.
  • 신뢰성: 메시지를 유실 없이 저장하고 전달한다.
  • 버퍼링: 처리량 차이를 흡수해 서비스 안정성을 높인다.
  • 확장성: 여러 Consumer를 두어 병렬 처리할 수 있다.
  • 시스템 간 결합도 감소: 서비스들을 느슨하게 연결해 유지보수성이 좋아진다.

 

즉 메시지큐는 메시지를 하나씩 꺼내먹어 처리하면 된다. https://blog.nongshim.com/1759

 

그럼 왜 쓸까?

사실 이게 가장 중요하다. 모든 기술은 도입할때 왜..? 가 필요하기때문이다.

 

예를 들어 채팅 서버(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 서버

 

 

 

 

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

 

해당 topic-test에 저장된 메시지를 읽어오는데 성공하였다.

 

 

 

터미널 두개를 띄워 테스트하기

 

이렇게 까지 구현하면 기본적인 카프카 구동 테스트는 완료된다. 

 

 

다음엔 위 테스트를 spring boot에서 진행할 예정이다.

반응형