LabHub
배우기 러닝패스 코스

디버깅 실전 · 밖이 문제인가 우리가 문제인가 · 실습

저쪽이 죽었대요 — 여섯 얼굴을 갈라 책임을 가린다

LabHub 에서 이어서 보기

목표

연결 거부·이름 해석 실패·연결 타임아웃·읽기 타임아웃·느린 응답·부분 응답을 각각 구분하는 판정기와 분류 표를 만든다. 타임아웃이 없을 때 시도가 끝나지 않는 것을 직접 재고, 마감을 지키는 재시도를 만들어 여섯 대상을 한꺼번에 점검한다.

왜 중요한가

"연동이 안 됩니다" 는 최소한 여섯 가지 서로 다른 사건이다. 우리 쪽에서는 장애인데 상대 대시보드는 초록색인 이유도 여기 있다 — 손을 못 잡은 연결은 상대 애플리케이션까지 가지도 않으므로 상대 로그에는 아무 기록이 없다.
가르는 일이 중요한 이유는 다음 행동이 달라지기 때문이다. 특히 재시도 가능 여부가 갈린다. 연결 전에 실패한 것은 상대가 요청을 받지 못했다는 뜻이라 다시 보내도 되지만, 읽기 타임아웃과 부분 응답은 요청이 이미 처리됐을 수 있다. 그 요청이 이체라면 재시도는 두 번 청구가 된다.
타임아웃을 아예 주지 않으면 더 나쁘다. 요청은 상대가 답할 때까지 기다리고, 그동안 작업 스레드는 돌아오지 않는다. 상대의 느림이 우리의 장애로 번지는 가장 흔한 경로가 이것이고, 거기에 재시도가 얹히면 기다림이 곱해집니다.
채점기는 여러분의 설명을 믿지 않는다. 채점기가 자기 포트에 여섯 얼굴을 세워 놓고 여러분의 판정기를 실제로 물려 분류를 대조한다. 포트는 실행마다 바뀌므로 값을 외워 넣을 수 없습니다.

단계

1. /root/dep/gen_dep.py 를 만들어 실행해 /root/dep/servers.py 를 만드세요.
2. /root/dep/classify.py 를 만들어 ok·connection_refused·dns_error 를 가르게 하세요.
3. 연결과 읽기의 타임아웃을 따로 주어 connect_timeout 과 read_timeout 을 갈라 보세요.
4. 부분 응답과 느린 응답을 가르고 /root/dep/timeout.json 에 타임아웃이 없을 때를 재세요.
5. /root/dep/classes.json 에 여섯 얼굴의 책임 위치와 재시도 가능 여부를 적으세요.
6. /root/dep/retry.py 로 마감을 지키는 재시도를 만들어 /root/dep/retry.json 에 적으세요.
7. 여섯 대상을 한꺼번에 점검해 /root/dep/verdict.json 에 표로 남기세요.
8. /root/dep/summary.json/root/dep/dep_report.md 에 네 절로 보고하세요.

참고

단계 8개

  1. 연동 상대의 여섯 얼굴 세우기
  2. 얼굴을 가르는 판정기 만들기
  3. 연결과 읽기를 갈라 보기
  4. 부분 응답과 느린 응답, 그리고 타임아웃 없음
  5. 여섯 얼굴의 책임과 재시도를 표로
  6. 마감을 지키는 재시도 만들기
  7. 여섯 대상을 한꺼번에 점검하기
  8. 책임의 위치를 나눠 보고하기