노트

업스트림과 다운스트림

Upstream and Downstream

인프라#architecture#network · 연결된 개념 8개

쉽게 말하면

업스트림과 다운스트림은 강물처럼 흐름의 위아래를 가리키는 말이에요. 서비스 호출에선 흔히 나를 부르는 쪽이 위, 내가 부르는 쪽이 아래라서, 아래쪽 하나가 막히면 위쪽이 줄줄이 기다려요.

비유가 깨지는 곳 강물과 달리 기준이 하나로 정해져 있지 않아요. nginx나 HTTP 명세처럼 응답이 흘러오는 쪽을 기준 삼으면 내가 요청을 넘기는 뒤쪽 서버가 업스트림이 되니, 어느 쪽 기준인지 먼저 확인해요.

흐름의 방향을 강물에 빗댄 말이다. 다만 무엇의 흐름을 기준으로 하느냐에 따라 방향이 반대로 쓰인다. 서비스 간 호출을 말할 때는 요청이 흘러가는 쪽을 기준으로 다운스트림 = 내가 호출하는 쪽, 업스트림 = 나를 호출하는 쪽이라 부르는 경우가 많다. 아래 설명은 이 용법을 따른다.

브라우저 ──▶ BFF ──▶ 상품·주문 서버 ──▶ DB
(업스트림)   (나)    (다운스트림)
  • 기준은 항상 "나"다. 브라우저에게는 BFF(Backend For Frontend)가 다운스트림이고, BFF에게는 뒤의 상품 서버가 다운스트림이다
  • "다운"은 등급이 낮다는 뜻이 아니다. 오히려 DB처럼 핵심 시스템이 다운스트림인 경우가 많다

자주 쓰이는 맥락

  • 장애 전파: 다운스트림 하나가 느려지면 그걸 기다리는 업스트림들이 줄줄이 막힌다. 그래서 타임아웃, 재시도 제한, 서킷 브레이커(circuit breaker)를 다운스트림 호출마다 둔다
  • 설정 오류: "다운스트림 URL이 잘못 박혀 503"이라는 말은 내가 호출할 뒤쪽 서버 주소를 못 찾았다는 뜻이다. 컨테이너 환경에서는 호스트 이름이 도커 DNS로 풀리는지부터 본다
  • 지연 실패: 다운스트림이 아직 안 떠 있어도 나 자신은 정상 부팅할 수 있다. 실제로 그쪽을 호출하는 순간에만 실패한다. 그래서 서비스를 단계별로 띄울 수 있다

반대 방향 용법

프록시·HTTP 쪽은 응답(데이터)이 흘러오는 쪽을 기준으로 삼아, 내가 요청을 넘기는 뒤쪽 서버를 업스트림이라 부른다. nginx의 upstream 블록(nginx로 SPA 배포)과 Envoy의 upstream·downstream이 이 용법이고, HTTP 명세(RFC 9110)도 "메시지는 업스트림에서 다운스트림으로 흐른다"고 정의한다. Git에서 내 포크가 따라가는 원본 저장소를 upstream이라 부르는 것도 같은 결이다. 그래서 문서나 대화에서 이 말이 나오면 어느 쪽 기준인지 먼저 확인하는 편이 안전하다.

서비스 경계를 어디에 긋느냐는 조직 구조를 닮는다는 콘웨이의 법칙와, 브라우저 요청과 서버 간 요청의 차이는 브라우저 요청과 서버 간 요청를 본다.

출처: RFC 9110: Intermediaries · Envoy: Terminology

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 커넥션 드레이닝과 무중단 재시작

    배포 중 서버를 재시작하는 몇 초 동안 로드밸런서가 그 서버로 요청을 보내면 502가 난다. 먼저 로드밸런서에서 빼고(드레이닝), 진행 중인 요청을 마친 뒤 재시작하고, 준비되면 다시 넣는다.

  • 서버 전송 이벤트(SSE)

    서버 전송 이벤트(Server-Sent Events, SSE)는 HTTP(HyperText Transfer Protocol) 응답 하나를 닫지 않고 열어 둔 채, 서버가 원할 때마다 텍스트 이벤트를 흘려보내는 서버 → 클라이언트 단방향 푸시 방식이다. HTML 표준에 정의돼 있고 브라우저는 EventSource로 받는다.

  • 스트리밍 SSR

    스트리밍 SSR(Streaming Server-Side Rendering)은 서버가 페이지 전체를 다 만들 때까지 기다리지 않고, 준비된 부분의 HTML(HyperText Markup Language)부터 먼저 보내고 느린 부분은 준비되는 대로 같은 응답에 이어서 흘려보내는 렌더링 방식이다. suspense 경계가 나눔의 단위다.

  • 서버 함수와 서버 액션

    서버 함수(Server Function)는 'use server'로 표시해 서버에서만 실행되지만 클라이언트에서 네트워크 요청으로 호출할 수 있는 async 함수다. 그중 폼 제출이나 데이터 변경처럼 action 맥락(form action, transition)에서 쓰이는 것을 서버 액션(Server Action)이라 부른다. 서버 액션은 서버 함수의 부분집합이다.

  • RSC 페이로드(Flight)

    RSC(React Server Components) 페이로드는 서버 컴포넌트를 실행한 결과(엘리먼트 트리, props, 클라이언트 컴포넌트 참조)를 네트워크로 보내려고 직렬화(Serialization)한 데이터다. 흔히 Flight 형식이라 부른다. HTML(HyperText Markup Language)이 아니라 React가 클라이언트에서 트리를 다시 만드는 데 쓰는 줄 단위 스트림이다. 세부 형식은 React 버전마다 바뀐다(아래는 2026년 기준의 대략적인 모양).

보기 옵션