가상 면접 사례로 배우는 대규모 시스템 설계 기초 | 알렉스 쉬 - 교보문고

가상 면접 사례로 배우는 대규모 시스템 설계 기초 | 페이스북의 뉴스 피드나 메신저,유튜브, 구글 드라이브 같은 대규모 시스템은 어떻게 설계할까? IT 경력자라도 느닷없이 대규모 시스템을 설

product.kyobobook.co.kr


11장, 뉴스 피드 시스템 설계

  1. 문제 이해 및 설계 범위 확정
    • 웹/앱 둘 다 지원해야 함
    • 중요 기능
      • 사용자는 뉴스 피드 페이지에 새로운 스토리를 올릴 수 있어야 함
      • 친구들이 올리는 스토리도 볼 수 있어야 함
    • 뉴스 피드에는 시간 흐름 역순으로 스토리가 표시
    • 한 명의 사용자는 최대 5,000명의 친구를 가질 수 있음
    • 트래픽 규모는 매일 천만 명
    • 스토리에는 이미지나 비디오 등의 미디어 파일이 포함될 수 있음

  1. 개략적 설계안 제시 및 동의 구하기
    • 뉴스 피드 API
      • 클라이언트가 서버와 통신하기 위해 사용하는 수단
      • HTTP 프로토콜 기반
      • 상태 정보를 업데이트하거나, 뉴스 피드를 가져오거나, 친구를 추가하는 등 다양한 작업 수행
      • 피드 발행 API
        • 새 스토리를 포스팅하기 위한 API
        • HTTP POST 형태로 요청
        • POST /v1/me/feed
      • 피드 읽기 API
        • 뉴스 피드를 가져오는 API
        • HTTP GET 형태로 요청
        • GET /v1/me/feed

  1. 상세 설계
    • 웹 서버
      • 클라이언트와 통신할 뿐 아니라 인증이나 처리율 제한 등의 기능도 수행
      • 올바른 인증 토큰을 Authorization 헤더에 넣고 API를 호출하는 사용자만 포스팅할 수 있어야 한다.
      • 스팸을 막고 유해한 콘텐츠가 자주 올라오는 것을 방지하기 위해 특정 기간 동안 한 사용자가 올릴 수 있는 포스팅의 수에 제한을 두어야 한다.
    • 포스팅 전송(팬 아웃) 서비스
      • 어떤 사용자의 새 포스팅을 그 사용자와 친구 관계에 있는 모든 사용자에게 전달하는 과정
      • 팬 아웃에는 두가지 모델이 있는데 하나는 쓰기 시점에 팬아웃하는 모델이고, 다른 하나는 읽기 시점에 팬아웃 하는 모델이다.
      • 쓰기 시점에 팬 아웃하는 모델 (Push 모델)
        • 새로운 포스팅을 기록하는 시점에 뉴스 피드를 갱신
        • 포스팅이 완료되면 바로 해당 사용자의 캐시에 해당 포스팅을 기록
        • 장점
          • 뉴스 피드가 실시간으로 갱신
          • 친구 목록에 있는 사용자에게 즉시 전송
          • 새 포스팅이 기록되는 순간 뉴스 피드가 이미 갱신되므로 뉴스 피드를 읽는 데 드는 시간이 짧아짐
        • 단점
          • 친구가 많은 사용자의 경우 친구 목록을 가져오고 그 목록에 있는 사용자 모두의 뉴스 피드를 갱신하는 데 많은 시간이 소요될 수도 있다. (핫키 문제)
          • 서비스를 자주 이용하지 않는 사용자의 피드까지 갱신해야 하므로 컴퓨팅 자원이 낭비
      • 읽기 시점에 팬 아웃하는 모델 (Pull 모델)
        • 피드를 읽어야 하는 시점에 뉴스 피드를 갱신
        • 요청 기반 모델 (On-demand)
        • 사용자가 본인 홈페이지나 타임 라인을 로딩하는 시점에 새로운 포스트를 가져온다
        • 장점
          • 비활성화된 사용자, 또는 서비스에 거의 로그인하지 않는 사용자의 경우에는 이 모델이 유리
          • 로그인하기까지는 어떤 컴퓨팅 자원도 소모하지 않는다.
          • 데이터를 친구에 각각 푸시하는 작업이 필요 없으므로 핫키 문제도 생기지 않는다.
        • 단점
          • 뉴스 피드를 읽는 데 많은 시간이 소요될 수 있다.
    • 이번 장에서는 두 가지 방법을 결합하여 장점은 취하고 단점은 버리는 전략을 취한다.
    • 뉴스 피드를 빠르게 가져오는 것은 아주 중요하므로 대부분 푸시 모델을 사용한다. 친구나 팔로어가 아주 많은 사용자의 경우 팔로어로 하여금 해당 사용자의 포스팅을 필요할 때 가져가도록 하는 풀 모델을 사용하여 시스템 과부하를 방지할 수 있다.
    • 아울러 안정 해시를 통해 요청과 데이터를 보다 고르게 분산하여 핫키 문제를 줄여볼 것이다.

  • 느낀 점
    • 캐시를 필요에 따라 여러 계층으로 나누어 활용할 수 있음
    • Push-Pull 모델을 필요에 따라 결합하여 핫키 문제를 방지하고 두 전략의 장점만을 가져올 수 있음

+ Recent posts