본문 바로가기
Develop/etc

개략적인 뉴스 피드 시스템 설계에 관한 이야기

by 독서왕뼝아리 2024. 4. 24.

가상 면접 사례로 배우는 대규모 시스템 설계 11장을 참고한 글입니다.

 

 

1) 문제 범위 설정

 - 지원 기기는 어디까지 인가?

- 중요한 기능이 무엇인가? (새 글을 작성할 수 있어야 한다, 친구의 글을 볼 수 있어야 한다)

- 뉴스 피드는 어떤 기준으로 표시되는가?

- DAU는 몇인가?

- 글에 이미지와 비디오를 올릴 수 있는가? (저장을 위한 저장소 요구량)

 

 

2) 설계안

뉴스피드 발행

포스팅 전송(fanout) 서비스

사용자와 친구관계에 있는 모든 사용자에게 새 포스팅을 전달하는 과정, 쓰기 시점(push)과 읽기 시점(pull)이 있음

 

  • 쓰기 시점에 팬아웃하는 모델
    • 새로운 포스팅을 기록하는 시점에 뉴스 피드를 갱신하게 된다. 피드가 실시간으로 갱신되며 친구 목록 사용자에게 즉서 전송된다
    • 친구가 많은 사용자의 경우 모두의 뉴스 피드를 갱신하는 데 많은 시간이 소요됨(hotkey 문제), 서비스를 자주 이용하지 않는 사용자의 피드까지 갱신되므로 자원 낭비
  • 읽기 시점에 팬아웃하는 모델
    • 피드를 읽어야 하는 시점에 갱신한다. 요청 기반(on-demand)모델, 쓰기 시점 모델의 단점을 커버하여 자원 낭비를 줄임.
    • 하지만 뉴스 피드를 읽는 데 많은 시간이 소요됨

→ 두 방법을 결합해 장점을 취하는 방법(친구가 적으면 push모델, 아주 많으면 pull모델)

 

동작과정

1. 그래프 데이터베이스에서 친구 ID목록을 가져온다

2. 사용자 정보 캐시에서 친구들의 정보를 가져온다(설정에 따라 일부를 걸러낸다)

3. 친구 목록과 새 포스팅 ID를 메시지 큐에 넣는다.

4. 팬아웃 작업 서버가 메시지 큐에서 데이터를 꺼내, 뉴스 피드 캐시에 넣는다. <포스팅ID, 유저ID> 적절한 메모리의 캐시로 운용-보통 최신 정보 저장. 대부분의 사용자는 최신 포스팅을 읽기 원하므로 캐시미스 확률이 낮다.

 

피드 읽기 

동작과정

1. 사용자가 뉴스 피드를 읽으려는 요청을 보낸다.

2. 로드밸런서가 요청을 웹 서버 가운데 하나로 보낸다.

3. 웹 서버는 피드를 가져오기 위해 뉴스 피드 서비스를 호출한다.

4. 뉴스 피드 서비스는 뉴스 피드 캐시에서 포스팅ID 목록을 가져온다.

5. 뉴스 피드에 표시할 사용자 이름, 사용자 사진, 포스팅 콘텐츠, 이미지 등을 사용자 캐시와 포스팅 캐시에서 가져와 완전한 뉴스 피드를 만든다.

6. 생성된 뉴스 피드를 JSON 형태로 클라이언트에게 보낸다. 이후 렌더링

 

 

3) 추가적인 내용들

독특한 제약이나 요구조건이 있기 때문에 정답은 없다. 기술을 선택할 때는 그 배경에 어떤 trade-off가 있었는지 잘 이해하고 설명할 수 있어야 한다. 

 

추가적으로 고려할 사항들

  • DB 수직적 vs 수평적 확장
  • SQL vs NoSQL
  • master-slave(는 말은 지양하자 main-second) 다중화
  • replica에 대한 읽기 연산
  • consistency model 설정
  • DB Sharding
  • 가능한 많은 데이터를 캐싱할 방법
  • 메시지 큐를 이용해 각 컴포넌트 간 결합도 낮추기
  • 메트릭 모니터링