# 분산 웹 시스템 설계 시 판단 기준

[https://d2.naver.com/helloworld/206816](https://d2.naver.com/helloworld/206816)

## 고려사항

1. 가용성(Availability)
   * 중요한 컴포넌트의 이중화
   * 실패가 발생 시 빠른 복구 방법
   * 문제 발생 시 전면 장애가 발생하지 않도록 구성(graceful degration)
2. 성능(Performance)
   * 빠른 응답
   * 낮은 레이턴시
3. 신뢰성(Reliability)
   * 동일한 요청에는 동일한 결과를 제공해야 함
   * 시스템이 항상 정상적으로 동작해야 함
4. 확장성(Scalability)
   * 더 많은 부하 처리를 위해 처리량을 증가시키기 위한 노력
   * 얼마나 많은 트래픽을 처리할 수 있는지
   * 저장 공간을 추가하기가 얼마나 쉬운지
   * 얼마나 더 많은 트랜젝션을 처리할 수 있는지
5. 관리성(Manageability)
   * 쉽게 운용 가능한 시스템 설계
   * 문제 발생 시 분석이 용이해야 함
   * 문제를 이해하기 쉬워야 함
   * 업데이트와 수정이 쉬워야 함
6. 비용(Cost)
   * 시스템을 빌드하는데 걸리는 시간
   * 시스템을 실행 시키는데 투여되는 운용 노력의 양
   * 모든 고려사항에 대해 필요한 교육 비용
7. 읽기와 쓰기 (Read & Write)
   * 읽기는 비동기일 수 있음
   * gzip, chuncked transfer encoding 으로 성능 최적화 가능
   * 일반적으로, 웹서버의 초당 읽기 요청 처리수 > 최대 커넥션 수
   * 쓰기는 업로드 동안 커넥션을 열어 놓아야 함
   * 서버의 동시 커넥션이 100이라면 동시에 100개의 쓰기만 처리 가능
   * 읽기와 쓰기 분리 시 독립적인 확장이 가능
8. 이중화(Redundancy)
   * 중요한 핵심 기능은 여러 개가 동시에 동작하도록 하는 것이 필요
   *

## 설계 방식

1. SOA(Service-Oriented Architecture)
2. 기능별로 서비스를 구성하는 방식
3. 각각의 서비스는 다른 서비스와 상호 작용을 위한 추상화된 인터페이스 제공
4. 객체지향 프로그래밍과 유사

## 주의사항

* 하나를 향샹 시키면 다른 하나를 희생해야 할 수 있음(예: 서버 수평 확장 시 관리성과 비용 증가)
* 시스템 설계 시 확장성을 미리 고려하는 것은 결과적으로 시간과 자원을 절약하는데 도움
