Micro Service Architecture가 등장하면서 작은 단위의 서비스들을 독립적으로 배포하고 확장할 수 있게 되었기 때문에 특정 서비스에 문제가 발생해도 전체 시스템이 영향을 받지 않을 수 있었다.
예를 들어, youtube에서 영상 추천 서비스에 장애가 발생해도 영상 검색/재생 서비스는 계속 동작할 수 있다.
MSA를 통해 단일 장애점(Single Point of Failure)을 최소화할 수 있었지만 글로벌 서비스를 제공하는 기업들은 더 높은 가용성과 복원력, 유연한 확장성을 필요로 했고 새로운 아키텍쳐를 고민하기 시작했다. 🤔
선박은 구멍이 나도 침수가 번지지 않도록 하기 위해 격벽(bulkhead)을 통해 수직으로 구획을 분할한다. 각 구획 사이에 위치한 격벽은 구획을 완전히 격리시키는데, 이로 인해 특정 구획에 물이 새더라도 다른 구획으로 침수가 번지지 않을 수 있다.
격벽 구조를 Micro Service Architecture로 가져온 것이 바로 Cell-based Architecture이다. 선박의 각 구획은 Cell로 표현되고, Cell에는 독립적인 Micro Service 그룹이 운영된다. 그래서 특정 Cell에 장애가 발생해도 Cell들은 각각 격리되어 있기 때문에 장애가 확산되지 않는다.
어떤 애플리케이션이 AWS ECS에 올라가고, 저장소로는 DynamoDB를 사용한다고 가정해보자:
독립적인 Cell이 N개가 존재한다면 사용자는 어떤 Cell에 요청을 보내서 응답을 받을 수 있을까?
Cell-based Architecture에는 다음과 같은 부가적인 요소들도 필요할 것이다:
1. 사용자는 Routing Layer로 요청을 보낸다
2. Routing Layer는 사용자별 Cell 매핑정보를 확인하고 사용자 요청을 Cell로 redirect 한다
3. 사용자는 Cell로부터 요청에 대한 응답을 받는다
4. 사용자 요청은 CloudWatch에 기록되어 모니터링된다
5. 모든 Cell에서 발생한 요청/오류는 중앙 대시보드에서 확인할 수 있다
6. 중앙 대시보드로부터 Cell이 장애가 발생했다는 걸 확인하거나, 애플리케이션 배포가 필요하면 Deployment Pipeline을 통해 새로운 Cell을 배포할 수 있다
7. Cell에서 발생한 데이터 변경사항들은 중앙 Data Lake로 스트리밍되어 저체 Cell의 데이터를 분석할 수 있다