[CS] 대용량 트래픽 처리 방법

khj·2025년 4월 23일

Computer Science

목록 보기
23/26
post-thumbnail

1. 수평 확장 (Scale-Out)

개념

  • 서버 인스턴스를 여러 대 두고, 동일한 기능을 가진 애플리케이션을 각각 띄웁니다.
  • 로드밸런서가 들어온 요청을 여러 서버에 분산 처리합니다.

구성도

Client ──▶ Load Balancer ──▶ App Server 1
                        └──▶ App Server 2
                        └──▶ App Server 3 ...

적용 방법

  • 클라우드 환경에서는 Auto Scaling Group을 통해 트래픽에 따라 자동 확장 가능
  • 상태 정보를 서버가 들고 있지 않아야 함 → Stateless 구조로 개발 필요

주의사항

  • 세션 정보는 Redis 등 외부 저장소에 보관 (Session Clustering)
  • 애플리케이션 배포 자동화 필요 (CI/CD)

2. 로드 밸런싱 (Load Balancing)

개념

하나의 서버에 몰리는 요청을 여러 서버로 자동 분산하여 서버 부하를 줄입니다.


방식

  • Round Robin: 순차적으로 분산
  • Least Connections: 연결 수가 적은 서버에 전달
  • IP Hash: 클라이언트 IP 기반으로 고정 서버 연결

툴 예시

  • Nginx, HAProxy (소프트웨어 기반)
  • AWS ELB (ALB/NLB) (클라우드 서비스)

구현 예 (Nginx)

upstream backend {
    server app1.example.com;
    server app2.example.com;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

주의사항

  • HTTPS TLS 종료 위치 결정 (로드밸런서에서 처리할지, 서버에서 처리할지)
  • 헬스체크 설정을 통해 죽은 서버로 요청 가지 않도록 설정

3. 캐싱 (Caching)

개념

자주 요청되지만 자주 바뀌지 않는 데이터를 메모리에 저장해두고 빠르게 응답하는 방식


캐싱 위치별 전략

🔸 클라이언트 캐시 (브라우저)

  • Cache-Control, ETag, Expires 헤더로 설정
  • JS, CSS, 이미지 등 정적 파일에 주로 사용

🔸 서버 캐시

  • Redis, Memcached 사용
  • 인기 게시글, 상품 목록 등 조회가 많고 변경이 적은 데이터에 적합
  • TTL(Time To Live)로 데이터 만료 설정 가능

🔸 DB 캐시

  • 특정 SELECT 쿼리 결과를 Redis에 저장해두고, 캐시에서 응답
  • 캐시 미스 시 DB 쿼리 수행 후 Redis에 다시 저장

예시 코드 (Spring + Redis)

@Cacheable(value = "products", key = "#id")
public Product findProduct(Long id) {
    return productRepository.findById(id).orElseThrow();
}

4. 비동기 처리 + 메시지 큐

개념

요청 처리가 오래 걸리는 작업을 즉시 처리하지 않고, 큐에 넣고 나중에 처리


적용 예시

  • 이메일, 알림, 이미지 리사이징, 외부 API 호출 등

동작 흐름

사용자 요청 ─▶ 작업 메시지 생성 ─▶ 메시지 큐 등록
                               └─▶ Worker가 메시지를 소비하고 작업 수행

  • RabbitMQ, Kafka, Redis Streams, AWS SQS

Spring Boot + RabbitMQ 예시

rabbitTemplate.convertAndSend("email.queue", emailMessage);

장점

  • 응답 속도 개선
  • 트래픽 급증 시에도 백엔드 시스템 안정성 확보

5. DB 최적화

🔸 인덱스 최적화

  • 자주 조회하는 컬럼에 인덱스 추가
  • 단, 인덱스는 INSERT/UPDATE 성능에 영향을 줄 수 있으므로 주의

🔸 N+1 쿼리 방지

  • ORM 사용 시 Lazy Loading으로 인해 발생
  • Fetch Join 또는 Batch Fetching으로 해결
@Query("SELECT p FROM Post p JOIN FETCH p.member")
List<Post> findAllWithMember();

🔸 샤딩 (Sharding)

  • 데이터를 수평 분할하여 여러 DB에 분산
  • user_id, region, time 등 기준으로 분할

🔸 레플리케이션 (Replication)

  • Master → Write
  • Slave → Read
  • 읽기 요청 분산 가능

6. CDN (Content Delivery Network)

개념

정적 파일을 전 세계 여러 서버에 미리 복제해두고, 사용자에게 가장 가까운 서버에서 응답


적용 대상

  • 이미지, JS, CSS, 동영상 등

서비스

  • Cloudflare, AWS CloudFront, Azure CDN 등

장점

  • 정적 트래픽을 웹 서버에서 분리
  • 응답 속도 향상 (Latency 개선)
  • DDoS 대응 효과도 있음

7. Rate Limiting & Throttling

개념

사용자의 요청 횟수를 제한하여 서비스 보호 (비정상적인 과도한 요청 차단)


구현 방법

  • IP 기준 요청 횟수 제한
  • API 키 기준 제한
  • Sliding Window 또는 Token Bucket 알고리즘 사용

툴 예시

  • Nginx + Lua
  • Spring Interceptor + Redis
  • AWS API Gateway Rate Limiting

Spring 예시

if (redis.incr(ip + ":request") > LIMIT) {
    throw new RateLimitExceededException();
}

8. 서킷 브레이커 & 백오프 전략

🔸 서킷 브레이커

  • 외부 시스템 실패 감지 시 자동으로 호출 차단
  • Open → Half-Open → Closed 상태 변화

라이브러리

  • Resilience4j, Hystrix (Deprecated)

🔸 백오프 전략

  • 실패 시 점진적 재시도 (exponential backoff)

9. 배치 처리

개념

실시간이 아닌 작업은 주기적으로 모아서 한 번에 처리


적용 예

  • 조회수, 좋아요 카운트
  • 로그 집계
  • 통계 계산

  • Spring Batch, Crontab, Airflow
profile
Spring, Django 개발 블로그

0개의 댓글