신한 해커톤이 끝나고 완성된 프로젝트에 신규 기능을 붙여서 확장하는 프로젝트를 시작하려고 한다. 이때 개발을 시작하기 위한 설계를 어떻게 하였는지 공유해보겠습니다.
우리는 기존 해커톤 팀에서 3명이 추가투입 되어 기존 3인, 추가된 팀원 3인이 협업하는 구조로 시작했다.
그렇게 기존 완성된 어플에서 쇼핑몰 서비스와 주식 투자 서비스를 추가하여 개발하려고 하였고,
이 상황에서 기존 서버와 결합도를 낮춰 개발하고 싶었고, MSA구조로 각각의 DB와 서버를 통해 개발한 후 둘 다 연관된 트랜잭션에 SAGA 패턴을 적용해서 분산 트랜잭션을 적용하려고 하였습니다.
그렇게 이와같은 정말 큰 그림만 잡은 아키텍처를 그렸습니다.
기존 쏠쏠해영의 입출금 계좌 서비스와 증권 계좌 서비스를 분리하여 MSA 아키텍처를 구상했습니다.
하지만 kafka에 요청이 진입되는 부분이 틀렸고, GateWay와 SAGA 패턴을 위한 오케스트레이션을 어떻게 설정할 것인지 고민했습니다.
많은 자료들을 찾아가면서 조금 더 구체화 된 인프라를 구축해보려고 했습니다.
EC2 두대에 서비스를 분리해서 담아주고 SAGA 오케스트레이터를 메인 서버에 담았습니다.
Kafka Cluster도 EC2-1 에 배포하여 두 서비스에서 에러가 발생했을 때 보상 거래를 담을 수 있도록 설계하였고 이 그림을 통해 컨설턴트님에게 피드백을 받았습니다.
받은 피드백
1. SAGA 오케스트레이터가 저기에 구현된다면 무거워 지고, Application 서버가 다운되었을 때 그럼 전부 다운되는 구조인 것 같다. 결합도가 높아진다.
2. GateWay를 달아줘서 Prefix를 통해 분기해서 결합도를 더욱 낮춰라
많은 회의를 거치고 결국 EC2 한대에 docker를 여러대 띄워서 분리 운영 하는 것으로 설계하였다. 그리고 Nginx를 도입하였고, 리버스 프록시를 통해 요청이 한 곳에만 쌓이도록 설정하였다.
또한 오케스트레이터를 도입해서 보상거래를 담당할 수 있도록 처리하였고, 디버깅과 모니터링이 용이하도록 설계하였다.
추가로 현재는 오케스트레이터에서 보상거래가 아닌 정상 요청을 담당할 수 있도록 설정할 지, 정상 요청은 HTTP를 통해 동기 요청을 보낼 지 선택하는 과정이고 일단 동기적으로 요청을 보내고 예상치 못한 에러 발생 시에 오케스트레이터를 통해 보상거래를 할 수 있도록 진행하려고 합니다.
MSA 아키텍처를 적용해서 개발을 시작할 것이고, 더욱 현대화된 아키텍처를 도입할 것 같다.
이 많은 docker 컨테이너를 활용하면서 굉장히 많은 에러와 위기를 겪을 것 같은데 쿠버네티스를 사용해야 한다는 필요성을 느낄 수 있지 않을까? 하는 생각을 가지고 개발을 시작할 것 같습니다.