핵심 인사이트

  1. 다크 런칭(Dark Launching)과 섀도우 트래픽(Shadow Traffic)은 실제 사용자에게 영향 없이 프로덕션 환경에서 새 기능/서비스를 테스트하는 배포 기법으로 — 스테이징 환경과 프로덕션의 트래픽 패턴 차이에서 오는 테스트 한계를 극복한다.
  2. 섀도우 트래픽은 프로덕션 요청을 복제하여 신규 서비스로 전달하고 응답을 비교(Shadow Comparison)하지만 사용자에게는 기존 서비스의 응답만 반환하므로 — 데이터 변조 가능성이 있는 쓰기(POST/PUT/DELETE) 요청에 대해서는 신중한 격리 처리가 필수이다.
  3. Facebook, Netflix, Google 등 대규모 서비스가 다크 런칭을 통해 새 마이크로서비스 전환 전 실제 트래픽 부하를 사전 검증하는 것은 — SRE의 핵심 원칙인 "테스트 환경은 프로덕션과 같아야 한다"를 실현하는 가장 현실적인 방법임을 보여준다.

Ⅰ. 다크 런칭 개념

다크 런칭 (Dark Launching):
  새 기능/서비스를 사용자에게 보이지 않게 배포
  내부적으로는 실행하지만 결과를 사용자에게 노출 안 함
  
  목적:
    프로덕션 트래픽으로 성능/동작 검증
    사용자 영향 없이 테스트
    점진적 신뢰 구축 후 노출

섀도우 트래픽 (Shadow Traffic):
  프로덕션 요청을 복제하여 신규 서비스에도 전송
  신규 서비스의 응답은 무시 (사용자에게 기존 서비스 응답만 반환)
  
  복제 방식:
    프록시 레이어에서 요청 복제
    비동기 처리 (사용자 응답 지연 없음)

다크 런칭 vs 섀도우 트래픽:
  다크 런칭: 새 기능이 백그라운드에서 실행되지만 UI에 숨김
  섀도우 트래픽: 요청을 두 서비스에 동시 전송하여 비교

관련 개념:
  피처 플래그: 코드는 배포됐지만 특정 그룹에만 활성화
  카나리 배포: 5% 트래픽에 신규 버전 노출 (일부 사용자 영향)
  블루/그린: 100% 트래픽 전환 (모든 사용자 영향)
  
  다크 런칭: 0% 사용자 영향 + 100% 프로덕션 트래픽 검증

📢 섹션 요약 비유: 다크 런칭은 새 요리사 몰래 훈련 — 손님에게는 기존 요리사 음식을 내고, 새 요리사는 같은 주문으로 연습. 손님은 모르고, 음식 품질 비교는 주방에서.


Ⅱ. 섀도우 트래픽 구현

섀도우 트래픽 아키텍처:

  클라이언트 요청
      │
      ↓
  [Proxy/Gateway] ────────────────────────────────
      │                                          │
      │ (동기, 사용자 응답)             (비동기, 복제)
      ↓                                          ↓
  [기존 서비스 v1]                    [신규 서비스 v2]
      │                                          │
      │ 응답 → 사용자에게 반환          응답 수집 (로깅)
      │                                          │
      └──────────────────────────────────────────┘
                                          비교 분석 (Shadow Comparison)

구현 도구:
  Nginx Mirror (mirror_requests):
    location /api {
        mirror /shadow;
        proxy_pass http://v1-service;
    }
    location /shadow {
        proxy_pass http://v2-service;
    }
    
  Envoy Proxy (Mirror Policy):
    route:
      cluster: v1-service
      request_mirror_policies:
        - cluster: v2-service
          runtime_fraction:
            default_value:
              numerator: 100

쓰기 요청 처리:
  GET: 안전하게 복제 가능
  POST/PUT/DELETE: 데이터 변조 위험
    대응책:
      1. 격리된 Shadow DB에만 쓰기
      2. 쓰기 요청은 복제하되 트랜잭션 롤백
      3. 읽기 요청만 섀도우 처리 (쓰기 제외)

비교 로깅:
  응답 상태 코드 일치 여부
  응답 시간 비교 (P50, P95, P99)
  응답 바디 비교 (특정 필드)

📢 섹션 요약 비유: 섀도우 트래픽은 복사본 채점 — 원본 시험지(기존 서비스)로 점수를 주고, 복사본(신규 서비스)도 동시에 채점해서 결과 비교. 학생(사용자)에게는 원본 점수만 알려줌.


Ⅲ. 사용 사례

다크 런칭/섀도우 트래픽 실전 사례:

1. Facebook: 뉴스피드 알고리즘 교체:
   신규 랭킹 알고리즘 → 다크 런칭
   사용자는 기존 피드 보되, 신규 알고리즘 결과 내부 수집
   성능/CPU 사용량 비교 후 점진적 노출

2. Netflix: 마이크로서비스 전환:
   Monolith 서비스 → 새 마이크로서비스
   섀도우 트래픽으로 마이크로서비스 부하 검증
   완전 전환 전 레이턴시/에러율 비교

3. GitHub: Spokes 분산 스토리지:
   Git 파일 접근 요청을 신규 분산 스토리지에 섀도우
   6개월간 프로덕션 트래픽 패턴 검증 후 전환

4. Amazon: 추천 알고리즘 교체:
   신규 ML 모델 → 다크 런칭
   A/B 테스트 전 기술적 문제 사전 탐지

5. 데이터베이스 마이그레이션:
   온프레미스 DB → RDS
   읽기 쿼리를 양쪽으로 보내 결과 일치 확인
   6주 검증 후 쓰기 전환

기대 효과:
  문제 조기 발견: 스테이징에서 못 잡은 트래픽 패턴 문제
  성능 검증: 실제 트래픽으로 P99 레이턴시 측정
  신뢰도 향상: 엔지니어 확신 후 전환 → 롤백 감소
  사용자 영향 제로: 프로덕션 검증이면서 사용자 위험 없음

📢 섹션 요약 비유: 다크 런칭 사례는 새 항공 관제 시스템 테스트 — 실제 비행기들이 날면서(프로덕션 트래픽), 새 관제 시스템을 그림자 훈련(섀도우). 실제 관제는 기존 시스템이 담당.


Ⅳ. 파이프라인 통합

DevOps CD 파이프라인에서 다크 런칭:

표준 파이프라인:
  코드 커밋 → CI 빌드 → 단위 테스트 → 스테이징 배포
  → 통합 테스트 → 프로덕션 배포

다크 런칭 통합:
  ... → 프로덕션 배포 (피처 플래그 OFF)
       → 다크 런칭 활성화 (내부 트래픽)
       → 섀도우 트래픽 비교 분석 (1~2주)
       → 카나리 배포 (5% 사용자)
       → 점진적 증가 (25% → 50% → 100%)

자동화 판단 기준:
  에러율 < 0.1% → 다음 단계 진행
  P99 레이턴시 < 기준값 + 20% → 통과
  Shadow 응답 불일치 < 5% → 통과
  자동 롤백 트리거: 에러율 > 1% 또는 레이턴시 3배 이상

Diffy (Twitter): 오픈소스 섀도우 비교 도구
  두 서비스 응답의 구조적 차이 자동 분석
  노이즈(타임스탬프, 랜덤 ID) 자동 제거
  실제 로직 차이만 리포트

LaunchDarkly 통합:
  피처 플래그 → 다크 런칭 제어
  특정 조건 (내부 IP, 알파 테스터) 자동 활성화
  트래픽 % 제어 (shadow %, canary %)

📢 섹션 요약 비유: 다크 런칭 파이프라인은 비행기 시험 비행 순서 — 격납고 점검(CI/CD) → 활주로 주행(스테이징) → 저고도 비행(다크 런칭) → 정식 운항(100% 배포).


Ⅴ. 실무 시나리오 — 결제 서비스 마이그레이션

결제 API v1 → v2 섀도우 트래픽 마이그레이션:

배경:
  결제 서비스 v1: Java Monolith
  결제 서비스 v2: Python Microservice
  위험도: 매우 높음 (결제 오류 = 직접 손실)

섀도우 전략:
  GET 요청만 복제 (결제 금액 조회, 주문 내역)
  POST 요청 (실제 결제): 절대 복제 금지
  
  이유: POST 복제 시 이중 결제 발생 가능

Envoy 설정:
  GET /payments → v1 + v2 (100% mirror)
  POST /payments → v1만 (mirror 없음)

비교 지표 모니터링 (4주):
  Week 1: GET 기본 조회 일치율 → 99.2% (우수)
  Week 2: 복잡한 할부 조회 일치율 → 87% (문제 발견!)
  
  발견된 버그:
    할부 수수료 계산 공식 차이
    v1: 원금 × 이율 (단리)
    v2: 복리 계산 오류
    
  수정 후 Week 3: 일치율 99.8%
  Week 4: 전체 지표 만족 → 카나리 배포 시작

결과:
  섀도우 기간: 4주
  발견된 버그: 3개 (스테이징에서 미탐지)
  전환 후 장애: 0건
  엔지니어 확신도: "섀도우 없었으면 결제 오류 발생했을 것"

ROI:
  섀도우 4주 비용: 추가 인프라 $500
  예방된 결제 오류 비용 (예상): $5만~50만

📢 섹션 요약 비유: 결제 서비스 섀도우는 수술 전 모의 훈련 — 실제 환자(사용자)에게는 기존 집도의(v1)가 수술하고, 새 의사(v2)는 옆에서 같은 수술을 동시에 연습. 판단 오류 발견 후 실전 투입.


📌 관련 개념 맵

다크 런칭 & 섀도우 트래픽
+-- 개념 구분
|   +-- 다크 런칭 (기능 숨김 + 백그라운드 실행)
|   +-- 섀도우 트래픽 (요청 복제 + 비교)
+-- 구현 도구
|   +-- Nginx Mirror, Envoy Mirror Policy
|   +-- Diffy (Twitter 오픈소스)
|   +-- LaunchDarkly
+-- 관련 배포 기법
|   +-- 피처 플래그
|   +-- 카나리 배포
|   +-- 블루/그린 배포
+-- 주의 사항
|   +-- POST/PUT 쓰기 격리 필수
|   +-- Shadow DB 분리

📈 관련 키워드 및 발전 흐름도

[전통 배포 (2000s)]
수동 배포, 대규모 릴리즈
롤백 = 수동, 긴 다운타임
      |
      v
[피처 플래그 도입 (2010s)]
코드 배포와 기능 출시 분리
      |
      v
[섀도우 트래픽 발전 (2012~)]
Twitter Diffy 오픈소스
Facebook 다크 런칭 표준화
      |
      v
[서비스 메시 통합 (2018~)]
Istio, Envoy: 선언적 트래픽 미러링
인프라 레벨 섀도우 설정
      |
      v
[현재: AI 기반 트래픽 분석]
섀도우 응답 자동 비교 ML
이상 탐지 자동화 (Anomaly Detection)

👶 어린이를 위한 3줄 비유 설명

  1. 다크 런칭은 새 요리사 몰래 훈련 — 손님에게는 기존 요리사 음식을 내고, 새 요리사는 같은 주문으로 동시에 연습!
  2. 섀도우 트래픽은 복사본 채점 — 학생에게는 원본 시험지 점수를 주지만, 새 채점 방식도 동시에 시험해봐요.
  3. GET만 복제하고 POST는 절대 안 돼 — "주문 내역 조회"는 복사해도 되지만, "결제 실행"을 두 번 하면 돈이 두 번 빠져나가요!