안녕하세요. HYEN입니다.
개념적인 내용도 다루고 넘어가면 좋을 것 같아 오늘은 간단하게 마이크로서비스 아키텍처가 무엇인지에 대해 알아보도록 하겠습니다.
쿠버네티스를 공부하면서 많이 들어본 개념인데 이 개념을 탄탄하게 정리한 적은 없는 거 같아 늘 마음에 걸렸기 때문에...😉
Contents
1. 마이크로서비스 아키텍처(MSA)란?
마이크로서비스 아키텍처(MSA)는 시스템의 개별 기능을 서비스 단위로 잘라 서비스끼리 gRPC나 RESTful API 등으로 연계하여 시스템 전체를 구성하는 느슨한 결합(loose coupling) 아키텍처입니다.
전체 시스템을 여러 개의 작고 독립적인 부분으로 나누는 방식으로, 각 부분들은 특정한 업무나 기능을 담당하고 서로 통신하여 전체 시스템을 이루게 됩니다. 이러한 작고 독립적인 부분을 마이크로서비스라고 부르며, 이들은 독립적으로 배포하고 확장시키고 유지 보수 할 수 있습니다.
이를 통해 더 유연하고 확장성이 높은 시스템을 구성할 수 있으며 장애 발생 시 전체 시스템에 미치는 영향을 줄일 수 있습니다.
참고로, 마이크로서비스 아키텍처와 반대되는 개념은, 시스템 전체를 하나의 서비스로 구성한 모놀리식(monolithic) 아키텍처입니다.
2. 마이크로서비스 아키텍처(MSA)의 장점과 단점
장점은 다음과 같습니다.
- 각 서비스마다 프로그래밍 언어나 프레임워크 등의 기술을 자유롭게 선정할 수 있습니다. 각 서비스가 독립적으로 개발되는 마이크로서비스 아키텍처에서는 서비스별로 다른 기술 스택을 사용하는 것을 용이하게 합니다.
- 서비스별로 개발 규모나 성능을 확장시킬 수 있고 사용되는 코드가 상대적으로 적기 때문에 유연성이 높아지고 변경 사항을 롤백하는 것도 쉬워집니다.
- 특정 기능을 업데이트하거나 수정할 때, 해당 기능만 빠르게 배포할 수 있기 때문에 전체 시스템의 불필요한 재배포를 최소화할 수 있고 더 빠르게 개발할 수 있습니다. 즉, 서비스별로 독립적인 업데이트가 가능하여 릴리즈 사이클을 단축시킬 수 있으며 장애 영향 범위도 해당 서비스에 한정시킬 수 있게 됩니다.
쿠버네티스는 이러한 마이크로서비스 아키텍처와 잘 맞습니다.
마이크로서비스 아키텍처를 따르는 시스템을 쿠버네티스에 배포하게 되면, 한 개의 마이크로서비스를 한 개의 이미지로 개발하고 이를 한 개의 Deployment로 배포할 수 있습니다.
각 서비스 당 각기 다른 이미지 및 Deployment를 사용하기 때문에 독립적으로 개발할 수 있으며 더 유연하게 확장할 수 있게 됩니다.
단점은 다음과 같습니다.
- 여러 개의 독립적인 마이크로서비스를 구축하고 배포하고 처리하는 것은 복잡도가 높고 구현하기도 어렵습니다. 각 서비스가 어떻게 작동하는지, 다른 서비스들과 어떻게 통신하고 조화를 이루어야 하는지 이해하는 과정이 필요할 수 있습니다.
- 여러 프로그래밍 언어나 프레임워크를 사용하기 때문에 다른 마이크로서비스에서 사용했던 코드를 재사용하는 것이 어려울 수 있습니다.
- 전체 시스템 측면에서 볼 때, 네트워크 트래픽이 증가한다는 단점이 있을 수 있습니다. 각 서비스가 모두 독립적이기 때문에 서로 네트워크를 통해 통신해야 하는데, 이는 트래픽을 증가시키고 불필요한 레이턴시를 발생하게 할 수 있습니다.
- 하나의 시스템을 여러 마이크로서비스로 적절하게 분리하기 어려울 수도 있습니다.
- 시스템 전체에 대한 모니터링이 어렵습니다. 여러 마이크로서비스가 하나의 시스템을 구성하고 있기 때문에 각 서비스들의 의존성을 확인하거나 서비스 간 트래픽 레이턴시 등을 확인하기 어렵습니다.
따라서 작은 규모의 프로젝트거나, 하나의 기술 스택을 사용하여 개발이 가능한 경우 마이크로서비스 아키텍처를 도입하는 것은 오히려 추가적인 복잡성을 초래할 수 있기 때문에 도입 시 신중한 고려가 필요합니다.
또한 서비스 간 통신이 많이 발생하는 서비스일 경우 성능에 문제가 발생할 수 있기 때문에 마이크로서비스가 적절하지 않을 수 있습니다.
참고로, 상기 언급한 단점들 중 시스템 전체에 대한 모니터링이 어려운 점을 '서비스 매시'로 해결할 수 있습니다. 이에 대해서는 다음 글에서 다뤄보도록 하겠습니다.
'TOPIC > DevOps' 카테고리의 다른 글
클라우드 네이티브란? (0) | 2024.04.22 |
---|---|
Service Mesh란? (0) | 2024.04.15 |
Jenkins - GitHub Private하게 연결하기 (2) (0) | 2024.04.10 |
Jenkins - GitHub Private하게 연결하기 (1) (0) | 2024.04.10 |
Windows에 Jenkins 설치하기 (0) | 2024.04.02 |