시스템 디자인

"1억 명이 사용하는 트위터를 설계해보세요." - 시스템 디자인 인터뷰 단골 질문 공략하기

하루에 10억 개의 트윗을 처리하는 기술, 당신이라면 어떻게 설계하실 건가요?

2024.12.23 | 조회 878 |
0
|
데브필 DevPill의 프로필 이미지

데브필 DevPill

Top 1% 개발자로 거듭나는 성공 처방전

Introduction

매일 수억 명의 사용자가 실시간으로 소통하는 트위터. 이 거대한 소셜 네트워크는 어떻게 초당 수천 개의 트윗을 처리하면서도 밀리초 단위의 응답 속도를 유지할 수 있을까요?

이 질문은 구글, 메타, 아마존과 같은 실리콘밸리 기업들이 시스템 설계 면접에서 가장 선호하는 문제 중 하나입니다. 단순해 보이는 이 질문 속에는 대규모 분산 시스템의 모든 도전 과제가 담겨있기 때문이죠.

"트윗 작성 버튼을 누르는 순간부터 전 세계 팔로워의 피드에 표시되기까지, 그 1초도 안 되는 여정에서 어떤 기술적 난제들이 있을까요? 실시간성, 확장성, 안정성을 모두 달성하려면 어떤 트레이드오프를 고려해야 할까요?"

이 글 [Designing Twitter – A System Design Interview Question]에서는 트위터의 핵심 아키텍처를 하나하나 뜯어보면서, 대규모 시스템 설계의 정수를 살펴볼게요. FAANG 기업들의 시스템 설계 면접을 준비하시는 분들은 물론, 실제로 대규모 시스템을 설계하고 운영하시는 분들에게도 유용한 인사이트를 제공해드리겠습니다.


"1억 명이 사용하는 트위터를 설계해보세요."

 

트위터나 페이스북과 같은 대규모 소셜 미디어 플랫폼의 시스템 설계는 기술 면접에서 자주 다루어지는 주제입니다. 많은 지원자가 코딩 테스트보다 시스템 설계 면접을 더 어려워하는데, 이는 제한된 시간 안에 고려해야 할 설계 요소와 트레이드오프가 많기 때문입니다.

 

첨부 이미지

1. 트위터를 어떻게 설계할 것인가?

시스템 설계 면접에서 이런 질문을 받았을 때는 섣불리 기술적인 세부사항을 언급하지 않는 것이 중요합니다. MongoDB, Bootstrap, MapReduce 등의 기술을 나열하기보다는, 실제 프로젝트에 임하듯이 먼저 문제를 정의하고 요구사항을 명확히 하는 것부터 시작해야 합니다.

2. 트위터 시스템 설계 요구사항

2.1 기능적 요구사항:

  • 새로운 트윗을 작성할 수 있어야 함 (텍스트, 이미지, 동영상 등)
  • 다른 사용자를 팔로우할 수 있어야 함
  • 팔로우하는 사람들의 트윗으로 구성된 뉴스피드 기능이 있어야 함
  • 트윗을 검색할 수 있어야 함

2.2 비기능적 요구사항:

  • 최소한의 지연시간으로 높은 가용성 보장
  • 시스템은 확장 가능하고 효율적이어야 함

2.3 추가 요구사항:

  • 매트릭(지표)과 애널리틱스
  • 리트윗 기능
  • 트윗 즐겨찾기

3. 용량 산정하기

시스템의 용량을 산정하기 위해 예상되는 일일 클릭률을 분석해보겠습니다.

3.1 트래픽 산정:

총 사용자 10억 명, 일일 활성 사용자(DAU) 2억 명을 가정하고, 각 사용자가 하루 평균 5개의 트윗을 작성한다고 가정하면 하루 10억 개의 트윗이 생성됩니다.

 

2억 명 * 5개 트윗 = 10억 개/일

 

트윗은 이미지나 동영상과 같은 미디어를 포함할 수 있습니다. 사용자가 공유하는 트윗의 10%가 미디어 파일이라고 가정하면, 하루 1억 개의 추가 파일을 저장해야 합니다.

10% * 10억 = 1억/일

우리 시스템의 초당 요청 수(RPS)는 다음과 같습니다:

하루 10억 개의 요청은 초당 약 12,000개의 요청으로 환산됩니다.
10억 / (24시간 * 3,600초) = 12,000 요청/초

3.2 저장소 산정:

각 메시지가 평균 100바이트라고 가정하면, 하루에 약 100GB의 데이터베이스 저장 공간이 필요합니다.

10억 * 100바이트 = 100GB/일

일일 메시지의 10%(1억 개)가 미디어 파일이며, 각 파일이 평균 50KB라고 가정하면 하루에 5TB의 저장 공간이 필요합니다.

1억 * 50KB = 5TB/일

10년간 필요한 저장 공간은 19PB입니다.

(5TB + 0.1TB) * 365일 * 10년 = 19PB

3.3 대역폭 산정

시스템이 하루에 5.1TB의 인그레스(ingress)를 처리하므로, 최소 초당 60MB의 대역폭이 필요합니다.

5.1TB / (24시간 * 3,600초) = 60MB/초

4. 유스케이스 설계

첨부 이미지

시스템의 주요 기능:

  • 사용자가 트위터 페이지에 접속하면 메인 페이지, 홈 페이지, 검색 페이지, 알림 페이지에 접근할 수 있습니다.
  • 홈 페이지에서는 새 트윗 작성과 이미지/동영상 게시가 가능합니다.
  • 새 트윗에는 좋아요, 싫어요, 댓글 기능과 팔로우/언팔로우 버튼이 포함됩니다.
  • 비회원(게스트) 사용자는 트윗 조회만 가능합니다.
  • 등록된 사용자는 트윗 조회 및 작성이 가능하며, 다른 사용자를 팔로우/언팔로우할 수 있습니다.
  • 등록된 사용자는 새로운 트윗을 작성할 수 있습니다.

5. 저수준 설계

트위터의 저수준 설계는 개별 컴포넌트와 기능의 세부사항을 다룹니다. 주요 측면들을 살펴보겠습니다.

첨부 이미지

5.1 데이터 저장

  • 사용자 계정: MySQL과 같은 관계형 데이터베이스에 사용자 이름, 이메일, 비밀번호(해시됨), 프로필 사진, 자기소개 등을 저장
  • 트윗: 동일한 데이터베이스의 별도 테이블에 트윗 내용, 작성자 ID, 타임스탬프, 해시태그, 멘션, 리트윗, 답글 등을 저장
  • 팔로우 관계: 별도 테이블에 팔로워와 팔로이의 관계를 매핑하여 사용자 피드의 효율적인 검색이 가능하도록 함
  • 추가 데이터: S3와 같은 전용 저장소에 이미지나 동영상 같은 미디어 자산을 저장하고 트윗 테이블에서 참조

 

5.2 핵심 기능

트윗 작성:

  • 사용자가 UI를 통해 트윗 콘텐츠를전송
  • 서버 측에서 트윗 길이, 미디어 크기 등의 제약조건 검증(validation)
  • 관련 정보(해시태그, 멘션, 답글)와 함께 데이터베이스에 트윗 데이터 저장
  • 팔로워와 멘션된 사용자들에게 실시간 알림 전송

타임라인 생성:

  • 현재 사용자가 팔로우하는 사용자와 해시태그 목록 조회
  • 데이터베이스에서 해당 사용자들과 해시태그에 맞는 최근 트윗 가져오기
  • 관련성, 최신성, 참여도 등을 기준으로 트윗 순위를 매기는 알고리즘 적용
  • 빠른 전달을 위해 자주 접근되는 타임라인을 Redis에 캐싱

검색:

  • 사용자가 키워드나 해시태그 입력
  • 서버 측에서 트윗 내용, 해시태그, 사용자 메타데이터 분석
  • 순위 알고리즘을 기반으로 관련 트윗 반환

팔로우/언팔로우:

  • 팔로우 관계 테이블 업데이트
  • 관련 알림 트리거 및 사용자 타임라인 동적 조정

 

5.3 추가 고려사항:

첨부 이미지

캐싱(Caching):

  • Redis와 같은 캐싱 메커니즘을 사용하여 사용자 타임라인과 트렌딩 토픽과 같이 자주 접근되는 데이터의 데이터베이스 부하 감소

부하 분산(Load Balancing):

  • 높은 트래픽 처리와 확장성 보장을 위해 여러 서버에 작업 부하 분산

데이터베이스 복제(Database Replication):

  • 데이터베이스 복제 기술을 통한 데이터 중복성과 결함 허용성(fault tolerance) 보장

메시지 큐(Message Queue):

  • 알림 전송이나 백그라운드 인덱싱과 같은 작업을 처리하기 위한 비동기 메시지 큐 활용

API 설계(API design):

  • 시스템 내 다양한 컴포넌트 간의 내부 통신을 위한 명확한 API 정의

6. 고수준 설계

이번에는 트위터의 고수준 설계에 대해 논의해보겠습니다.

첨부 이미지

6.1 아키텍처

서비스를 수평적으로 확장하고 서비스간 결합도를 낮추기 위해 마이크로서비스 아키텍처를 사용합니다. 각 서비스는 자체 데이터 모델을 소유하며, 시스템을 핵심 서비스들로 나눕니다.

 

6.2 사용자 서비스

인증과 사용자 정보와 같은 사용자 관련 문제를 처리합니다. 로그인 페이지, 회원가입 페이지, 프로필 페이지, 홈 화면이 이 서비스에서 처리됩니다.

 

6.3 뉴스피드(newsfeed) 서비스

사용자 뉴스피드의 생성과 발행을 처리합니다. 뉴스피드에 대해 더 자세히 살펴보도록 하죠. 뉴스피드는 구현하기 쉬워 보이지만, 이 기능을 성공적으로 만들거나 혹은 망칠 수 있는 많은 요소들이 있습니다. 문제를 두 부분으로 나누어 보겠습니다:

6.3.1 생성(generation)

사용자 A의 피드를 생성한다고 가정할 때, 다음 단계를 수행합니다:

  • 모든 사용자와 엔티티(해시태그, 토픽 등)의 ID 조회
  • 관련성, 시간 관리 등의 매개변수를 기반으로 트윗 순위를 매기는 알고리즘 가져오기
  • 관련성, 시간, 참여도 등의 매개변수를 기반으로 트윗 순위를 매기는 알고리즘 적용
  • 순위가 매겨진 트윗 데이터를 페이지네이션 방식으로 클라이언트에 반환

피드 생성은 리소스를 많이 사용하는 프로세스이며, 특히 많은 사람을 팔로우하는 사용자의 경우 상당한 시간이 걸릴 수 있습니다. 성능을 개선하기 위해 피드를 미리 생성하여 캐시에 저장하고, 주기적으로 피드를 업데이트하고 새로운 트윗에 순위 알고리즘을 적용하는 메커니즘을 구현할 수 있습니다.

6.3.2 발행(publishing)

발행은 각 사용자에 맞춰 피드 데이터를 푸시하는 단계입니다. 사용자가 수백만 명의 친구나 팔로워를 가질 수 있기 때문에 이는 매우 무거운 작업이 될 수 있습니다. 이를 처리하기 위한 세 가지 접근 방식이 있습니다:

풀 모델(Pull Model) (또는 로드 시 팬아웃):

  • 사용자가 트윗을 작성하고 팔로워가 뉴스피드를 새로고침할 때 피드가 생성되어 메모리에 저장됨
  • 사용자가 요청할 때만 최신 피드가 로드됨
  • 이 접근 방식은 데이터베이스의 쓰기 작업 수를 줄임
  • 단점은 사용자가 서버에서 데이터를 "풀"하지 않는 한 최신 피드를 볼 수 없어 읽기 작업 수가 증가한다는 것
첨부 이미지

푸시 모델(Push Model) (또는 쓰기 시 팬아웃):

  • 사용자가 트윗을 작성하면 곧바로 모든 팔로워의 피드로 푸시됨
  • 업데이트를 확인하기 위해 사용자의 전체 팔로워 목록을 검사할 필요가 없음
  • 단점은 데이터베이스의 쓰기 작업 수가 증가한다는 것
첨부 이미지

하이브리드 모델:

  • 풀 모델과 푸시 모델의 장점을 결합한 균형 잡힌 접근 방식
  • 팔로워 수가 적은 사용자만 푸시 모델을 사용하도록 허용
  • 연예인과 같이 팔로워가 많은 사용자의 경우 풀 모델을 사용

6.4 트윗 서비스

트윗 작성, 즐겨찾기 등 트윗 관련 유스케이스를 처리하는 마이크로서비스입니다.

6.5 리트윗

추가 요구사항 중 하나인 리트윗 기능을 구현하기 위해, 리트윗하는 사용자의 ID로 새 트윗을 생성하고 새 트윗의 type enum과 content 프로퍼티를 수정하여 원본 트윗과 연결할 수 있습니다.

6.6 검색 서비스

검색 관련 기능을 담당하는 마이크로서비스입니다. 검색 서비스에서는 랭킹 시스템을 통해 인기 게시물, 최신 게시물 등을 제공합니다.

6.7 미디어 서비스

이미지, 동영상, 파일 등의 미디어 업로드를 처리하는 서비스입니다.

6.8 Analytics 서비스

각종 메트릭과 analytics 유스 케이스를 위한 서비스입니다.

6.9 랭킹 알고리즘

각 사용자에게 특화된 관련성에 따라 각 트윗의 순위를 매기는 알고리즘이 필요합니다.

ex) 페이스북은 EdgeRank 알고리즘을 사용했습니다. 각 피드 항목의 순위는 다음과 같이 계산됩니다:

순위 = 친밀도(Affinity) * 가중치(Weight) * 시간 감쇠(Decay)

여기서:

  • 친밀도(Affinity): 사용자와 콘텐츠 작성자 간의 "친밀도"입니다. 사용자가 콘텐츠 작성자의 게시물에 자주 좋아요를 누르거나, 댓글을 달거나, 메시지를 보내면 친밀도 값이 높아져 게시물의 순위가 올라갑니다.
  • 가중치(Weight): 각 상호작용에 할당된 값입니다. 예를 들어 댓글은 좋아요보다 높은 가중치를 가질 수 있으며, 따라서 댓글이 많은 게시물이 더 높은 순위를 받을 가능성이 높습니다.
  • 시간 감쇠(Decay): 콘텐츠 생성 시점을 측정합니다. 시간이 지날수록 감쇠 값이 작아지고 결과적으로 순위가 낮아집니다.

현재는 알고리즘이 훨씬 더 복잡해졌습니다. 수천 개의 요소를 고려할 수 있는 머신러닝 모델을 사용하여 순위를 매기죠.

6.10 검색 서비스

때로는 전통적인 DBMS가 충분한 성능을 제공하지 못할 수 있습니다. 대량의 데이터를 빠르게 저장, 검색, 분석하고 밀리초 단위로 결과를 제공할 수 있는 솔루션이 필요합니다. Elasticsearch가 이러한 용도로 도움이 될 수 있습니다.

Elasticsearch는 모든 유형의 데이터(텍스트, 숫자, 지리공간, 구조화 및 비구조화 데이터)를 위한 분산형 무료 오픈소스 검색 및 분석 엔진입니다. Apache Lucene을 기반으로 구축되었습니다.

 

6.11 트렌딩 토픽은 어떻게 식별하나요?

  • 트렌딩 기능은 검색 기능을 기반으로 합니다.
  • 최근 N초 동안 가장 자주 검색된 쿼리, 해시태그, 토픽을 캐시하고 배치 작업 메커니즘을 사용하여 M초마다 업데이트할 수 있습니다.
  • 랭킹 알고리즘을 트렌딩 토픽에도 적용하여 가중치를 부여하고 사용자에게 개인화할 수 있습니다.

6.12 알림 서비스

  • 푸시 알림은 모든 소셜 미디어 플랫폼의 필수적인 부분입니다.
  • Apache Kafka와 같은 메시지 큐나 메시지 브로커를 알림 서비스와 함께 사용하여 Firebase Cloud Messaging(FCM) 또는 Apple Push Notification Service(APNS)에 요청을 전달할 수 있으며, 이를 통해 사용자 기기로 푸시 알림을 전달합니다.

7. 데이터 모델 설계

다음은 요구사항을 반영하는 일반적인 데이터 모델입니다.

첨부 이미지

7.1 Users (사용자):

이 테이블은 ID가 자동 생성되는 고유 필드이며 사용자의 이름, 이메일, 생년월일 및 기타 정보를 포함합니다.

Users { ID: Autofield, Name: Varchar, Email: Varchar, DOB: Date, Created At: Date }

7.2 Tweets (트윗):

이 테이블은 트윗과 해당 속성(타입: 텍스트, 이미지, 비디오 등), 내용 등을 저장합니다. UserID도 저장됩니다.

Tweets { id: uuid, UserID: uuid, type: enum, content: varchar, createdAt: timestamp }

7.3 Favorites (즐겨찾기):

이 테이블은 애플리케이션의 즐겨찾기 트윗 기능을 위해 트윗과 사용자를 매핑합니다.

Favorites { id: uuid, UserID: uuid, TweetID: uuid, CreatedAt: timestamp }

 

 

7.4 Followers (팔로워):

이 테이블은 팔로워와 팔로이(팔로우 당하는 사람)를 매핑합니다. N:M 관계를 가집니다.

Followers { id: uuid, followerID: uuid, followeeID: uuid }

7.5 Feeds (피드):

이 테이블은 해당 사용자 ID와 함께 피드 속성을 저장합니다.

Feeds { id: uuid, userID: uuid, UpdatedAt: Timestamp }

7.6 Feeds_Tweets (피드_트윗):

이 테이블은 트윗과 피드를 매핑합니다(N:M 관계).

feeds_tweets { id: uuid, tweetID: uuid, feedID: uuid }

7.7 트위터는 어떤 종류의 데이터베이스를 사용하나요?

  • 우리가 설계한 데이터 모델은 꽤나 관계형에 가깝지만, 모든 것을 단일 데이터베이스에 저장할 필요는 없습니다. 이는 확장성을 제한하고 병목현상을 빠르게 야기할 수 있기 때문입니다.
  • 데이터를 서로 다른 서비스로 분할하여 각각이 특정 테이블에 대한 소유권을 가지도록 할 수 있습니다. 그런 다음 PostgreSQL과 같은 관계형 데이터베이스나 Apache Cassandra와 같은 분산 NoSQL 데이터베이스를 사용할 수 있습니다.

8. API 설계

서비스를 위한 기본적인 API 설계:

8.1 트윗 작성:

플랫폼에 트윗을 게시할 수 있는 API입니다.

{ userID: UUID, content: string, mediaURL?: string }

매개변수:

  • User ID(UUID): 사용자의 ID
  • Content(string): 트윗 내용
  • Media URL(string): 첨부된 미디어의 URL (선택사항)
  • Result(boolean): 작업 성공 여부를 나타냄

8.2 사용자 팔로우/언팔로우:

사용자가 다른 사용자를 팔로우하거나 언팔로우할 수 있는 API입니다.

{ followerID: UUID, followeeID: UUID }

매개변수:

  • Follower ID(UUID): 현재 사용자의 ID
  • Followee ID(UUID): 팔로우하거나 언팔로우하려는 사용자의 ID
  • Result(boolean): 작업 성공 여부를 나타냄

8.3 뉴스피드 가져오기:

이 API는 주어진 뉴스피드 내에 표시될 모든 트윗을 반환합니다.

{ userID: UUID }

매개변수:

  • User ID (UUID): 사용자의 ID
  • Tweets(Tweet[]): 주어진 뉴스피드 내에 표시될 모든 트윗

 

9. 트위터 시스템 설계를 위한 마이크로서비스

9.1 데이터 파티셔닝

데이터베이스를 확장하기 위해서는 데이터 파티셔닝이 필요합니다. 수평 파티셔닝(샤딩이라고도 함)이 좋은 첫 단계가 될 수 있습니다. 다음과 같은 파티션 방식을 사용할 수 있습니다.

  • 해시 기반 파티셔닝
  • 리스트 기반 파티셔닝
  • 범위 기반 파티셔닝
  • 복합 파티셔닝

위의 접근 방식들은 여전히 불균등한 데이터와 부하 분산을 야기할 수 있는데요, 이는 안정 해시(Consistent hashing)를 통해 해결할 수 있습니다.

9.2 함께 아는 친구(Mutual friends)

함께 아는 친구 기능을 위해 모든 사용자에 대한 소셜 그래프를 구축할 수 있습니다.

  • 그래프의 각 노드는 사용자를 나타냅니다.
  • 엣지는 방향을 갖고 있는데요(directional edge), 이를 이용해 팔로워(follower)와 팔로이(followee)를 나타냅니다.
  • 함께 아는 친구를 찾고 추천하기 위해 사용자의 팔로워를 탐색할 수 있습니다.
  • 이를 위해서는 Neo4j나 ArangoDB와 같은 그래프 기반 데이터베이스가 필요합니다.

이는 매우 기본적인 알고리즘입니다. 추천 정확도를 높이기 위해서는 머신러닝을 활용하는 추천 모델을 알고리즘에 포함시켜야 합니다.

 

9.3 메트릭과 애널리틱스

  • 애널리틱스와 메트릭을 저장하는 것은 추가 요구사항 중 하나입니다.
  • Apache Kafka를 사용하여 모든 종류의 이벤트를 발행할 것이므로, 이러한 이벤트를 처리하고 대규모 데이터 처리를 위한 오픈소스 통합 분석 엔진인 Apache Spark를 사용하여 데이터를 분석할 수 있습니다.

 

9.4 캐싱

  • 소셜 미디어 서비스에서는 사용자가 최신 데이터를 기대하기 때문에 캐시 사용에 주의를 기울여야 합니다. 따라서 리소스로 인한 사용량 급증을 방지하기 위해 트윗 상위 20%를 캐시할 수 있습니다.
  • 효율성을 더욱 높이기 위해 시스템 API에 페이지네이션을 추가할 수 있습니다. 이는 요청하지 않는 한 이전 메시지를 검색할 필요가 없게 하기 때문에 네트워크 대역폭이 제한된 사용자들에게 도움이 됩니다.

 

9.5 미디어 접근 및 저장

대부분의 저장 공간은 이미지, 동영상 또는 기타 파일과 같은 미디어 파일을 저장하는 데 사용됩니다.

  • 미디어 서비스는 사용자 미디어 파일의 접근과 저장을 모두 처리합니다.
  • 대규모로 파일을 저장하기 위해서는 객체 스토리지가 필요합니다.
  • 객체 스토리지는 데이터 파일을 객체라고 하는 조각으로 나누어 저장합니다.
  • 이러한 객체들은 여러 네트워크 시스템에 분산될 수 있는 단일 저장소에 저장됩니다.
  • HDFS나 GlusterFS와 같은 분산 파일 스토리지를 사용할 수도 있습니다.

 

9.6 콘텐츠 전송 네트워크(CDN)

  • CDN은 콘텐츠 가용성과 중복성을 높이고 대역폭 비용을 줄입니다.
  • 일반적으로 이미지와 동영상과 같은 정적 파일은 CDN에서 제공됩니다.
  • 이 용도로 AWS CloudFront나 Cloudflare CDN과 같은 서비스를 사용할 수 있습니다.

 

10. 트위터 시스템 설계의 확장성

이제 우리가 디자인한 시스템에서 단일 장애 지점(single point of failure)을 식별하고 해결해봅시다. 이를 위해 아래와 같이 질문을 던져볼 수 있는데요.

"서비스 중 하나가 중단되면 어떻게 될까요?"
"컴포넌트 간의 트래픽을 어떻게 분산할까요?"
"데이터베이스 부하를 어떻게 줄일 수 있을까요?"
"캐시의 가용성을 어떻게 개선할 수 있을까요?"
"알림 시스템을 어떻게 더 견고하게 만들 수 있을까요?"
"미디어 저장 비용을 어떻게 줄일 수 있을까요?"

시스템을 더 견고하게 만들기 위해 다음과 같은 조치를 취할 수 있습니다:

  • 각 서비스 별로 다중화 실행
  • 클라이언트, 서버, 데이터베이스, 캐시 서버 사이에 로드 밸런서 도입
  • 데이터베이스 부하 분산을 위해 여러 개의 읽기 전용 레플리카(replica) 사용
  • 분산 캐시를 위한 다중 인스턴스와 레플리카 구현
  • 분산 시스템에서 정확히 한 번 전달메시지 순서 보장은 어려운 과제입니다. 이는 Apache Kafka나 NATS와 같은 전용 메시지 브로커를 사용해 알림 시스템을 더 견고하게 만들 수 있습니다.
  • 미디어 서비스에 미디어 처리 및 압축 기능을 추가하여 대용량 파일을 압축함으로써 저장 공간을 절약하고 비용을 절감할 수 있습니다.

결론

트위터는 초당 수천 개의 트윗을 처리하므로 모든 데이터를 처리하기 위한 하나의 큰 시스템이나 테이블만으로는 충분하지 않습니다. 따라서 분산 접근 방식을 통해 처리해야 합니다.

트위터는 'scatter and gather' 전략을 사용합니다:

  • 여러 서버나 데이터 센터를 설정하여 인덱싱을 허용
  • 쿼리(예: #geeksforgeeks)가 들어오면 모든 서버나 데이터 센터로 전송
  • 모든 Early Bird 샤드에서 쿼리 실행
  • 쿼리와 일치하는 모든 Early Bird가 결과 반환
  • 결과는 반환되어 정렬, 병합, 재순위 지정
  • 순위는 리트윗 수, 답글 수, 트윗의 인기도를 기반으로 결정

 

 


👥 더 나은 데브필을 만드는 데 의견을 보태주세요

Top 1% 개발자로 거듭나기 위한 처방전, DevPill 구독자 여러분 안녕하세요 :) 

저는 여러분들이 너무 궁금합니다. 

어떤 마음으로 뉴스레터를 구독해주시는지, 

어떤 환경에서 최고의 개발자가 되기 위해 고군분투하고 계신지, 

제가 드릴 수 있는 도움은 어떤 게 있을지. 

아래 설문조사에 참여해주시면 더 나은 콘텐츠를 제작할 수 있도록 힘쓰겠습니다. 설문에 참여해주시는 분들 전원 1개월 유료 멤버십 구독권을 선물드립니다. 유료 멤버십에서는 아래와 같은 혜택이 제공됩니다.

  • DevPill과의 1:1 온라인 커피챗
  • 멤버십 전용 슬랙 채널 참여권
    • 채용 정보 공유 / 스터디 그룹 형성 / 실시간 기술 질의응답
  • 이력서/포트폴리오 템플릿

 

설문 참여하고 유료 멤버십 혜택받기 →

첨부 이미지

 

 

다가올 뉴스레터가 궁금하신가요?

지금 구독해서 새로운 레터를 받아보세요

이번 뉴스레터 어떠셨나요?

데브필 DevPill 님에게 ☕️ 커피와 ✉️ 쪽지를 보내보세요!

댓글

의견을 남겨주세요

확인
의견이 있으신가요? 제일 먼저 댓글을 달아보세요 !

다른 뉴스레터

© 2024 데브필 DevPill

Top 1% 개발자로 거듭나는 성공 처방전

뉴스레터 문의dev.redpill@gmail.com

메일리 로고

자주 묻는 질문 서비스 소개서 오류 및 기능 관련 제보

서비스 이용 문의admin@team.maily.so

메일리 사업자 정보

메일리 (대표자: 이한결) | 사업자번호: 717-47-00705 | 서울 서초구 강남대로53길 8, 8층 11-7호

이용약관 | 개인정보처리방침 | 정기결제 이용약관 | 라이선스