🌟 MSA (Microservices Architecture) 개념
- 정의: 애플리케이션을 작은 독립적인 서비스들로 분리하여 개발, 베포, 운영하는 아키텍처 스타일.
- 각각의 서비스는 특정 기능이나 도메인을 담당하며 독립적으로 배포 및 확장될 수 있음.
📌 MSA 특징
- 서비스의 독립성
- 각 서비스는 독립적으로 배포, 개발, 운영할 수 있음.
- 특정 서비스의 문제 발생 시 다른 서비스에는 영향을 주지 않도록 할 수 있음.
- 모듈화 & 단일 책임의 원칙 (Single Responsibility Principle)
- 서비스는 특정 비즈니스 기능에 집중하여 구현됨.
- 예를 들어, 사용자 관리 서비스, 주문 처리 서비스, 결제 서비스 등으로 분리될 수 있음.
- 데이터 독립성
- 각 서비스는 자체 데이터베이스를 가질 수 없음.
- 데이터 일관성을 유지하기 위해 서비스 간 통신은 메시지 기반 또는 API 호출로 이루어짐.
- 확장성 (Scalability)
- 필요한 서비스만 독립적으로 확장할 수 있음.
- 예를 들어, 사용자 요청이 많이 몰리는 인증 서비스만 확장할 수 있음.
- 기술 스택 독립성
- 각 서비스는 서로 다른 기술 스택을 사용할 수 있음.
- 예를 들어, 일부 서비스는 Java(Spring Boot), 다른 서비스는 Node.js로 구현 가능.
📌 MSA의 구성 요소
-
API Gateway
- 클라이언트의 요청을 받아 적절한 서비스로 라우팅하는 역할.
- 인증, 로깅, 로드 밸런싱, Rate Limiting 등의 기능을 포함.
-
Service Discovery
- 서비스 인스턴스를 동적으로 등록하고 검색할 수 있도록 지원.
- 예: Netflix Eureka, Consul, etcd.
-
Load Balancer
- 트래픽을 여러 서비스 인스턴스에 분산하여 부하를 균등하게 분배.
-
Communication Protocol
- 서비스 간 통신은 주로 HTTP/REST, gRPC, 메시지 브로커(Kafka, RabbitMQ등) 등을 사용
-
Configuration Management
- 각 서비스의 설정 정보를 중앙에서 관리하고 배포.
- 예: Spring Cloud Config, Consul.
-
Monitoring & Logging
- 각 서비스의 상태를 모니터링하고 로그를 수집하여 분석.
- 예: ELK Stack(Elasticsearch, Logstash, Kibana), Prometheus, Grafana.
📌 MSA의 장점
- 유연한 확장성
- 서비스별로 독립적으로 확장 가능하여 리소스를 효율적으로 사용할 수 있음.
- 개발 속도 향상
- 작은 팀 단위로 독립적인 서비스를 개발할 수 있어 전체 개발 속도를 증가시킴.
- 장애 격리 (Fault Isolation)
- 특정 서비스에 문제가 발생하더라도 전체 시스템에는 영향을 최소화할 수 있음.
- 다양한 기술 사용 가능
- 팀별로 적합한 기술을 자유롭게 선택할 수 있음
📌 MSA의 단점
- 복잡성 증가
- 서비스가 많아질수록 관리 및 운영이 복잡해짐.
- 데이터 일관성 문제
- 서비스 간 데이터베이스를 공유하지 않기 때문에, 데이터 일관성을 유지하는 것이 어려울 수 있음
- 통신 비용 증가
- 서비스 간의 네트워크 호출이 증가하여 성능에 영향을 줄 수 있음.
- 테스트의 어려움
- 분산된 서비스 구조로 인해 전체 시스템 테스트가 어려워질 수 있음.
📌 MSA와 모놀리식 아키텍처
| 특징 | MSA (Microservices Architecture) | 모놀리식 아키텍처 (Monolithic Architecture) |
|---|
| 배포 방식 | 개별 서비스 별로 독립적 배포 가능 | 전체 애플리케이션을 한 번에 배포 |
| 확장성 | 필요한 서비스만 독립적으로 확장 가능 | 전체 애플리케이션을 확장해야 함 |
| 장애 격리 | 특정 서비스 장애가 전체 시스템에 영향 없음 | 전체 시스템이 중단될 수 있음 |
| 복잡성 | 서비스 관리 및 통신 구조가 복잡 | 단순하고 관리가 용이 |
| 데이터 접근 | 서비스별로 독립적인 데이터베이스 사용 | 하나의 데이터베이스 공유 |
| 기술 선택 | 서비스별로 다른 기술 스택 사용 가능 | 동일한 기술 스택 사용 |
| 개발 속도 | 독립적인 서비스 개발로 병렬 작업 가능 | 하나의 애플리케이션으로 병목 발생 가능 |
| 테스트 용이성 | 개별 서비스 테스트 가능 | 전체 애플리케이션 테스트 필요 |
| 통신 비용 | 서비스 간 네트워크 호출로 비용 증가 가능 | 내부 메서드 호출로 비용 적음 |
| 데이터 일관성 | 분산된 데이터베이스로 일관성 유지 어려움 | 단일 데이터베이스로 일관성 유지 용이 |
📌 MSA를 적용하기 좋은 상황
- 트래픽 변화가 심한 대규모 애플리케이션.
- 특정 기능이나 서비스의 독립적인 확장이 필요한 경우.
- 여러 팀이 동시에 기능을 개발해야 하는 경우.
- 클라우드 환경에서 동적으로 확장/축소가 필요한 경우.
📌 MSA의 예시
- 넷플릭스 (Netflix)
- 아마존 (Amazon)
- 우버 (Uber)
- 카카오 (Kakao)
