Post

운영 관점 MSA: Gateway·Discovery·Observability

Discovery·Gateway·Observability로 장애 전파를 통제하고 레이트리밋·서킷브레이커를 운영 장치로 설계하는 방법

운영 관점 MSA: Gateway·Discovery·Observability

요약 (5–7줄)

운영 가능한 MSA의 기준은 “잘 설계됐는가”가 아니라 장애가 났을 때 통제 가능한가다.
Discovery, Gateway, Observability는 기능이 아니라 운영 비용을 선불로 지불하는 장치다.
서킷브레이커는 장애를 막지 못하며, 전파를 늦추고 범위를 제한한다.
레이트리밋은 공정성 문제가 아니라 폭주 시 생존성의 문제다.
관측성은 로그·메트릭·트레이스를 섞는 것이 아니라 각각 다른 질문에 답하게 분리해야 한다.
이 편의 결론은 단순하다: 운영을 고려하지 않은 MSA는 실패한다.


1. 정의

운영 관점 MSA란, 정상 시 성능보다 비정상 시 행동이 정의된 시스템이다.
Discovery/Gateway/Observability는 개발 편의를 위한 도구가 아니라,
장애 시 판단과 개입을 가능하게 하는 인프라다.


2. 직관

운영에서 중요한 질문은 세 가지다.

  • 지금 무슨 일이 일어났는가?
  • 얼마나 심각한가?
  • 왜 그렇게 되었는가?

이 질문에 즉시 답하지 못하면,
아키텍처는 이미 운영에 실패한 상태다.


3. 작동원리 개요

1) 서비스 위치는 고정되지 않는다 → Discovery
2) 외부 트래픽은 통제 지점이 필요하다 → Gateway
3) 문제를 감지·분석·회복해야 한다 → Observability

이 세 축은 함께 작동한다.
하나라도 빠지면 운영은 수동 대응으로 전락한다.


4. Service Discovery (Eureka)

4.1 필요한 조건

  • VM 기반 배포
  • 서비스 IP가 동적으로 변함
  • 인스턴스 수가 수시로 변동

4.2 필요 없는 조건

  • 쿠버네티스 환경(개념적으로는 DNS/서비스가 대체)
  • 서비스 메시가 위치 추적을 담당

핵심 판단 기준:

“서비스 주소를 코드에 쓰고 싶은가?”

YES라면 Discovery가 필요하다.


5. API Gateway의 책임 범위

5.1 반드시 포함해야 할 책임

  • 라우팅: 요청을 어디로 보낼 것인가
  • 인증/인가: 최소한의 1차 방어선
  • 레이트리밋: 폭주 차단
  • 서킷브레이커: 장애 전파 지연
  • 관측성 헤더 전파: trace-id, correlation-id

5.2 포함하면 안 되는 책임

  • 비즈니스 로직
  • 데이터 조합
  • 도메인 판단

Gateway는 스마트한 프록시이지
두 번째 백엔드가 아니다.


6. 서킷브레이커 (Resilience4j)

6.1 핵심 파라미터

  • failure rate threshold
  • slow call threshold
  • sliding window size
  • wait duration in open state

6.2 가장 흔한 오해

  • ❌ “장애를 막아준다”
  • ✅ “장애가 전파되는 속도와 범위를 늦춘다”

서킷브레이커는 회복 시간을 벌어주는 장치다.
장애 자체를 제거하지 않는다.


7. 레이트리밋을 Redis로 구현할 때 주의점

7.1 정확성

  • 초당 정확한 카운트 vs 근사치
  • 토큰 버킷/슬라이딩 윈도우 선택

7.2 분산

  • 단일 Redis 장애 = 전체 차단
  • 클러스터/복제 고려

7.3 폭주

  • 레이트리밋 자체가 병목이 되지 않도록
  • 실패 시 fail-open / fail-close 전략 명시

레이트리밋은 보안이 아니라 생존 전략이다.


8. Observability의 3요소

8.1 Logs — “무슨 일이?”

  • 사건 기록
  • 상세 원인 파악

8.2 Metrics — “얼마나?”

  • 수치 기반 상태
  • 임계치 감지

8.3 Traces — “왜?”

  • 요청 흐름
  • 병목/의존성 분석

이 셋을 섞으면 아무 질문에도 답하지 못한다.
각각의 질문을 분리해야 한다.


9. 트레이드오프

  • 장점: 빠른 탐지, 제한된 장애 범위, 자동 복구 가능성
  • 비용: 인프라 복잡도, 설정·튜닝 부담

운영 인프라는 수익을 만들지 않지만,
없으면 수익을 지킨다.


10. 최소 예시

10.1 Toy 예시: 장애 전파 시나리오

  • 서비스 B 다운
  • 서비스 A가 동기 호출
  • 전체 요청 대기 → 스레드 고갈 → 전체 다운

차단 설계

  • Gateway 레이트리밋
  • A→B 서킷브레이커
  • B 헬스체크 기반 라우팅 제외

결과: 부분 장애로 제한

10.2 실무 예시: 대시보드 핵심 지표 8개

1) 요청 수 (RPS)

2) 에러율 (4xx/5xx)

3) p95/p99 지연

4) 활성 인스턴스 수

5) CPU 사용률

6) 메모리 사용률

7) 외부 의존성 지연

8) 서킷브레이커 상태

이 중 하나라도 안 보이면 운영은 눈 감고 운전이다.


11. 실무 함정 → 해결 패턴

함정결과해결 패턴
Discovery 미사용하드코딩등록/해제 자동화
Gateway 과도한 책임단일 장애점책임 최소화
로그만 수집원인 추적 실패Trace 연계

12. 오해/실수 3개 + 교정

1) “운영은 나중 문제” → 설계 단계 문제
2) “서킷브레이커면 안전” → 전파만 지연
3) “로그만 있으면 된다” → 메트릭/트레이스 필수


13. 판단 기준

사용해야 할 때

  • 서비스 수가 3개 이상
  • 외부 트래픽 존재
  • 부분 장애를 허용해야 함

쓰지 말아야 할 때

  • 단일 서비스
  • 내부 배치 작업
  • 운영 인력 전무

14. 재학습 체크리스트 (10–14)

  • 서비스 주소가 코드에 박혀 있는가?
  • Gateway 책임이 명확한가?
  • 레이트리밋 기준이 정의돼 있는가?
  • 서킷브레이커 파라미터를 설명할 수 있는가?
  • 장애 시 자동 차단이 가능한가?
  • 로그/메트릭/트레이스가 분리돼 있는가?
  • trace-id가 전파되는가?
  • 외부 의존성 지연을 볼 수 있는가?
  • 대시보드가 한 화면에 있는가?
  • 알람 기준이 명시돼 있는가?
  • 운영 개입 지점이 문서화돼 있는가?
  • 부분 장애 시 전체가 살아남는가?

This post is licensed under CC BY 4.0 by the author.