신뢰할 수 있고 확장 가능하며 유지보수하기 쉬운 애플리케이션
- 신뢰성
Reliability
: 하드웨어나 소프트웨어 결함, 인적 오류같은 역경에 직면하더라도 시스템은 지속적으로 올바르게 동작(원하는 성능 수준에서 정확한 기능을 수행)해야 한다. - 확장성
Scalability
: 시스템의 데이터 양, 트래픽 양, 복잡도가 증가하면서 이를 처리할 수 잇는 적절한 방법이 있어야 한다. - 유지보수성
Maintainability
: 시간이 지남에 따라 여러 다양한 사람들이 시스템 상에서 작업(현재 작업을 유지보수하고 새로운 사용 사례를 시스템에 적용하는 엔지니어링과 운영)할 것이기 때문에 모든 사용자가 시스템 상에서 생산적으로 작업할 수 있게 해야 한다.
신뢰성
- 애플리케이션은 사용자가 기대한 기능을 수행한다.
- 시스템은 사용자가 범한 실수나 예상치 못한 소프트웨어 사용법을 허용할 수 있다.
- 시스템 성능은 예상된 부하나 데이터 양에서 필수적인 사용 사례를 충분히 만족한다.
- 시스템은 허가되지 않은 접근과 오남용을 방지한다.
올바르게 동작한다는 것은, 무언가가 잘못되더라도 지속적으로 올바르게 동작함을 의미한다고 이해할 수 있다.
- 결함: 사양에서 벗어난 시스템의 한 구성요소. 잘못될 수 있는 일
- 장애: 사용자에게 필요한 서비스를 제공하지 못하고 시스템 전체가 멈춘 경우
오류의 종류
하드웨어 결함
- AWS같은 클라우드 플랫폼에서 가상 장비 인스턴스가 별도의 경고 없이 사용할 수 없게 되는 상황 같은 것.
- 이런 플랫폼은 장비 신뢰성보다 유연성 과 탄력성 을 우선적으로 처리하게끔 설계되었기 때문
- 소프트웨어 내결함성 기술을 사용하거나 하드웨어 중복성을 추가해 전체 장비 손실을 견딜 수 있는 시스템으로 옮겨가고 있다.
소프트웨어 오류
- 하드웨어 결함은 무작위적이고 서로 독립적이다. (한 장비에 장애가 있다고 해서 다른 장비에도 장애가 발생하지는 않는다.)
- 시스템 내 체계적 오류는 예상하기 어렵고 노드 간 상관관계 때문에 하드웨어 결함보다 오히려 시스템 오류를 더 많이 유발하는 경향이 있다.
인적오류
- 인간은 소프트웨어 시스템을 설계, 구축하며, 운영자로 시스템을 계속 운영하기 때문이다.
신뢰성 있는 시스템을 만드는 방법
- 오류 가능성을 최소화하는 방향으로 시스템 설계하기
- 사람들이 가장 많이 실수하는 부분에서 사람의 실수로 장애가 발생할 수 있는 부분을 분리하기
- 단위테스트부터 전체 시스템 통합 테스트와 수동 테스트까지 모든 수준에서 철저하게 테스트하기
- 장애 발생의 영향을 최소화하기 위해 인적 오류를 빠르고 쉽게 복구할 수 있게 하기
- 성능 지표와 오류율 같은 상세하고 명확한 모니터링 대책을 마련하기