[데이터 중심 애플리케이션 설계] 01. 신뢰할 수 있고 확장 가능하며 유지보수하기 쉬운 애플리케이션

예니·2023년 2월 4일
0
post-thumbnail

요즘 많은 애플리케이션은 계산 중심(CPU intensive)이 아닌, 데이터 중심이다. 데이터 양, 데이터 복잡도, 데이터 변화 속도에 성능이 영향을 받는다.

소프트웨어 시스템은 아래 세가지가 중요하다.

  • 신뢰성 : 역경에 직면하더라도 시스템은 지속적으로 올바르게 동작해야 한다.
  • 확장성 : 데이터 양, 트래픽, 복잡도가 증가하면서 이를 처리할 수 있는 적절한 방법이 있어야 한다.
  • 유지보수성 : 모든 사용자가 시스템 상에서 생산적으로 작업할 수 있게 해야 한다

신뢰성

결함은 장애와 동일하지 않다. 결함은 사양에서 벗어난 시스템의 한 구성 요소, 장애는 서비스를 제공하지 못하고 시스템 전체가 멈춘 경우다. 결함으로 인해 장애가 발생하지 않도록 내결함성 구조를 설계해야 한다.

하드웨어 결함

정전, 고장 등. 각 하드웨어 구성 요소에 중복을 추가하는 방법으로 대응할 수 있다.

소프트웨어 오류

시스템 내 체계적 오류. 하드웨어 결함보다 예상하기 어렵고, 노드 간 상관관계 때문에 시스템 오류를 더 많이 유발하는 경향이 있다.

인적 오류

사람이 유발. 최선의 의도를 갖고 있어도 사람은 미덥지 않다ㅠ

신뢰성은 얼마나 중요할까?

오류 가능성을 최소화하는 방향으로 설계, 샌드박스 제공, 철저한 테스트 등으로 대응

확장성

부하 증가에도 안정적으로 서비스를 제공할 수 있어야 한다.

부하를 나타낼 때 부하 매개변수로 나타낼 수 있다. (웹 서버 초당 요청 수, DB의 읽기 대 쓰기 비율, 동시 활성 사용자, 캐시 적중률 등)

트위터 사례

부하 대응 접근 방식에는 scaling up, scaling out이 있다.

특정 애플리케이션에 적합한 확장성을 갖춘 아키텍처는 주요 동작이 무엇이고 잘 하지 않는 동작이 무엇인지에 대한 가정을 바탕으로 구축한다. → 어떤 특정 방법이 만능인 경우는 없다. 자신의 서비스에 대한 이해와 고민을 바탕으로 한 아키텍처 설계가 필요하다.

유지보수성

소프트웨어 비용은 초기 개발보다 유지보수에 많이 들어간다. 그래서 유지보수를 쉽게 만드는 것이 중요하다. 유지보수 중 고통을 줄이고 레거시 소프트웨어를 직접 만들지 않게끔 소프트웨어를 설계하기 위한 설계 원칙은 다음 세가지다.

운용성: 운영의 편리함 만들기

운영팀이 시스템을 원활하게 운영할 수 있게 쉽게 만들어라.

단순성: 복잡도 관리

복잡도를 줄이면 소프트웨어 유지보수성이 크게 향상된다. 우발적 복잡도(소프트웨어에서 해결하는 문제 외의 복잡도)를 제거하기 위한 최상의 도구는 추상화이다.

발전성: 변화를 쉽게 만들기

시스템의 요구사항은 끊임없이 변한다. 변경하기 쉽게 만들어라. 이것은 간담함과 추상화와 밀접하다.

0개의 댓글