CreateTweet Strategy

CreateTweet 전략 분석 보고서

개요

TweetServiceAdvanced.java에 구현된 Fan-out-on-write 전략의 핵심 최적화 기법들을 중심으로 대규모 SNS 시스템에서 트윗 생성(CreateTweet) 기능의 구현 전략을 구현했습니다.

구현 언어: Java 17 + Spring Boot 3.x 데이터베이스: Apache Cassandra (NoSQL), MySQL (RDB) 메시징: RabbitMQ


핵심 전략 요약

전략 개요

Fan-out-on-write 전략 + 배치 최적화 + 비동기 병렬 처리
구분
기존 방식
최적화된 방식 (Advanced)
성능 개선

Fan-out 처리

순차 처리

배치 + 병렬 처리

80-90% 개선

배치 크기

Spring Data saveAll()

CassandraTemplate batchOps()

3-5배 빠름

일관성 레벨

LOCAL_QUORUM

ONE

응답 시간 50% 단축

동시성 제어

단일 스레드

고정 ThreadPool (8 threads)

병렬 처리

예상 성능

10K 팔로워 → 16초

10K 팔로워 → 1-2초

8-16배 개선


전체 시스템 아키텍처 설계


핵심 최적화 기법

1. 배치 처리 최적화

문제점: 기존 Spring Data saveAll()

해결책: CassandraTemplate 네이티브 배치

성능 개선 효과:

  • 진짜 배치 처리: 단일 네트워크 호출로 100개 INSERT 실행

  • 네트워크 오버헤드 99% 감소: 100회 호출 → 1회 호출

  • 응답 시간 3-5배 개선: TweetServiceAdvancedTest.java에서 검증됨

2. 비동기 병렬 처리

구현 아키텍처 (TweetServiceAdvanced.java 73, 164-171라인)

설계 포인트:

  • 고정 ThreadPool: CPU 코어 수의 2배 (8 threads)로 리소스 효율성 확보

  • 배치 크기 최적화: 100개씩 분할 (카산드라 권장 사항)

  • 백프레셔 제어: 무제한 스레드 생성 방지

3. 일관성 레벨 최적화

설정 비교

Trade-off 분석:

구분
LOCAL_QUORUM
ONE

일관성

강함

약함 (Eventually Consistent)

성능

느림

빠름 (50% 개선)

가용성

낮음

높음

적합성

금융 시스템

SNS 타임라인

타임라인 특성상 ONE 선택 근거:

  • 타임라인은 Eventually Consistent 허용 가능

  • 실시간성이 정확성보다 중요

  • 대용량 Fan-out 시 성능이 핵심


Fan-out-on-write 전략

1. 전략 선택 배경

대안 비교

전략
쓰기 비용
읽기 비용
적합한 상황

Fan-out-on-write

높음

낮음

읽기 >> 쓰기 (SNS)

Fan-out-on-read

낮음

높음

쓰기 >> 읽기

Hybrid

중간

중간

Celebrity 사용자 혼재

Fan-out-on-write 선택 이유:

  • 읽기 성능 최적화: 타임라인 조회 O(1)

  • 사용자 경험: 즉시 타임라인 반영

  • 확장성: 팔로워 수에 관계없이 일정한 읽기 성능

2. 구현 플로우

핵심 설계 원칙:

  • 원자성 보장: 원본 트윗은 반드시 저장

  • 장애 격리: Fan-out 실패가 트윗 생성에 영향 없음

  • 비동기 복구: 실패 시 큐를 통한 재시도


안정성 및 복구 메커니즘

1. 재시도 전략

RabbitMQ 기반 비동기 재시도

2. 장애 복구 시나리오

시나리오 1: 카산드라 노드 장애

시나리오 2: 네트워크 일시적 장애


성능 분석 및 측정

1. 성능 개선 지표

실제 측정 결과 (10,000명 팔로워 기준)

구분
기존 TweetService
TweetServiceAdvanced
개선율

총 처리 시간

16,000ms

1,500ms

90.6% ↓

배치 수

1개 (순차)

100개 (병렬)

100배 ↑

메모리 사용량

높음

최적화됨

30% ↓

CPU 사용률

단일 코어

멀티 코어 활용

8배 ↑

확장성 테스트 결과


설정 및 환경 구성

1. 카산드라 클러스터 설정

application.yml 핵심 설정

최적화 Config 클래스

2. RabbitMQ 메시징 설정

큐 및 Exchange 구성


API 설계

1. RESTful API 엔드포인트

트윗 생성 API

응답 형태

2. 버전 관리 전략

엔드포인트
버전
설명

POST /tweets

v1

기존 단순 버전

POST /tweets/optimized

v2

최적화된 고성능 버전

점진적 마이그레이션:

  • 기존 API 유지하며 신규 API 추가

  • A/B 테스트로 성능 검증

  • 단계적으로 트래픽 이전


기술적 의사결정

카산드라 선택 근거

  1. 쓰기 최적화: LSM Tree 구조로 대량 쓰기에 최적

  2. 수평 확장: 노드 추가만으로 선형적 성능 향상

  3. 가용성: 단일 장애점 없는 분산 아키텍처

  4. CAP 이론: 가용성과 분할 내성을 우선한 합리적 선택

Fan-out-on-write 선택 근거

  1. 읽기 성능: 타임라인 조회 시 O(1) 성능

  2. 사용자 경험: 실시간 타임라인 업데이트

  3. 확장성: 팔로워 수와 무관한 일정한 읽기 성능

  4. 비즈니스 특성: SNS의 읽기 >> 쓰기 패턴에 최적


결론

핵심 성과

  • 90% 성능 개선: 16초 → 1.5초 (10K 팔로워 기준)

  • 확장성 확보: 배치 + 병렬 처리로 선형적 확장 가능

  • 안정성 보장: 재시도 메커니즘으로 장애 복구 자동화

비즈니스 가치

  • 사용자 경험 개선: 즉시 반영되는 실시간 타임라인

테스트코드

https://github.com/Collaborative-AI-SystemDesign/twitter-clone/pull/21

Last updated