KUKJIN LEE
posted 23 hours ago
마이크로서비스 아키텍처: 분산 시스템 이해
마이크로서비스 아키텍처는 하나의 애플리케이션을 여러 개의 독립적인 서비스로 분해하는 아키텍처 패턴입니다. 각 서비스는 자체적으로 배포되고 유지보수되며, 다른 서비스와 느슨하게 결합되어 상호작용합니다. 이러한 아키텍처를 도입할 때의 주요 원칙들은 애플리케이션의 복잡성을 관리하고 빠른 배포 및 확장을 가능하게 하며, 이를 통해 개발 생산성과 유연성을 높입니다.
(그냥 쉽게 이해하려면 서버1을 서버1, 서버2로 나눠서 운영한다 생각하면 됩니다.)
마이크로서비스의 핵심은 독립적, 느슨한 결합입니다.
1. 독립적 배포 가능성
마이크로서비스는 각 서비스가 독립적으로 배포될 수 있도록 설계되어야 합니다. 이를 통해 특정 서비스에 대한 업데이트나 수정이 다른 서비스에 영향을 미치지 않도록 하여, 지속적인 배포와 운영의 안정성을 보장합니다.
2. 도메인 중심 설계
마이크로서비스는 도메인 중심으로 설계되어야 하며, 각 서비스는 특정 도메인이나 비즈니스 기능을 책임집니다. 이를 위해 DDD(Domain-Driven Design) 기법을 활용하여 각 서비스의 경계를 명확히 정의하고, 팀이 각 서비스의 비즈니스 가치를 이해하고 최적화할 수 있도록 돕습니다.
3. 데이터 독립성
각 서비스는 자신의 데이터베이스를 가지고 있어야 하며, 다른 서비스와의 데이터 공유는 피해야 합니다. 이는 각 서비스 간의 결합도를 낮추고, 데이터의 일관성과 보안을 유지하는 데 도움이 됩니다. 필요시에는 이벤트 기반의 비동기 통신을 통해 데이터의 일관성을 유지하도록 설계합니다.
4. 경량화된 통신
서비스 간 통신은 REST API, gRPC와 같은 경량화된 프로토콜을 통해 이루어져야 합니다. 이 원칙을 통해 서비스 간의 상호작용을 간소화하고, 통신에 필요한 오버헤드를 최소화하여 시스템 성능을 최적화할 수 있습니다.
5. 장애 허용 및 자동 복구
마이크로서비스 아키텍처에서는 서비스의 일부가 장애가 나더라도 전체 시스템에 미치는 영향을 최소화하기 위해 장애 허용(fault tolerance) 설계가 필요합니다. 이를 위해 서킷 브레이커 패턴이나 리트라이 메커니즘을 사용하여 서비스가 자동으로 복구될 수 있도록 하고, 시스템의 회복력을 높입니다.
6. 서비스 분리와 팀 독립성
마이크로서비스는 각 팀이 독립적으로 서비스를 운영할 수 있도록 팀 조직과 서비스 구조가 일치해야 합니다. 이를 통해 각 팀이 자신들의 서비스에 대해 완전한 책임을 질 수 있고, 서비스 개발의 자율성과 속도를 높일 수 있습니다.
이런 원칙들이 시스템의 복잡성을 효율적으로 관리하고, 빠른 배포와 높은 가용성을 유지할 수 있도록 돕습니다.