Computer Science/기타(시스템 설계 등)

시스템 설계 및 규모 확장성 문제들

sohyunwriter 2021. 2. 6. 23:29

시스템 설계 및 규모 확장성 문제들

 

빅테크 기업에서 가끔 '시스템 설계'가 면접의 일부분으로 들어가 있다고 한다. 

실제로 아마존에서는 면접 한 세션은 시스템 설계 세션도 있다고 들었는데, 

FANG(Facebook, Amazon, Netflix, Google)에서는 이런 부분도 물어보는 듯하다.

그래서 이번에는 시스템 설계 문제들을 공부할 겸 해당 문제들을 적어봤다.

 

국내 IT 기업은 시스템 설계 문제들을 직접적으로 물어보는 것 같진 않고, 

 

"100만 유저가 사용하는 시스템을 설계하면?"

"트래픽이 순간적으로 많을 때 어떻게 해결할지?"

"대용량 데이터는 어떻게 저장하고 관리할지?"

 

이와 같이 큰 범주에서 물어보는 듯하다.

 

문제의 포인트는 평소 프로그램을 만들 때, 이러한 부분들까지 고민하고 만드는지, 아니면 그냥 되는 대로 만드는 건지 이걸 보기 위함인 것 같다.

 

 

9.1 (주식 데이터) 서비스를 하나 구현한다고 하자. 이 서비스는 폐장 시점에 주가 정보(시작가, 종가, 최고가, 최저가)를 최대 1,000개의 클라이언트에게 제공한다. 데이터는 이미 주어져 있고, 어떤 형태로든 저장할 수 있다고 가정해도 좋다. 이 서비스를 어떻게 설계하면 좋겠는가? 여러분은 개발과 배포를 책임져야 하고, 지속적으로 시스템을 모니터링하는 한편 사용자에게 전송되는 정보를 관리해야 한다. 여러분이 생각하는 방법을 설명한 다음, 어떤 접근법을 택했는지 그 접근법을 선택한 이유는 무엇인지 설명하라. 어떤 기술을 사용해도 좋다. 클라이언트 프로그램에 정보를 전송하는 방법도 원하는 대로 선택할 수 있다.

 

 

 

9.2 (소셜 네트워크) 페이스북이나 링크드인과 같은 대규모 소셜 네트워크를 위한 자료구조는 어떻게 설계하겠는가? 두 사람 사이의 최단 경로를 보여 주는 알고리즘은 어떻게 설계하겠는가? (가령, ->->수잔->제이슨->당신)

 

*추가문제

-실제 세계에서는 서버가 죽을 수도 있다. 이런 일들이 여러분의 알고리즘에 어떠한 영향을 미치나?

-캐싱을 이용하려면 어떻게 하면 되겠는가?

-그래프의 끝을 만날 때까지(무한히) 탐색하는가? 탐색을 그만둘 시점은 어떻게 정하는가?

-실제 세계에서는 다른 사람들보다 더 많은 친구의 친구 관계를 유지하는 사람들을 발견할 수 있다. 그런 사람들은 여러분과 다른 사람들 사이의 관계의 일부가 될 가능성도 높다. 탐색을 시작할 위치를 지정할 때 이런 사실을 활용할 수 있겠는가?

 

 

 

9.3 (웹 크롤러) 웹에 있는 데이터를 긁어 오는 크롤러(crawler)를 설계할 때, 무한루프(infinite loop)에 빠지는 일을 방지하려면 어떻게 해야 하는가?

 

 

 

9.4 (중복 URL) 100억 개의 URL이 있다. 중복된 문서를 찾으려면 어떻게 해야 하는가? 여기서 중복이란 같은 URL’이라는 뜻이다.

 

 

 

9.5 (캐시) 간단한 검색 엔진으로 구현된 웹 서버를 생각해 보자. 이 시스템에선 100개의 컴퓨터가 검색 요청을 처리하는 역할을 하고 있다. 예를 들어 하나의 컴퓨터 집단(cluster of machines)processSearch(string query)라는 요청을 보내면 그에 상응하는 검색 결과를 반환해 준다. 하지만 어떤 컴퓨터가 요청을 처리하게 될지는 그때그때 다르며, 따라서 같은 요청을 한다고 같은 컴퓨터가 처리할 거라고 장담할 수 없다. processSearch 메서드는 아주 고비용이다. 최근 검색 요청을 캐시에 저장하는 메커니즘을 설계하라. 데이터가 바뀌었을 때 어떻게 캐시를 갱신할 것인지 반드시 설명하라.

 

 

 

9.6 (판매 순위) 한 전자상거래 회사는 가장 잘 팔리는 제품의 리스트(전체에서 그리고 각 목록별로)를 알고 싶어 한다. 예를 들어, 어떤 제품은 전체 제품 중에서 1,056번째로 잘 팔리지만 운동 장비 중에서는 13번째로 잘 팔리고, 안전용품 중에서는 24번째로 잘 팔릴 수 있다. 이 시스템을 어떻게 설계할지 설명하라.

 

*추가문제

-다음 병목 현상은 어디서 나타날 것 같은가? 이를 어떻게 해결할 것인가?

-하위 목록이 있으면 어떻게 할텐가? , 제품의 위치가 스포츠 > 스포츠 용품 > 테니스 > 라켓아래라면 어떻게 할 텐가?

-데이터가 좀 더 정확해야 한다면 어떻게 할 것인가? 모든 제품의 정확도가 적어도 30분 이내에 갱신되어야 한다면 어떻게 할 것인가?

 

 

 

9.7 (개인 재정 관리자) 개인 재정 관리 시스템(mint.com과 같은)을 어떻게 설계할지 설명하라. 이 시스템은 여러분의 은행 계정과 연동되어 있어야 하며 소비 습관을 분석하고 그에 맞게 적절하게 추천할 수 있어야 한다.

 

*추가문제

-모바일 앱을 사용하려면 위 설계에서 어떤 부분을 바꿔야 하나?

-항목을 개별 목록으로 배치하는 부분은 어떻게 설계할 것인가?

-적정 예산을 추천하는 부분은 어떻게 설계할 것인가?

-사용자가 특정 판매자에 대해 거래 내역을 분류하는 규칙을 만들 수 있게 하려면 위의 설계를 어떻게 바꿔야 할까?

 

 

 

9.8 (Pastebin) Pastebin과 같은 시스템을 설계하라. Pastebin은 텍스트를 입력하면 접속 가능한 임의의 URL을 생성한 뒤 반환해 주는 시스템이다.

 

*추가문제

-사용자 계정을 지원하려면 어떻게 해야 할까?

-통계 페이지에 새로운 분석 자료(예를 들어, 페이지를 언급한 위치)를 추가하려면 어떻게 해야 할까?

-각 문서에 통계 자료를 같이 보이게 하려면 설계를 어떻게 바꿔야 할까?

 

 

 

-참고문헌

더보기

책 "코딩인터뷰 완전분석"

블로그 "아마존 인터뷰에 떨어지다"

 

 

728x90