시간초과·재시도·멱등성과 부분실패
주문 서버가 결제 서버에 요청한 뒤 답을 받지 못했다고 하자. 결제가 실행되지 않았을 수도 있고, 실행은 됐지만 응답만 사라졌을 수도 있다. 한 프로그램 안에서는 예외로 작업을 멈출 수 있지만 여러 컴퓨터가 통신하는 환경에서는 각 부분의 생사와 결과를 동시에 확정하기 어렵다. 분산 처리의 출발점은 이 불확실성을 숨기…
응답이 없다는 것은 실패했다는 뜻이 아니다
주문 서버가 결제 서버에 요청한 뒤 답을 받지 못했다고 하자. 결제가 실행되지 않았을 수도 있고, 실행은 됐지만 응답만 사라졌을 수도 있다. 한 프로그램 안에서는 예외로 작업을 멈출 수 있지만 여러 컴퓨터가 통신하는 환경에서는 각 부분의 생사와 결과를 동시에 확정하기 어렵다. 분산 처리의 출발점은 이 불확실성을 숨기지 않는 것이다.
먼저 되짚기: 요청 역할과 실행 단위
클라이언트·서버는 요청·제공 책임을 나누고, 프로세스는 독립 주소공간과 자원을 가진 실행 중 프로그램이다. 이 구조가 여러 네트워크 노드로 나뉘면 각 실행단위와 통신이 따로 실패할 수 있어 시간초과와 재시도 정책이 필요하다.
분산 실패의 최소 용어
분산 노드는 네트워크로 협력하지만 독립적으로 실행되고 고장 날 수 있는 계산 단위다. 부분실패는 일부 노드나 통신은 실패했지만 나머지는 계속 동작하는 상태다. 시간초과는 기다림의 상한을 정하는 판단이고, 재시도는 같은 목적의 요청을 다시 보내는 조치다. 멱등성(idempotency)은 같은 요청을 여러 번 적용해도 최종 효과가 한 번 적용한 것과 같도록 만드는 성질이다.
다시 연결하기: 분산 노드에서 부분실패로
분산 노드는 서로 협력하지만 독립적으로 실행되거나 고장 날 수 있다. 따라서 한 노드나 통신만 실패하고 다른 노드는 계속 동작하는 부분실패를 정상 설계조건으로 다뤄야 한다.
불확실한 요청을 다루는 순서
호출자는 업무가 허용하는 최대 대기시간 뒤 시간초과를 선언한다. 재시도할 때는 요청 식별자를 함께 보내고, 수신자는 이미 처리한 식별자인지 확인해 이전 결과를 돌려주거나 중복 효과를 막는다. 재시도 간격을 점차 늘리고 횟수를 제한해야 장애 중인 노드에 요청이 더 몰리지 않는다. 끝내 결과를 확정할 수 없으면 성공으로 꾸미지 말고 확인 필요 상태와 보정 절차로 넘긴다.
재시도가 오히려 장애를 키울 때
모든 오류를 즉시 재시도하면 같은 병목에 부하가 겹쳐 연쇄장애가 된다. 결제처럼 부작용이 있는 명령을 요청 식별자 없이 재시도하면 중복 청구가 생긴다. 시간초과를 너무 짧게 잡으면 정상 처리 중인 요청도 실패로 보고, 너무 길게 잡으면 자원이 묶인다. 업무의 중복 허용도, 응답시간 목표와 보정 가능성을 기준으로 정책을 정해야 한다.
시간초과는 결과가 아니라 관찰의 한계다
호출 노드가 처리 노드로 R-731을 보내고 2초 동안 응답을 보지 못하면 시간초과를 선언한다. 이 관찰만으로 아래 가능성을 구별할 수 없다.
| 처리 노드·통신의 가능한 상태 | 호출자가 응답 부재만으로 확정할 수 있는가 |
|---|---|
| 요청 미도착 | 아니오 |
| 처리 중 | 아니오 |
| 완료했지만 응답 유실 | 아니오 |
| 노드 장애 | 아니오 |
따라서 결과조회, 같은 R-731의 제한 재시도, 확인 필요·보정 경로를 판정한다.
호출자는 정해진 시간 안에 응답을 보지 못했다는 사실만 안다. 상대의 실행 여부를 확정하려면 요청 식별값으로 처리 기록을 조회하거나, 같은 식별값의 재요청에 이전 결과를 돌려주는 수신 규칙이 필요하다.
네 개념은 다른 질문에 답한다
| 개념 | 답하는 질문 | 보장하지 않는 것 |
|---|---|---|
| 부분실패 | 어느 노드·통신만 실패했는가 | 전체 작업의 결과 확정 |
| 시간초과 | 얼마나 기다린 뒤 다른 판단을 할 것인가 | 상대가 실패했다는 증명 |
| 재시도 | 같은 목적을 다시 시도할 것인가 | 중복 효과 방지 |
| 멱등성 | 반복 적용의 최종 효과를 한 번과 같게 할 수 있는가 | 무제한 재시도의 안전성과 최신 응답 |
재시도 가능 여부는 읽기·중복허용 명령·요청 식별값이 있는 부작용 명령·보정 불가능 명령을 구분해 정한다.
재시도 전에 오류·효과·부하를 판정한다
잘못된 입력이나 권한 거부처럼 다시 보내도 변하지 않는 오류는 재시도하지 않는다. 연결이 일시적으로 끊기는 상황처럼 회복 가능하고 업무 기한 안에 남은 시간이 있으며 중복 효과를 막을 수 있을 때만 제한 재시도한다. 간격에는 점진 증가와 작은 무작위 편차를 두어 여러 호출자가 동시에 몰리지 않게 한다. 결제 결과처럼 불확실하지만 금전 효과가 큰 경우에는 무작정 다시 실행하기보다 결과조회와 대사·보정 절차로 넘긴다.
재시도 간격을 늘려 잠시 물러서는 정책을 backoff(백오프), 같은 간격에 작은 무작위 차이를 더하는 것을 jitter(지터)라고 읽는다. 예를 들어 모두 0.5초를 기다리면 동시에 다시 몰릴 수 있지만 0.5초에 서로 다른 0~0.2초를 더하면 시점을 흩뜨릴 수 있다. 대사는 호출자 주문 기록과 결제사의 확정 기록을 같은 요청 ID로 맞춰 승인 여부·금액·중복을 비교하는 일이다. 서로 안 맞는 기록은 담당자가 확인·정정하는 보정 경로로 넘기며 단순 재청구로 맞추지 않는다.
사례: 최초 요청을 포함한 세 번의 결제 시도
결제 요청의 업무 기한이 10초이고 한 번의 제한시간이 2초라 하자. 요청 식별값 PAY-81을 모든 시도에 유지하고, 실패 뒤 약 0.5초, 1초처럼 간격을 늘리되 작은 무작위 편차를 둔다. 수신자는 PAY-81을 처음 처리할 때 결과를 저장하고 같은 식별값이 오면 새 결제를 만들지 않고 그 결과를 반환한다. 세 시도 뒤에도 확인되지 않으면 실패가 아니라 결과 확인 필요로 표시하고 결제사 조회·대사로 확정한다. 서로 다른 식별값을 매번 만들면 이 중복 방지는 작동하지 않는다.
총 3회 시도는 최초 1회와 재시도 2회다. 지터·결과조회 비용을 먼저 제외한 최대 대기 시간표는 다음과 같다.
| 단계 | 구간 | 누적 끝 시각 |
|---|---|---|
| 최초 시도 | 0~2초 | 2초 |
| 첫 간격·첫 재시도 | 2~2.5초, 2.5~4.5초 | 4.5초 |
| 둘째 간격·둘째 재시도 | 4.5~5.5초, 5.5~7.5초 | 7.5초 |
합은 3×2+0.5+1=7.5초다. 각 간격에 추가 지터를 최대 0.2초씩 허용하면 7.9초이며, 조회 등 추가 비용도 남은 2.1초 예산 안에 포함해야 한다. 매 시도 전에 “남은 기한 ≥ 예정 간격+시도 제한시간+필수 확인 여유”인지 다시 검사한다. 최초 1회에 재시도 3회를 더하면 4×2+0.5+1+2=11.5초여서 지터 없이도 10초를 넘는다. 기한 소진은 새로운 자동 시도를 멈추는 기준이지 미확정 결제를 실패로 바꾸는 근거가 아니다.
중복 ID의 동시 처리·입력 일치와 효과/기록 경계는 앞 절의 상태표를 따른다. 결과가 아직 저장되지 않은 중복은 처리 중으로 응답해야 하며, 결제 효과만 발생한 장애를 “기록 없음=미실행”으로 판단하지 않는다.
전체 기한만 4초로 줄이고 다른 조건을 유지하면 어떨까? 최초 시도는 2초에 끝나지만 0.5초 간격과 다음 시도 최대 2초를 더하면 4.5초가 되어 기한을 넘는다. 필수 조회 여유까지 포함하면 이 조건의 자동 재시도는 시작할 수 없다. “총 3회 시도 규칙이 있으므로 언제나 세 번 한다”는 답은 전체 기한 검사를 빼먹은 것이다. 시도 제한·간격을 새로 설계하거나 남은 기한 안에서 결과를 확인하고, 미확정 결과는 확인 필요로 남겨야 한다.
자체 10점 문제
분산시스템의 부분실패와 시간초과·재시도·멱등성을 설명하고 중복 결제 방지방안을 제시하시오.
요구어는 설명, 제시다. 시간초과를 실패 확정으로 쓰지 말고 요청 미도착·처리 중·완료 후 응답 유실·노드 장애를 먼저 구분한다. 그 뒤 요청 식별값, 결과 저장·조회, 제한 재시도, 확인 필요 상태와 대사를 하나의 통제 흐름으로 제시한다.
10점 풀이 방향과 모범답안 보기
답안 목차: 불확실성–정책–보정
- 분산 노드·부분실패·시간초과·재시도·멱등성 정의
- 요청 미도착/처리 중/응답 유실/노드 장애의 불확실성
- 오류별 재시도 판정과 간격·횟수·전체 기한
- 요청 식별값·결과기록·중복 반환의 멱등 처리
- 확인 필요 상태·대사·보정과 재시도 폭주 통제
답안 도식: 안전한 재시도 제어
결과를 먼저 확인하고 허용 조건에서만 같은 ID로 재시도한다 · 상태 따라가기
응답 없음은 실패나 미실행을 확정하지 못한다. 모든 단계에서 같은 요청·기한·재시도의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
식별값을 유지해 전송한 뒤 결과를 확인한다. 불명확하면 먼저 같은 ID의 기록을 조회하고 오류의 일시성·남은 기한·필수 확인 여유·중복 효과를 판정한다. 조건이 맞을 때만 backoff·jitter·횟수 제한 뒤 같은 ID로 다시 전송한다. 불가하거나 끝내 미확정이면 확인 필요·대사·보정으로 넘긴다. 수신자는 같은 ID·같은 입력을 확인하고 효과와 최초 결과를 보존해 이전 결과를 재사용한다.
이 예의 조건
- 식별값을 유지해 전송한 뒤 결과를 확인한다. 불명확하면 먼저 같은 ID의 기록을 조회하고 오류의 일시성·남은 기한·필수 확인 여유·중복 효과를 판정한다. 조건이 맞을 때만 backoff·jitter·횟수 제한 뒤 같은 ID로 다시 전송한다. 불가하거나 끝내 미확정이면 확인 필요·대사·보정으로 넘긴다. 수신자는 같은 ID·같은 입력을 확인하고 효과와 최초 결과를 보존해 이전 결과를 재사용한다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| 업무 요청 ID | 최초 발급 후 유지 |
| 같은 ID 전송 | 재시도마다 새 ID 금지 |
| 결과 확정? | 응답·기록 확인 |
| 확정 결과 | 기존 결과 재사용 |
| 재시도 조건? | 오류·기한 / 중복 효과 |
| 확인 필요 | 결과조회·대사·보정 |
| 제한 간격·횟수 | backoff + jitter / 매 시도 전 기한 재검사 |
| 연결 | 원 라벨·방향 |
|---|---|
| 업무 요청 ID → 같은 ID 전송 | 라벨 없는 연결 / 정방향 / 실선 |
| 같은 ID 전송 → 결과 확정? | 라벨 없는 연결 / 정방향 / 실선 |
| 결과 확정? → 확정 결과 | 확정 / 정방향 / 실선 |
| 결과 확정? → 재시도 조건? | 불명확 / 정방향 / 실선 |
| 재시도 조건? → 확인 필요 | 불가 / 정방향 / 실선 |
| 재시도 조건? → 제한 간격·횟수 | 가능 / 정방향 / 실선 |
| 제한 간격·횟수 → 같은 ID 전송 | 같은 ID / 정방향 / 점선 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 결과 미확인 응답 없음은 실패나 미실행을 확정하지 못한다. |
|
|
| 먼저 조회 같은 요청의 현재 결과를 조회하여 성공·거절·미확인을 구분한다. |
|
|
| 제한된 재시도 허용 조건에서 기한·횟수·backoff·jitter를 적용한다. |
|
|
| 대사·인계 끝까지 미확인이면 실제 상태를 대사하고 인계한다. |
|
|
결과를 먼저 확인하고 허용 조건에서만 같은 ID로 재시도한다 · 상태 따라가기
응답 없음은 실패나 미실행을 확정하지 못한다. 모든 단계에서 같은 요청·기한·재시도의 위치를 유지하며 값과 허용 조건을 함께 확인합니다.
상자 안의 대상과 화살표의 조건을 함께 읽으세요. 좁은 화면에서는 같은 관계를 세로로 재배치한 도식을 보여 줍니다.
식별값을 유지해 전송한 뒤 결과를 확인한다. 불명확하면 먼저 같은 ID의 기록을 조회하고 오류의 일시성·남은 기한·필수 확인 여유·중복 효과를 판정한다. 조건이 맞을 때만 backoff·jitter·횟수 제한 뒤 같은 ID로 다시 전송한다. 불가하거나 끝내 미확정이면 확인 필요·대사·보정으로 넘긴다. 수신자는 같은 ID·같은 입력을 확인하고 효과와 최초 결과를 보존해 이전 결과를 재사용한다.
이 예의 조건
- 식별값을 유지해 전송한 뒤 결과를 확인한다. 불명확하면 먼저 같은 ID의 기록을 조회하고 오류의 일시성·남은 기한·필수 확인 여유·중복 효과를 판정한다. 조건이 맞을 때만 backoff·jitter·횟수 제한 뒤 같은 ID로 다시 전송한다. 불가하거나 끝내 미확정이면 확인 필요·대사·보정으로 넘긴다. 수신자는 같은 ID·같은 입력을 확인하고 효과와 최초 결과를 보존해 이전 결과를 재사용한다.
- 이 원문의 교육용 사례·조건 안에서 상태를 대조합니다. 실제 구축·실험 결과나 원문에 없는 성능 보장을 추가하지 않습니다.
관계도의 보충 설명
| 대상 | 원 설명 |
|---|---|
| 업무 요청 ID | 최초 발급 후 유지 |
| 같은 ID 전송 | 재시도마다 새 ID 금지 |
| 결과 확정? | 응답·기록 확인 |
| 확정 결과 | 기존 결과 재사용 |
| 재시도 조건? | 오류·기한 / 중복 효과 |
| 확인 필요 | 결과조회·대사·보정 |
| 제한 간격·횟수 | backoff + jitter / 매 시도 전 기한 재검사 |
| 연결 | 원 라벨·방향 |
|---|---|
| 업무 요청 ID → 같은 ID 전송 | 라벨 없는 연결 / 정방향 / 실선 |
| 같은 ID 전송 → 결과 확정? | 라벨 없는 연결 / 정방향 / 실선 |
| 결과 확정? → 확정 결과 | 확정 / 정방향 / 실선 |
| 결과 확정? → 재시도 조건? | 불명확 / 정방향 / 실선 |
| 재시도 조건? → 확인 필요 | 불가 / 정방향 / 실선 |
| 재시도 조건? → 제한 간격·횟수 | 가능 / 정방향 / 실선 |
| 제한 간격·횟수 → 같은 ID 전송 | 같은 ID / 정방향 / 점선 |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 결과 미확인 응답 없음은 실패나 미실행을 확정하지 못한다. |
|
|
| 먼저 조회 같은 요청의 현재 결과를 조회하여 성공·거절·미확인을 구분한다. |
|
|
| 제한된 재시도 허용 조건에서 기한·횟수·backoff·jitter를 적용한다. |
|
|
| 대사·인계 끝까지 미확인이면 실제 상태를 대사하고 인계한다. |
|
|
모범답안 축약본
분산 노드는 독립 실행·고장이 가능한 계산 단위이고 부분실패는 일부 노드나 통신만 실패한 상태다. 시간초과는 대기의 상한이지 상대 실행 실패의 증명이 아니다. 요청 미도착, 처리 중, 처리 완료 후 응답 유실을 구분할 수 없으므로 재시도는 오류의 일시성, 남은 업무 기한과 중복 효과를 판정해 제한한다. 멱등성은 같은 요청을 반복해도 최종 효과가 한 번과 같게 하는 성질이다. 결제 요청마다 식별값을 발급하고 수신자가 최초 결과를 저장하여 같은 식별값에는 이전 결과를 반환하게 한다. 재시도 간격은 증가시키고 횟수·전체 기한을 제한한다. 끝내 결과가 불명확하면 실패로 단정하지 않고 확인 필요 상태, 결과조회, 대사와 보정으로 확정한다. 무제한 즉시 재시도와 시도별 새 식별값은 중복·연쇄장애를 만든다.
자체 25점 문제
응답 유실이 있는 결제 요청의 시간초과·재시도·멱등성 trace를 분석하고 중복효과와 재시도 폭주를 막는 장애대응 절차를 설계하시오.
요구어는 분석, 설계다. 요청·응답의 순서와 상태를 먼저 고정한 뒤 시간초과를 실패로 단정하지 않고, 같은 식별값의 결과조회·제한 재시도·보정으로 끝내야 한다.
25점 풀이 방향과 모범답안 보기
25점 답안 목차
- 요청 ID·호출시각·제한시간 trace
- 미도착·처리중·완료후 응답유실·노드장애 구분
- 재시도 가능 오류와 비재시도 오류
- 같은 요청 ID의 멱등 결과 저장
- 결과조회와 확인 필요 상태
- backoff·jitter·횟수·전체기한
- 중복효과·재시도 폭주 관측
- 대사·보정·사후 검증
25점 답안 도식
PAY-81 전송 후 2초 응답 부재에는 안전한 결과 확인·재시도 분기를 적용한다. 완료 기록을 찾으면 기존 결과로 끝내고, 회복 가능한 일시 오류만 같은 ID·backoff·전체 기한 안에서 제한한다. 미확정은 확인 필요→대사·보정으로 넘기며 최초 포함 총 3회 시도의 예산표를 재사용한다.
25점 모범답안
결제 요청 PAY-81의 전송시각, 제한시간, 응답·오류와 수신측 처리기록을 같은 시간축에 놓는다. 2초 안에 응답이 없었다는 사실만으로 실패를 확정하지 않고 요청 미도착, 처리 중, 완료 후 응답 유실, 노드·통신 장애를 후보로 둔다. 먼저 같은 요청 식별값으로 결과를 조회해 이미 완료된 작업을 새 결제로 만들지 않는다.
재시도는 입력 오류·권한 거부처럼 다시 보내도 변하지 않는 오류에는 하지 않는다. 일시 통신 오류처럼 회복 가능하고 전체 업무기한이 남았을 때만 같은 PAY-81을 유지해 간격을 늘리고 작은 무작위 편차를 둔 제한 재시도를 수행한다. 수신자는 최초 처리결과를 식별값과 함께 보존하고 중복 요청에는 기존 결과를 반환한다.
재시도 횟수, 전체 기한, 동시 재시도량과 오류율을 관측해 장애 중 요청폭주를 막는다. 끝내 결과를 확인하지 못하면 실패로 꾸미지 않고 확인 필요 상태로 두며 결제사 조회·대사·보정으로 확정한다. 분석의 핵심은 프로토콜 메시지와 상태전이를 따라 어느 단계에서 결과가 불확실해졌는지 증거로 좁히는 것이다.
선택한 제한은 총 3회 시도, 시도당 최대 2초, 간격 0.5·1초와 각 최대 0.2초 추가 지터다. 예를 들어 첫 결제는 서버에서 0.8초에 완료됐지만 응답이 유실되고, 호출자는 2초에 시간초과를 관찰한다. 2.5초의 같은 ID 조회가 완료 결과를 반환하면 추가 결제 시도 없이 끝낸다. 조회도 실패해 새 시도가 필요할 때만 위 최대 7.9초 예산과 실제 경과시간을 재검사한다. 완료 기록을 못 읽으면 10초에 자동 재시도를 종료하고 확인 필요로 전환한다.
출처와 적용 경계
부분실패·시간초과·제한 재시도·멱등성은 안정된 분산시스템 기초개념이다. 10초 업무기한, 2초 제한시간, 0.5초·1초 간격과 PAY-81은 실패상태를 추적하기 위한 자체 사례이며 특정 결제망의 운영정책이 아니다.
자기교정과 조건 변경
| 잘못 쓴 답 | 수정 | 복습 |
|---|---|---|
| 시간초과면 상대 노드는 죽었다 | 정해진 시간 안에 응답을 관찰하지 못했다는 뜻이다 | 관찰 한계 |
| 재시도는 같은 요청을 새 식별값으로 다시 보낸다 | 중복 효과를 막으려면 같은 업무 요청 식별값을 유지한다 | 세 번 시도 |
| 멱등성이면 무제한 재시도해도 된다 | 부하와 전체 업무기한 때문에 횟수·간격을 제한한다 | 정책 |
| 입력 오류도 잠시 뒤 다시 보내면 된다 | 다시 보내도 바뀌지 않는 오류는 재시도하지 않는다 | 정책 |
| 결과를 모르면 실패로 기록하면 된다 | 확인 필요 상태로 두고 조회·대사·보정으로 확정한다 | 흐름 |
전체 업무기한이 10초에서 4초로 줄어든다면? 시도 횟수·개별 제한시간·간격을 다시 계산하고 기한을 넘는 자동 재시도는 중단한다.
수신자가 요청 식별값 결과를 보존하지 못한다면? 부작용이 큰 명령의 자동 재시도를 안전하다고 가정하지 말고 결과조회·대사 또는 중복방지 저장을 먼저 설계한다.
읽기 전용 조회라면? 중복 부작용 위험은 낮지만 장애 중 재시도 폭주와 오래된 응답 가능성은 별도로 통제한다.
한 번에 되찾기
분산 노드는 따로 고장 날 수 있어 응답 부재만으로 실행 결과를 확정할 수 없다. 시간초과로 기다림을 제한하고, 제한된 재시도와 멱등성·요청 식별자로 중복 효과를 통제하며, 불확실한 결과는 별도 상태로 관리한다.