프로젝트/공모주 알리미 클론 (개인)

알림 서비스 클론 코딩 : (2) 프로젝트 설계 V2 + Kafka 추가하기

가을맛 2025. 3. 14. 02:51

 

 

간단 결제 시스템 구현 : (2) Mono 제대로 써보기

김영한 자바 고급 편 완강 기념(?)으로 이번 시간에는 예전에 결제 시스템 분석하면서 만들어봤던 샘플 코드를 리펙토링 해보려고 한다. 비동기 + 멀티스레드 중심으로 리팩터링 할 요소를 찾아

dev-jhl.tistory.com

 

김영한 자바 고급 편 완강 기념으로 이전에 했던 결제 시스템을 리팩토링 해보려고 했는데, 생각보다 할게 없어서? 확신의 멀티스레딩인 알림 서비스로 다시 돌아왔다.  V1은 간단하게 만든답시고 원본 아키텍처를 심하게 손질했었는데 (...) 제대로 다시 만들면 그래도 꽤 비동기 멀티스레딩 다운 프로젝트가 될 것 같다.

 

 

GitHub - hyerijang/demo-notification-system: 개인 프로젝트 - 알림 시스템 Consumer 클론코딩

개인 프로젝트 - 알림 시스템 Consumer 클론코딩. Contribute to hyerijang/demo-notification-system development by creating an account on GitHub.

github.com

 

 

 

V1 : 기능은! 한다!

아키텍처 V1

 

V1의 경우 멀티 스레딩 + 동시성 공부하면서 간단히 구현해보는게 목적이었기 때문에 실제 아키텍처와 다르게 최대한 간단히 설계해 봤었다. Kafka 깔기 귀찮음(...) 이슈로 그냥  Blocking Queue를 활용해서 Producer Consumer 를 코드로 구현해서 동작만 모방했다, 이게 생각보다 어려웠고, 왜 카프카를 쓰는지 이해해버렸다. 메세지 플랫폼과 HTTP 통신하는 부분도 Thread.sleep으로 20ms 재워놓고 대충 통신했다고 치고 넘어갔다.  좀 너무했나..?   

 

V2 : 좀 더 발전시켜보기 + Kafka

위 구조의 문제점은 : 내 서버 <-> 메세지 플랫폼간 통신하는 20ms 동안 스레드가 놀면서 기다리고 있다는 점이다. 즉, 메세지 전송 + 전송 결과 수신을 하나의 스레드에서 처리하고 있어서 스레드 낭비가 있다. ( + 단일 책임 원칙 위반)

따라서 메세지 전송, 전송 결과 수신을 다른 스레드 풀에서 담당하게 하면, 좀 더 효율적으로 일할 수 있을 것 같다. 

 

아키텍처 V2

 

위 구조에서 메세지 플랫폼 발송 결과 처리 컨슈머(kafka consumer), 발송 결과 처리 스레드 풀이 추가되었다,

 

사실 이번에도 Consumer Producer 구현해서 스레드 풀을 각각 만들어서 써볼까? 했는데, 음.... Kafka를 쓰는게 더 쉽고, 코드 복잡도가 낮아질 듯 싶어서 Kafka를 추가 해보려고한다.  AWS 쓰기엔 돈이 없어서 ㅠㅠ 로컬 환경에서 Docker Compose로 구성해보았다.

 

멀티 브로커 kafka 구성하기

 

[Kafka] Docker Compose로 멀티브로커 Kafka 구성하기

 

devocean.sk.com


Kafka 구성은 위 블로그 글을 그대로 따라했다. 설명이 친절해서 그냥 읽어보면서 시키는 대로 복붙복붙 하면 됨 

 

topic 생성하기

다른 블로그 글 보면서 따라하다가 이 부분에서 자꾸 막혀서 슬펐는데, docker-compose 내부의 서비스 이름으로 접근하므로 kafka-1, zookeeper-1 의 형태로 접근한다! (이 부분은 본인이 ymal을 어떻게 썼느냐에 다라 달라질 것이다.)

 

 

# docker-compose exec {서비스이름} kafka-topics --create --topic {토픽명} --bootstrap-server {서비스이름}:9092 --replication-factor 3 --partitions 2

docker-compose exec kafka-1 kafka-topics --create --topic my-topic --bootstrap-server kafka-1:9092 --replication-factor 3 --partitions 2

 

위의 커맨드에서 my-topic 을 자신이 쓸 토픽명으로 바꾸고, replica 수랑 patrition 수를 원하는대로 조정하면 된다.

나 같은 경우 topic이 2개 필요해서 2번 만들었고, replica와 partition 수는 broker 수와 동일하게 3으로 설정했다.

  • dev.ipo-message-request.v1 (메세지 전송 요청)
  • dev.ipo-message-platform-result.v1 (메세지 플랫폼 전송 결과 수신)

 

Kafka-UI Tool 추가하기

 

Kafka-UI Tool 을 이용하여 Kafka 관리하기

 

devocean.sk.com

 

CLI 로 쓰다보니 좀 불편해서 ㅎㅎ UI를 하나 추가했다. 위 블로그 글을 참조했다. 

docker-compose -f docker-compose-kafka-ui.yaml up -d   


docker-compose-kafka-ui.yaml 를 작성 후 해당 파일이 있는 위치에서 위 명령어를 실행하고 http://localhost:8989/ 로 접근하면 아래와 같은 대시보드를 확인할 수 있다.

 

이제 내 kafka 클러스터에 관한 정보를 좀 더 편하게 확인할 수 있다! 

 

GUI 가 있으면 이렇게 간단히 메세지를 생성해서 테스트에 쓸 수 있다.