취소했는데 채널에 반영되지 않는다는 문의가 왔고 우리 시스템에서는 취소가 완료로 보였다. 취소 테이블을 열어 보니 내부 취소는 완료인데 채널 연동은 실패이고 연동 식별자는 비어 있었다.
Table of contents
Open Table of contents
재시도할 대상이 없던 실패
실패면 재시도하면 된다고 생각하고 그 연동 작업이 어디서 발행되는지부터 찾았다. 환불 완료를 처리하는 지점에서 작업이 발행되는 구조였다.
그런데 이 주문에는 환불 기록 자체가 없었으므로 발행 지점을 지나간 적이 없었다. 실패라는 표시는 시도했다가 실패한 것이 아니라 시도된 적이 없다는 뜻이었다.
상태 값이 가리지 못한 두 상황
재시도가 의미 있는 실패는 작업이 존재하고 실행됐다가 오류가 난 경우다. 작업이 만들어지지도 않은 경우는 재시도로 아무것도 달라지지 않는다.
두 경우가 같은 상태 값으로 보이므로 상태만 봐서는 구분되지 않는다. 초기값을 실패로 두면 이 둘이 영구히 섞이므로 대기와 발행과 실패를 나눠야 구분된다.
우연이 아닌 구조적 제외
왜 환불이 없었는지 보니 이 주문은 퇴점한 업체의 건이라 공급자 식별자와 결제 정보가 없었다. 결제 정보가 없으면 환불 흐름을 탈 수 없다.
식별자 부재에서 결제 정보 부재로 그리고 환불 흐름 이탈과 작업 미발행까지 전 단계가 결정돼 있었다. 일시적 오류가 아니라 구조적으로 이 경로에서 제외되는 건이었다.
대안을 붙인 회신
그래서 재시도하겠다는 답 대신 이 주문은 환불 흐름을 탈 수 없어 연동 작업이 생성되지 않는다고 회신했다. 재시도로는 해결되지 않는다는 사실을 명시했다.
다만 거기서 끝내지 않고 해당 마켓 관리자에서 직접 취소해야 한다는 경로를 함께 적었다. 안 된다는 답에는 대안을 붙여야 요청자가 다음 행동을 정할 수 있다.
진단 순서를 앞으로 당기기
같은 문의가 또 올 것에 대비해 순서를 정했는데 환불 기록 확인을 가장 앞에 뒀다. 없으면 작업이 생성되지 않았다는 뜻이므로 재시도 대상이 아니다.
작업 테이블부터 보면 없다는 사실만 확인하고 왜 없는지는 알 수 없다. 선행 레코드와 작업 레코드와 식별자 순으로 봐야 원인까지 닿는다.
정리
- 후속 작업이 선행 완료 시점에 발행되면 선행을 못 탄 건은 영영 반영되지 않는다
- 실패 표시가 시도 실패인지 미시도인지 구분되지 않는다
- 초기값을 실패로 두면 두 상황이 섞인다
- 재시도가 소용없는 실패가 있다
- 식별자가 비어 있으면 구조적 제외일 수 있다
- 진단은 선행 레코드부터 본다
- 안 된다는 답에는 대안을 붙인다
- 상태 값 하나가 두 상황을 뜻하면 그 사실을 기록한다