대규모 온라인 애플리케이션은 지난 XNUMX년 동안 많은 발전을 이루었습니다. 이러한 혁신은 소프트웨어 개발에 대한 우리의 인식을 바꾸어 놓았습니다. 예를 들어 Facebook, Instagram 및 Twitter는 모두 확장 가능한 플랫폼입니다.
이러한 시스템은 전 세계적으로 수십억 명의 사람들이 동시에 사용하기 때문에 방대한 양의 트래픽과 데이터를 관리하도록 구축되어야 합니다. 이 때 시스템 디자인 그림을 입력하십시오.
특정 기준을 충족하는 시스템의 아키텍처, 인터페이스 및 데이터를 설정하는 프로세스를 시스템 설계라고 합니다. 응집력 있고 효율적인 시스템을 통해 시스템 설계는 비즈니스 또는 조직의 요구를 충족시킵니다.
회사 또는 조직에서 기준을 결정한 후에는 이를 소비자의 요구 사항을 충족하는 물리적 시스템 설계에 통합할 수 있습니다.
맞춤형 개발, 상용 솔루션 또는 이 둘의 조합을 선택하든 시스템을 어떻게 설계하느냐에 따라 시스템 구축이 결정됩니다.
튜토리얼과 함께 이 게시물에서 Twitter 타임라인의 시스템 디자인을 자세히 살펴보겠습니다. 시작하자.
1단계: 사용 사례 및 제약 조건 개요
유스 케이스
- 사용자가 트윗을 업로드합니다.
- 이 서비스는 트윗 팔로워에게 푸시 알림과 이메일을 보냅니다.
- 사용자의 타임라인 조회(사용자의 활동)
- 사용자가 홈 타임라인을 봅니다(사용자가 팔로우하는 사람들의 활동).
- 키워드는 사용자가 검색합니다.
- 서비스가 정말 접근성이 좋습니다.
범위를 벗어남
- 트윗은 이 서비스를 사용하여 Twitter Firehose 및 기타 스트림으로 전송됩니다.
- 서비스는 사용자의 가시성 설정에 따라 트윗을 제거합니다.
- 사용자가 답장을 받는 사람도 팔로우하지 않는 경우 답장을 숨깁니다.
- '리트윗 숨기기' 옵션을 확인하세요.
- 통계 분석
제약 및 가정
상태 가정
- 트래픽이 균등하게 분산되지 않습니다.
- 트윗을 보내는 것은 간단해야 합니다.
- 수백만 명의 팔로워가 없다면 모든 팔로워에게 트윗을 보내는 것이 빠릅니다.
- 100억 명의 활성 사용자가 있습니다.
- 매월 15억 개의 트윗 또는 매일 500억 개의 트윗
- 각 트윗에는 평균 10번의 전달 팬아웃이 있습니다.
- 팬아웃은 매일 5억 개의 트윗을 전달합니다.
- Fanout은 매달 150억 개의 트윗을 전달합니다.
- 250억 월간 읽기 요청
- 10억 월간 검색
연혁
- 타임라인은 탐색하기 쉬워야 합니다.
- 트위터는 쓰기보다 읽기에 가깝습니다.
- 빠른 트윗 읽기에 최적화
- 트윗 소비는 시간이 많이 걸립니다.
검색
- 검색 프로세스가 빨라야 합니다.
- 검색하는 데 시간이 많이 걸립니다.
사용량 계산
각 트윗의 크기:
- 8바이트 트윗 ID
- 32바이트 사용자 ID
- 140바이트의 텍스트
- 미디어 – 평균 10KB
- 총계: ~10KB
매달 150TB의 새로운 트윗 콘텐츠가 생성됩니다.
- * 매일 500억 트윗 * 월 30일 * 트윗당 10KB
- 5.4년 동안 XNUMXPB의 새로운 트윗 콘텐츠가 생성되었습니다.
초당 100,000개의 읽기 요청이 있습니다.
- * (초당 400개 요청 / 월 1억 개 요청) 월 250억 개의 읽기 요청
초당 6,000개의 트윗이 있습니다.
- * (초당 400회 요청 / 월간 1억 회 요청) 매월 15억 회 트윗
팬아웃에서는 초당 60개의 트윗이 전송됩니다.
- Fanout은 매달 150억 개의 트윗을 전달합니다*(초당 400개 요청 / 월별 1억 개의 요청).
초당 4,000건의 정보 요청
- * (초당 400회 요청 / 월간 1억회 요청) 매월 10억회 검색
유용한 변환
- 매달 2.5만 초가 흐릅니다.
- 초당 2.5개의 요청으로 월 1만 요청
- 월 100억 요청 x 초당 40개 요청
- 월별 요청 1억 개 = 초당 요청 400개
2단계: 상위 수준 다이어그램
3단계: 핵심 구성 요소 설명
사용자가 트윗을 제출하면 사용자 자신의 트윗을 저장하여 관계형 데이터베이스에 사용자 타임라인(사용자의 활동)을 채울 수 있습니다. 트윗을 전달하고 홈 타임라인(사용자가 팔로우하는 개인의 활동)을 개발하는 것이 더 어렵습니다.
일반적인 관계형 데이터베이스는 모든 팔로워에게 트윗을 퍼뜨리면 압도됩니다(매초 60개 트윗 전송). 우리는 아마도 NoSQL 데이터베이스나 메모리 캐시와 같은 빠른 쓰기 데이터 스토리지를 원할 것입니다.
메모리에서 순차적으로 1MB를 읽는 데는 약 250마이크로초가 걸리지만 SSD에서 읽는 데는 4배, 디스크에서 읽는 데는 80배의 시간이 걸립니다.
개체 저장소는 이미지 및 비디오와 같은 데이터를 저장하는 데 사용할 수 있습니다.
- 역 프록시 역할을 하는 웹 서버는 클라이언트로부터 트윗을 수신합니다.
- 요청은 웹 서버에 의해 쓰기 API 서버로 전송됩니다.
- 쓰기 API는 트윗을 사용자 타임라인의 SQL 데이터베이스에 저장합니다.
팬아웃 서비스는 쓰기 API에 의해 연결되며 다음 작업을 수행합니다.
- 사용자 그래프 서비스를 쿼리하여 메모리 캐시에서 사용자의 팔로워를 찾습니다.
- 메모리 캐시에서 트윗은 사용자 팔로워의 홈 타임라인에 저장됩니다.
- 1,000명의 팔로워 = 1,000개의 조회 및 삽입 = O(n) 작업.
- 트윗은 빠른 검색을 위해 검색 색인 서비스에 저장됩니다.
- 개체 저장소는 미디어를 저장하는 데 사용됩니다.
- 알림 서비스를 통해 팔로워에게 푸시 알림을 보냅니다.
- 알림을 비동기적으로 보내기 위해 큐를 사용합니다.
메모리 캐시가 Redis인 경우 다음 구조로 기본 Redis 목록을 활용할 수 있습니다.
사용자의 홈 타임라인은 새 트윗으로 업데이트되어 메모리 캐시에 저장됩니다. 다음 공개 REST API를 사용합니다.
사용자 타임라인은 사용자가 봅니다.
- 웹 서버는 클라이언트로부터 사용자 타임라인 요청을 받습니다.
- 요청은 웹 서버에 의해 읽기 API 서버로 전송됩니다.
- 읽기 API는 사용자 시간 프레임에 대해 SQL Database를 쿼리합니다.
REST API는 홈 타임라인과 유사하게 작동하지만 모든 트윗은 팔로우하는 사람이 아니라 사용자가 보낸다는 점만 다릅니다.
사용자가 키워드를 검색합니다.
- 웹 서버는 클라이언트로부터 검색 요청을 받습니다.
- 요청은 웹 서버에 의해 검색 API 서버로 전송됩니다.
4단계: 트위터 타임라인
타임라인 생성은 어려운 작업입니다. 웹 또는 애플리케이션 서버와 연결되는 타임라인 생성 서버가 필요합니다.
사용자가 로그인할 때마다 타임라인 서비스는 팔로어 테이블에 있는 사용자의 최신 트윗을 추적하고 사용자의 타임라인을 업데이트하거나 새로 고칩니다.
여기서는 어떤 종류의 순위 시스템도 구현하지 않습니다. 대신 사용자 팔로워의 상위 5개 트윗이 생성 시간 순서대로 타임라인에 표시된다고 가정합니다. 50개의 트윗 새로 고침 컷오프를 유지할 수 있습니다. 임계값에 도달한 후에도 사용자가 페이지를 새로 고칠 때까지 새로 고침 또는 타임라인 구성을 중단합니다.
높은 대기 시간 및 성능 문제는 실시간 사용자 피드 생성에서 비롯됩니다. 대신 즉시 표시할 수 있는 오프라인 스트림을 만드는 것이 성능을 향상시키는 가장 좋은 방법입니다. 애플리케이션 서버를 정기적으로 ping하는 전용 타임라인 서버를 실행하여 생성된 시간을 기준으로 피드를 새로 고칩니다.
순위 알고리즘은 중요한 신호를 고려하고 사용자의 타임라인이 팔로우하는 계정 중 하나 이상의 자료에 의해 지배되지 않도록 가중치를 제공해야 합니다.
더 정확하게는 좋아요 수, 댓글 수, 공유 수 및 업데이트 시간과 같은 피드 항목의 관련성과 관련된 기능을 선택할 수 있습니다. 이러한 각 기준을 사용하여 트윗을 평가한 다음 해당 순위를 사용하여 타임라인에 트윗을 표시해야 합니다.
뉴스피드에 대한 새로운 콘텐츠를 사용할 수 있게 되면 사용자에게 지속적으로 알려야 합니까? 사용자는 새 데이터를 사용할 수 있을 때 알림을 받는 것이 유용하다는 것을 알 수 있습니다. 그러나 모바일 장치에서 데이터 사용에 비용이 많이 드는 경우 대역폭을 낭비할 수 있습니다.
결과적으로 우리는 데이터를 모바일 장치로 푸시하지 않고 사용자가 새 게시물에 대해 "새로 고침"을 허용하도록 선택할 수 있습니다.
5단계: 디자인 확장
잠재적인 병목 현상은 팬아웃 서비스입니다. 수백만 명의 팔로워를 보유한 트위터 사용자는 트윗이 출시될 때까지 몇 분 정도 기다려야 합니다. 이로 인해 트윗에 대한 답글과의 경쟁이 발생할 수 있으며, 이는 서비스 시간에 트윗을 다시 정렬하여 피할 수 있습니다.
팔로워 수가 많은 사람들의 트윗이 퍼지는 것을 방지할 수도 있습니다. 대신, 팔로우가 많은 개인의 트윗을 검색하고 검색 결과를 사용자의 홈 타임라인 결과와 통합한 다음 검색 시간에 트윗을 재정렬할 수 있습니다.
추가 개선 사항은 다음과 같습니다.
- 각 홈 타임라인에 대해 메모리 캐시에 몇 백 개의 트윗만 보관하십시오.
- 메모리 캐시에는 활성 사용자의 홈 타임라인 정보만 저장됩니다.
- 사용자가 이전 30일 동안 활동하지 않은 경우 SQL Database에서 연대기를 재구성할 수 있습니다.
- 사용자가 누구인지 확인하려면 사용자 그래프 서비스를 활용하십시오.
- SQL 데이터베이스에서 검색하여 메모리 캐시에 트윗을 추가합니다.
- 트윗 정보 서비스는 한 달 분량의 트윗만 저장할 수 있습니다.
- 사용자 정보 서비스에는 활성 사용자만 저장됩니다.
- 대기 시간을 낮게 유지하려면 검색 클러스터가 트윗을 메모리에 유지해야 할 가능성이 큽니다.
결론
트위터는 큰 조직이지만 더 나은 시스템 설계에 대한 이해. 트위터 타임라인에 대한 높은 수준의 개요를 제공하기 위해 최선을 다했습니다.
유익한 정보 얻어가셔서 유용하게 사용하시길 바랍니다.
댓글을 남겨주세요.