🖥️ CS/Architecture
[마이크로서비스 아키텍처 구축] 3. 모놀리스 분해
한국의 메타몽
2024. 10. 19. 18:56
해당 글은 마이크로서비스 아키텍처 구축에서 학습한 내용을 다룹니다.
목차
- 모놀리스가 적이 경우는 드물다
- 무엇을 MSA로 먼저 전황해야할까?
- MSA 전환 방식 - 교살자 무화과 패턴(Strangler Fig Pattern)
- MSA의 DB 이슈
1. 모놀리스가 적인 경우는 드물다
MSA
에서 성취하고자 하는 것을 명확하게 이해하지 못하면MSA
를 만드는데만 집착하게 될 수 있고, 이는MSA
도입 후 새로운 복잡성을 도래한다- 다시 말하지만 Monolithic != 레거시 라는 것을 기억하자
- 시스템을 조기에
MSA
로 분해하면 많은 비용이 발생한다 (특히 해당 프로젝트의 도메인 지식이 없는 사람은 더더욱) - 때문에
MSA
로 분해하려는 기존 코드베이스를 보유하는 것이 처음부터 MSA를 진행하는 것 보다 훨씬 빠르고 쉽다
나의 사례
- 생각해보니 회사에서
Monolithic
->MSA
로 전환할 때, 외부 API를 호출하는 부분에서 단순OpenFeign
으로 외부 API를 호출하는 것이 아닌, 프로젝트 내부에 멀티 모듈을 통해서 외부 도메인에 대해 API를 호출하는 로직이 있었다 - 초기에는 모듈을 가지고 있지만, 나중에는 점점
OpenFeign
으로 API를 호출하는 방향, 즉, 모듈에 대한 의존성을 제거하는 방향으로 간다고 했다 (여기서 일부 모듈은 또 다른MSA
프로젝트로 생성될 예정) - 모듈 안에서도 최종적으로는
OpenFeign
으로 외부 API를 호출하는데, 굳이 왜 모듈을 추가한걸까? - 이는 초기 개발 속도를 빠르게 하기 위함이었다 (중복코드 제거, 재사용성 상승, 코드의 일관성 유지 등)
2. 무엇을 MSA로 먼저 전환해야할까?
MSA
전환이 필요한 이유를 중점으로 생각해야 함- 어플리케이션 확장을 원하면 부하 처리 능력을 제한하는 기능이 가장 높은 순위
- 서비스 출시 시간을 단출하고 싶으면 자주 변동되는 기능을 찾아 MSA로 전환
CodeScene
같은 정적 분석 도구로 어플리케이션의 핫스팟 분석 가능
3. MSA 전환 방식 - 교살자 무화과 패턴 (Strangler fig pattern)
- 레거시 시스템을 점진적으로 교체하여 레거시 시스템을 단계적으로 페이드 아웃
- 단계적으로 이루어지기 떄문에 단기간에는 이룰 수 없음
4. MSA의 DB 이슈
MSA
로 아키텍쳐가 구성될 경우 결국 한 마이크로서비스 당 최소 1개의 고유 DB를 갖게된다.
그리고 대다수의 성능 이슈는 여기서 발생한다.
(1) DB Join
- DB 조인이 불가능하며, 자체적으로 마이크로서비스 자체로 조인 작업을 해야함
- 같은 DB에서 자체 조인이 가능했던
Monolithic
보다 속도가 빨라지기 힘듦
- 같은 DB에서 자체 조인이 가능했던
(2) 데이터 무결성
- 서로 다른 DB에서는 더 이상 데이터 모델의 무결성을 강제할 수 없음
- 대처 패턴이 방법이 될 수 있는데, 데이터 삭제시 식제로 사제가 진행되는 물리적 삭제, 즉,
Hard Delete
가 아닌 논리적 삭제인Soft Delete
를 실행- ex :
SET isDelete = true
- ex :
(3) 트랜잭션
- MSA에서 트랜잭션의 안정성을 보장하는데 한계가 존재
- 분산 트랜잭션으로 대응책은 가능하나, 구현의 복잡성 및 적용 범위의 한계가 명확
- 관련 개념으로 사가(SAGA) 패턴 존재