학습일지/Architecture

[Architecture] 로드밸런싱

Merge Log 2025. 9. 16. 16:44

서버 사이드 로드밸런싱 / 클라이언트 사이드 로드밸런싱

  • 서버 사이드 LB (예: AWS ALB/NLB, NGINX, HAProxy)
    • 클라이언트는 LB 한 주소만 알고
    • LB 뒤의 인스턴스 풀은 오토스케일러/오케스트레이터가 등록/제거 (= 일종의 서비스 디스커버리 통합) 합니다
    • 주로 북-남(North-South) 트래픽(외부 → 내부) 에 많이 사용
  • 클라이언트 사이드 LB (예: Ribbon, Spring Cloud LoadBalancer + Eureka)
    • 클라이언트(예: 주문 서비스) 가 레지스트리(Eureka) 에게 대상 풀을 직접 조회하고
    • 그 중 하나를 스스로 선택해서 직접 호출한다
    • 주로 동-서(East-West) 서비스 간 호출에 적합

북-남(North-South) vs 동-서(East-West)

  • 북-남 트래픽 : 외부 <-> 내부 경게를 가로지르는 트래픽
    • 예시) 인터넷 사용자 → (ALB/NGINX) → API 게이트웨이/백엔드
    • 인바운드(북 → 남) 만을 말하는 것이 아닌 경계(엣지)를 통과하는 모든 방향(인바운드/아웃바운드) 를 포함합니다
  • 동-서 트래픽 : 내부 <-> 내부 사이의 서비스 간 트래픽
    • 예시) 주문 서비스 → 상품 서비스 → 유저 서비스 (같은 VPC/클러스터 안)

Feign Client

  • 선언형 HTTP 클라이언트
  • "인터페이스 + 애노테이션" 만으로 REST 호출 코드를 거의 안쓰게 해주는 도구 → 보일러플레이트 최소화
  • Spring Cloud OpenFeignFeignSpring 생태계에 붙여서 서비스 디스커버리(Eureka), 클라이언트 로드밸런싱 (과거 Ribon, 지금은 Spring Cloud LoadBalancer), 서킷 브레이커(Resilience4j) 까지 자연스럽게 통해 준다
  • Eureka 없이 고정 URL 로도 사용할 수 있다
  • MSA 간 동-서 통신에서 자주 사용
  • Ribbon 이 통합되어 있어 자동으로 로드 밸런싱을 수행해준다

Ribbon 의 특징

  • Eureka 등으로부터 서비스 인스턴스 리스트를 제공받아 로드밸런싱에 사용한다 → 서버 리스트 제공
  • 라운드 로빈, 가중치 기반 등 다양한 로드 밸런싱 알고리즘 지원
  • 요청 실패 시 다른 인스턴스로 자동 전환 → Failover

FeignClient 와 Ribbon 동작 방식

  • 서비스 이름을 @FeignClient(name = "my-service") 형태로 등록하게 될텐데 해당 이름은 Eureka 에 등록된 서비스 이름을 참조한다
    • Eureka 서비스에서 해당 이름으로 인스턴스를 조회한다
  • 같은 인스턴스가 있다면 그 중 하나를 선택해야 하며 이를 로드밸런싱을 통해 선택하게 된다 → 기본적으로 Ribbon 사용
    • 설정된 로드 밸런싱 알고리즘을 사용해서 요청을 분배

간단한 라운드 로빈 기반 로드 밸런싱 테스트

  • Order 서비스 → Product 서비스 형태로 상품 정보를 가져온다
  • Order 서비스 인스턴스 : 1개
  • Product 서비스 인스턴스 : 3개

흐름

테스트 코드