LabHub
배우기 러닝패스 코스

통합과 배포 · 시간에도 예산이 있다 · 실습

상대가 느려졌는데 우리가 먼저 죽었다

LabHub 에서 이어서 보기

목표

상위 요청 하나에 주어진 시간을 예산으로 두고, 그 예산을 연결·읽기·재시도·하위 호출에 나눠 주는 클라이언트를 직접 만든다. 예산이 모자라면 걸지 않고 빨리 실패하고, 남은 예산을 헤더로 아래에 넘긴다.

왜 중요한가

타임아웃을 넉넉히 잡는 습관은 안전해 보이지만 반대다. 상대가 30초로 느려졌을 때 우리 상한이 60초라면 우리 워커는 30초 동안 묶이고, 우리를 부르는 쪽에서 보면 느려진 것은 우리다. 그 지연은 한 계층 위로 또 번진다.
그래서 타임아웃은 상대를 기다려 주는 배려가 아니라 우리를 지키는 차단기다. 그리고 하나의 값이 아니라 두 값이다 — 연결은 닿는 시간이라 몇 초가 걸리면 느린 것이 아니라 안 되는 것이고, 읽기는 상대가 일하는 시간이라 업무에 따라 다르다.
예산으로 생각하면 규칙은 세 줄이다. 상위 요청에 총 예산을 정하고, 각 호출의 읽기 상한은 그 순간 남은 예산으로 하고, 남은 예산이 하한보다 작으면 걸지 않는다. 재시도와 그 대기 시간도 같은 예산에서 나간다.
채점기는 여러분의 문장을 믿지 않는다. 느려지는 파트너를 채점기가 고른 포트에 직접 띄우고, 여러분의 호출기를 실제로 돌려 걸린 시간과 출력의 구간 이름을 함께 잽니다.

단계

1. /root/budget/partner.py 를 만들어 포트 8014 에 띄우고, 실패 세 모양을 재어 /root/budget/probe.json 에 적으세요.
2. /root/budget/call.py 를 만들어 연결과 읽기의 상한을 따로 잡고 어느 구간에서 끊겼는지 말하게 하세요.
3. /root/budget/deadline.py 를 만들어 총 예산 하나로 여러 호출을 하고, 남은 예산이 다음 호출의 읽기 상한이 되게 하세요.
4. deadline.py 에 하한(--min-ms)을 붙여 남은 예산이 하한보다 작으면 걸지 않고 no_budget 으로 건너뛰게 하세요.
5. /root/budget/retry.py 를 만들어 재시도 대기를 지수로 늘리고 무작위로 흩뜨리되, 그 대기까지 예산에서 빼게 하세요.
6. /root/budget/fanout.py 를 만들어 그때 남은 예산을 X-Budget-Ms 헤더로 하위 호출에 넘기세요.
7. /root/budget/budget_plan.json 에 화면 하나의 예산표를 숫자로 적으세요.
8. /root/budget/budget_report.md 에 네 절로 보고하세요.

참고

단계 8개

  1. 실패의 세 가지 모양 재 보기
  2. 연결과 읽기를 나눠 잡기
  3. 남은 예산이 다음 호출의 상한이다
  4. 가망 없는 호출은 걸지 않는다
  5. 재시도도 예산에서 나간다
  6. 남은 예산을 아래로 넘기기
  7. 화면 하나의 예산표
  8. 예산 점검 보고서