View

반응형

페이스북이나 인스타그램, 트위터 같은 SNS들은 사용자 상태 정보나 스토리 업데이트 등 다양한 콘텐츠 정보들을 뉴스 피드 시스템을 통해 쉽고 빠르게 전달한다.

우리는 개발자이므로 수 백 ~ 수 천만의 사용자들의 피드들을 어떻게 안정적으로 발행하고 생성할 것인지에 대해 고민해봐야 한다. 만약 우리가 이런 시스템을 설계한다고 생각했을 때 어떤 부분을 고려해야 할까?

우선, 뉴스 피드 시스템의 핵심 기능은 피드 발행뉴스 피드 생성으로 나눌 수 있다.

 

피드 발행

사용자가 스토리를 포스팅하면 해당 데이터를 캐시와 데이터베이스에 기록한다.
이렇게 포스팅된 정보는 친구 목록의 뉴스 피드에 전송돼야 한다.
다음은 개략적인 피드 발행 시스템 설계안이다.

  • 웹 서버
    • 인증이나 처리율 제한 등의 기능을 수행한다.
  • 포스팅 저장 서비스
    • 새 포스팅을 DB와 캐시에 저장하는 서비스
  • 포스팅 전송 서비스
    • 새 포스팅을 친구의 뉴스 피드에 푸시하는 서비스
  • 알림 서비스
    • 새 포스팅이 올라왔을 때 친구들에게 푸시 알림을 보내는 서비스

포스팅 저장 서비스는 지금까지 다뤘던 시스템 구성 방법들을 기반으로 설계하면 충분할 것이기에, 뉴스 피드 시스템의 포스팅 전송 서비스에 초점을 맞춰 더 알아보자.

 

포스팅 전송 서비스

포스팅 전송은 어떤 사용자의 새 포스팅을 그 사용자와 친구 관계에 있는 모든 사용자에게 전달하는 과정이다.

포스트 전송 방법에는 두 가지 모델이 있는데 하나는 쓰기 시점에 포스팅을 전송하는 모델(push 모델)이고, 다른 하나는 읽기 시점에 포스팅 전송하는 모델(pull 모델)이다.

쓰기 시점에 포스팅 전송하는 모델(Push 모델)

  • 장점
    • 뉴스 피드가 실시간으로 갱신되며 친구 목록에 있는 사용자에게 즉시 전송된다.
    • 포스팅이 쓰이는 시점에 전송되므로 뉴스 피드를 읽는 데 드는 시간이 짧아진다.
  • 단점
    • 친구가 많은 사용자의 경우 뉴스 피드 갱신에 많은 시간이 소요될 수 있다.(핫키 이슈)
    • 사용자의 친구 목록에 있는 사용자의 피드를 모두 갱신하므로 서비스를 자주 이용하지 않는 사용자의 피드까지 갱신된다. 따라서 컴퓨팅 자원이 낭비된다.

 

읽기 시점에 포스팅 전송하는 모델(Pull 모델)

  • 장점
    • 로그인하지 않은(비활성화된 사용자) 또는 서비스를 자주 이용하지 않는 사용자에게 피드가 갱신되지 않으므로 컴퓨팅 자원을 아낄 수 있다.
    • 데이터를 친구 목록의 사용자 모두에게 푸시하는 작업이 필요 없으므로 핫키 문제도 발생하지 않는다.
  • 단점
    • 뉴스 피드를 읽는데 많은 시간이 소요될 수 있다.

가장 좋은 설계 방법은 이 두 가지 모델의 장점을 결합해 사용하는 것이다.

뉴스 피드를 가져오는 작업에는 대부분의 사용자에게 Push 모델을 적용하고 핫키가 발생할 수 있는 유명인의 경우 Pull 모델을 적용해 시스템 부하를 방지한다. 또한, 안정 해시를 통해 요청과 데이터를 보다 고르게 분산시켜 핫키 이슈를 자체를 줄이는 방법도 있다.

 

뉴스 피드 생성

새로운 포스팅이 발생하면 친구들의 뉴스 피드에 포스팅이 조회되어야 한다.
일반적으로 모든 친구의 포스팅을 시간 흐름 역순으로 모아 만든다.
피드 읽기 흐름을 간략히 나타내면 다음과 같다.

  • 뉴스 피드 서비스
    • 캐시에서 뉴스 피드를 가져오는 서비스
  • 뉴스 피드 캐시
    • 뉴스 피드를 렌더링 할 때 필요한 피드 ID를 보관한다.

 

뉴스 피드 서비스

피드 읽기 흐름을 더 구체화시켜보면 다음과 같은 설계안이 나온다.
CDN을 추가해 이미지, 비디오 같은 미디어 콘텐츠를 빨리 읽을 수 있도록 하고 웹 서버에서는 인증이나 처리율 제한을 처리한다.

핵심 기능인 뉴스 피드 서비스의 동작 흐름은 다음과 같다.

  1. 뉴스 피드 서비스는 뉴스 피드 캐시에서 포스팅 ID 목록을 가져온다.
  2. 뉴스 피드에 표시할 사용자 이름, 사용자 이미지, 포스팅 콘텐츠 등을 사용자 정보 캐시와 포스팅 캐시에서 가져와 완전한 뉴스 피드로 만든다.
  3. 생성된 뉴스 피드를 JSON 형태로 반환한다.

이러한 흐름에서도 알 수 있듯 캐시는 뉴스 피드 시스템의 핵심 컴포넌트다.
캐시로부터 받아온 정보를 조합해 완전한 뉴스 피드로 만들기 때문에 각 캐시로부터 전달받는 데이터의 계층이 명확해야 한다. 일반적인 SNS 뉴스 피드를 생각해보면 캐시를 다섯 계층으로 나눌 수 있다.

  • 뉴스 피드
    • 뉴스피드의 ID를 보관한다.
  • 콘텐츠
    • 포스팅 데이터를 보관하고 인기 콘텐츠는 따로 보관한다.
  • 소셜 그래프
    • 사용자 간 관계 정보를 보관한다. (팔로워, 팔로잉)
  • 행동
    • ‘좋아요’나 댓글 같은 사용자 행위에 관한 정보를 보관한다.
  • 횟수
    • ‘좋아요’ 횟수, 응답 수, 팔로워 수, 팔로잉 수 등의 정보를 보관한다.

 

이러한 정보를 캐시로부터 가져와 완전한 뉴스 피드를 만들 수 있다.

이렇듯, 뉴스 피드 시스템은 크게 뉴스 피드의 발행과 생성 두 부분으로 구성되어 있다.
우리는 이러한 구성과 더불어 회사의 요구사항에 맞는 시스템 설계를 고려해야 하며 규모 확장성이나 결합도가 낮은 전체 시스템 구성, 모니터링, 데이터 수집 등도 염두하여 설계해보자.

반응형
Share Link

인기 글

최신 글

전체 방문자

Today
Yesterday