[ 문제를 다루는 방법 ]
- 면접관과 소통
- 처음에는 포괄적으로 접근
- 종이를 사용하여 계획 및 설명
- 면접관이 우려하는 부분을 인정
- 가정 시 주의
- 가정을 명확히 언급
- 필요하다면 어림잡아 보기
- 적극적으로 문제 해결하기
[ 시스템 설계: 단계별 접근법 ]
- 문제의 범위를 한정
- 합리적인 가정을 만들기
- 중요한 부분을 먼저 생각하기
- 핵심 문제점을 파악하기
- 핵심 문제점을 해결할 수 있도록 다시 설계하기
[ 규모 확장을 위한 알고리즘: 단계별 접근법 ]
- 질문하기
- 현실적 제약을 무시하기
- 현실적 제약에 적용하기
- 문제를 풀기
[ 시스템 설계의 핵심 개념 ]
👀 수평적(horizontal) vs 수직적(vertical) 규모 확장
- 수직적 규모 확장 : 특정 노드의 자원의 양을 늘리는 방법
ex) 서버에 메모리 추가하여 서버의 처리 능력 향상 - 수평적 규모 확장 : 노드의 개수를 늘리는 방법
ex) 서버를 추가함으로써 서버 한 대가 다뤄야 하는 부하를 줄이는 것
👀 서버 부하 분산 장치(Load balancer)
: 서버에 걸리는 부하를 여러 대의 서버에 균일하게 분산시켜서 서버 한 대 때문에 전체 시스템이 죽거나 다운되는 상황을 방지할 수 있습니다. 물론 이렇게 하기 위해선 서버 여러 대가 근본적으로 똑같은 코드와 데이터를 사용하도록 하는 네트워크를 구현해야 합니다.
👀 데이터베이스 역정규화
: 데이터베이스에 여분의 정보를 추가해서 읽기 연산 속도를 향상시킨 것입니다.
⭐ SQL과 같은 관계형 데이터베이스의 join 연산은 시스템이 커질수록 굉장히 느려지기 때문에 가능하면 피해야 하고 추가 정보를 입력하는 역정규화를 사용합니다.
[ 데이터베이스 분할(샤딩) ]
👀 샤딩
: 데이터를 여러 컴퓨터에 나눠서 저장하는 동시에 어떤 데이터가 어떤 컴퓨터에 저장되어 있는지 알 수 있는 방식입니다.
- 수직적 분할 : 기본적으로 자료의 특성별로 분할하는 방식
- 키 혹은 해시 기반 분할
- 디렉터리 기반 분할
👀 캐싱
: 인메모리(in-memory) 캐시를 사용하면 결과를 굉장히 빠르게 가져올 수 있습니다. 인메모리 캐시는 키-값(key-value)을 쌍으로 갖는 간단한 구조로써 일반적으로 애플리케이션과 데이터 저장소 사이에 자리 잡고 있습니다.
👀 네트워크 성능 척도
- 대역폭 : 단위 시간에 전송할 수 있는 데이터의 최대치
- 처리량 : 단위 시간에 실제로 전송된 데이터의 양
- 지연 속도 : 데이터를 전송하는데 걸리는 시간(발송자가 데이터를 보낸 시점부터 수신자가 데이터를 받는 시점까지 걸린 시간)
👀 MapReduce
: 크기가 아주 큰 데이터를 처리하는 시스템을 설계할 때 널리 사용됩니다.
- 시스템이 데이터를 여러 서버에 나눕니다.
- 각 서버는 사용자가 제공한 Map 프로그램을 실행합니다.
- Map 프로그램은 데이터를 입력으로 받은 뒤 <key, value> 쌍을 반환합니다.
- 시스템이 제공하는 Shuffle 프로세스는 키값이 같은 모든 쌍을 한 서버에 보내서 Reduce를 실행할 수 있도록 데이터를 재배치합니다.
- 사용자가 제공한 Reduce 프로그램은 키와 값을 통해 데이터를 어떤 방식으로든 '줄이고', 새로운 키와 값을 반환합니다. 데이터를 더 줄이기 위해 해당 결과가 또 다른 Reduce 프로그램으로도 보내질 수도 있습니다.
[ 시스템 설계 시 고려할 점 ]
- 실패
: 시스템의 어떤 부분이든 실패 가능성이 존재하기 때문에 대비책을 미리 준비해야 합니다. - 가용성 및 신뢰성
가용성 : 사용 가능한 시스템의 시간을 백분율로 나타낸 것
신뢰성 : 특정 단위 시간에 시스템이 사용 가능할 확률을 나타낸 것 - 읽기 중심 vs 쓰기 중심
읽는 연산이 많은지 쓰는 연산이 많은지에 따라 설계 방식이 달라질 수 있습니다. - 보안
[ '완벽한' 시스템은 없다 ]
어떠한 시스템도 완벽하게 동작하는 시스템 설계란 존재하지 않습니다. 그러나 모든 시스템에는 장단점이 존재함으로 서로 다른 상황에서 굉장한 성능을 낼 수 있습니다. 이러한 문제를 받았을 때 사례를 잘 이해하고 문제의 범위를 설정하고, 합리적인 가정을 세운 뒤, 명확하게 설계한 시스템을 만드는 것이 중요합니다. 그리고 제일 중요한 것은 시스템의 약점에 대해 열린 마음으로 받아들일 수 있는 점 또한 필요합니다.
'프로그램 개발 > 미분류' 카테고리의 다른 글
[코딩 인터뷰]지식 기반 문제 - C와 C++ (0) | 2023.01.05 |
---|---|
[코딩 인터뷰]개념과 알고리즘 - 정렬과 탐색 (1) | 2023.01.03 |
[코딩 인터뷰]개념과 알고리즘 - 재귀와 동적 프로그래밍 (0) | 2022.12.26 |
[코딩 인터뷰]개념과 알고리즘 - 객체 지향 설계 (0) | 2022.12.21 |
[코딩 인터뷰]개념과 알고리즘 - 수학 및 논리 퍼즐 (0) | 2022.12.19 |