MSA 구현하기(1) - 개념 정리
Skala 과정에서 마이크로 서비스 아키텍처 구조에 대해 새롭게 알게 되었습니다.
배운 것을 실제로 구현해보기 위해 이 여정을 시작하기로 했습니다.
시작하기 앞서, 마이크로 서비스 아키텍처란 무엇인지, 전체적인 시스템 아키텍처는 어떻게 구성을 할 것인지에 대해 정리를 하고 다음으로 넘어 갈 예정입니다..!
마이크로 서비스 아키텍처(MSA)란?
제가 이해한 마이크로 서비스 아키텍처란,
하나의 서버로만 이루어져있던 기존의 서버 구조(모놀리식 구조)를 기능을 기준으로 여러 개로 나누어 365일 24시간 서비스가 기동할 수 있도록 만들기 위해 등장한 아키텍처 구조입니다.
정확한 의미는 여기를 참고해주세요!
마이크로 서비스 아키텍처의 등장으로 인해 유저, 상품, 결제 기능 중 하나에 장애가 발생하더라도, 장애가 발생한 기능 외에 다른 기능을 사용하는 데에는 문제가 없도록 서버가 가동되는 것이 가능해졌습니다!
MSA의 가장 큰 장점이자 단점은 서버가 분리되어 있다는 점입니다.
서버가 분리되어 있기 때문에 무중단 배포 및 운영에는 용이할 지라도, 구현 및 운영의 복잡도가 증가할 수 있고, 데이터베이스가 분리되어 있다보니 데이터베이스 간 데이터의 일관성이 깨질 수 있습니다.
쿠버네티스란?
마이크로 서비스 아키텍처를 이야기하기 위해서는 쿠버네티스도 빠질 수 없습니다.
쿠버네티스는 마이크로 서비스 아키텍처를 실제로 무중단으로 서비스하기 위해 꼭 필요한 기술입니다. 공식 문서
제가 이해한 쿠버네티스를 기반으로 그림을 그려보았습니다.
쿠버네티스는 마스터노드와 워커노드들로 구성되어 있습니다.
마스터노드에 있는 API 서버로 유저의 요청을 받아 각 워커노드들에 명령을 내리고, controller manager를 통해 각 노드들의 자원 상황을 고려하여 적절히 pod를 분배합니다.
각 pod는 한 개 이상의 container를 포함합니다. 이는 사용자가 지정할 수 있습니다.
API Server에서 사용자로부터 명령받은 대로 Kublet이 Docker를 이용하여 container를 구동합니다.
이러한 일련의 과정들은 마이크로 서비스 아키텍처 구조에서 꼭 필요로 할 수 밖에 없습니다.
왜냐하면, 아키텍처 구조 상 배포해야 할 서버가 여러 개이고, 각 서버에 오류가 생길 때마다 수동으로 이를 해결하기는 거의 불가능에 가깝습니다.
따라서 쿠버네티스는 마이크로 서비스 아키텍처를 안정적으로 서비스하기 위해 꼭 필요한 기술입니다.
쿠버네티스의 본격적인 적용은 기본적인 API 설정 및 통신이 안정적으로 진행되는 것을 확인한 이후에 차차 진행할 예정입니다.
Kafka란?
Kafka는 마이크로 서비스 아키텍처의 치명적(?)인 단점인 데이터베이스 간 데이터의 일관성을 극복하기 위해 쓰일 기술입니다.
Producer가 특정 Topic을 지정하여 Kafka에 메시지를 보내면, 해당 토픽을 구독하고 있던 Consumer가 메시지를 읽습니다.
이때 메시지에 바뀐 데이터를 json 형태로 전송하면 Consumer측 서버가 json으로 전달된 데이터를 바꾸어 데이터를 일관성 있게 유지할 수 있습니다.
구현하게 될 MSA 서버의 구조
앞서 마이크로 서비스 아키텍처와 쿠버네티스, Kafka를 살펴보았습니다.
이제 실제 구현하게 될 서비스의 아키텍처를 그려보겠습니다!
각 서버는 모두 Spring Boot(Java, Maven)를 이용하여 구현할 예정이고, API Gateway 서버에만 Rest API 대신 GraphQL을 적용할 것 입니다. DB로는 MariaDB를 사용합니다.
Kafka의 한계로 인한 MariaDB의 FEDERATED 엔진 사용
User DB에 보이는 연결 표시와 Order Table, Item Table은 FEDERATED 엔진을 이용하여 외부 데이터베이스와 링크 된 테이블을 의미합니다.
Kafka를 이용하여 데이터베이스의 일관성을 유지할 수는 있지만, 데이터베이스가 분리되어 있는 관계로 디비 간 Join을 이용한 자유로운 Select가 불가능 한 점을 MariaDB의 FEDERATED 엔진을 이용하여 극복하고자 합니다.
MariaDB의 FEDERATED 엔진을 이용하면 실시간으로 외부의 데이터베이스에 있는 테이블을 참조합니다.
User가 등록한 Item 목록을 조회하고 싶거나, User의 Order 목록을 조회하고 싶을 때 사용합니다.
2025.03.14
API Gateway에서 Aggregation 기술을 사용하여 이 귀찮은 과정을 모두 생략하게 되었습니다 ☺️
Rest API 대신 GraphQL?
GraphQL을 선정하게 된 이유는, Rest API에 비해 프론트엔드와 통신을 하기에 프론트 입장에서 편리한 점도 있고, API를 요구사항에 맞추어서 같은 기능이지만 다른 반환값을 리턴하는 비슷한 API를 여러 개 만들지 않아도 된다는 편리함이 있었습니다.
또한, MSA 환경에서 GraphQL을 사용하는 비중이 커진다는 블로그 글(..)을 보았기 때문에 처음 접해보는 기술이지만 이왕 MSA, Kafka, Eureka, API Gateway를 모두 처음 접해보는 김에 하나라도 더 배워보고 싶어서 선정하게 되었습니다!
앞으로 차근차근 구현하게 될테니 천천히 따라와주세요,,!! 🥵 (처음에는 로컬 환경에서 실습을 진행할 예정입니다)
참고 링크
