요즘 많은 애플리케이션은 계산 중심(CPU intensive)이 아닌, 데이터 중심이다. 데이터 양, 데이터 복잡도, 데이터 변화 속도에 성능이 영향을 받는다.
소프트웨어 시스템은 아래 세가지가 중요하다.
결함은 장애와 동일하지 않다. 결함은 사양에서 벗어난 시스템의 한 구성 요소, 장애는 서비스를 제공하지 못하고 시스템 전체가 멈춘 경우다. 결함으로 인해 장애가 발생하지 않도록 내결함성 구조를 설계해야 한다.
정전, 고장 등. 각 하드웨어 구성 요소에 중복을 추가하는 방법으로 대응할 수 있다.
시스템 내 체계적 오류. 하드웨어 결함보다 예상하기 어렵고, 노드 간 상관관계 때문에 시스템 오류를 더 많이 유발하는 경향이 있다.
사람이 유발. 최선의 의도를 갖고 있어도 사람은 미덥지 않다ㅠ
오류 가능성을 최소화하는 방향으로 설계, 샌드박스 제공, 철저한 테스트 등으로 대응
부하 증가에도 안정적으로 서비스를 제공할 수 있어야 한다.
부하를 나타낼 때 부하 매개변수로 나타낼 수 있다. (웹 서버 초당 요청 수, DB의 읽기 대 쓰기 비율, 동시 활성 사용자, 캐시 적중률 등)
트위터 사례
부하 대응 접근 방식에는 scaling up, scaling out이 있다.
특정 애플리케이션에 적합한 확장성을 갖춘 아키텍처는 주요 동작이 무엇이고 잘 하지 않는 동작이 무엇인지에 대한 가정을 바탕으로 구축한다. → 어떤 특정 방법이 만능인 경우는 없다. 자신의 서비스에 대한 이해와 고민을 바탕으로 한 아키텍처 설계가 필요하다.
소프트웨어 비용은 초기 개발보다 유지보수에 많이 들어간다. 그래서 유지보수를 쉽게 만드는 것이 중요하다. 유지보수 중 고통을 줄이고 레거시 소프트웨어를 직접 만들지 않게끔 소프트웨어를 설계하기 위한 설계 원칙은 다음 세가지다.
운영팀이 시스템을 원활하게 운영할 수 있게 쉽게 만들어라.
복잡도를 줄이면 소프트웨어 유지보수성이 크게 향상된다. 우발적 복잡도(소프트웨어에서 해결하는 문제 외의 복잡도)를 제거하기 위한 최상의 도구는 추상화이다.
시스템의 요구사항은 끊임없이 변한다. 변경하기 쉽게 만들어라. 이것은 간담함과 추상화와 밀접하다.