rollback

2 개의 포스트

cloudflare3분 읽기큐레이션 요약

Cloudflare Workflows를 위한 사가 롤백 구축 방법

Cloudflare Workflows에 Saga 패턴 기반의 롤백 기능이 추가되어, 각 `step.do()`에 보상 작업을 함께 선언할 수 있게 되었습니다. 여러 외부 시스템을 거치는 워크플로에서 중간 단계가 실패해도 이전 작업을 역순으로 되돌릴 수 있으며, 롤백 자체도 내구성 있는 단계로 실행됩니다. 이를 통해 개발자가 별도의 `try-catch`, 실행 이력 추적, 수동 롤백 순서 관리를 구현할 필요가 줄어듭니다. ## 분산 작업에서 롤백이 필요한 이유 - Workflow는 여러 단계에 걸쳐 외부 시스템을 호출하고, 각 단계의 상태를 저장하며 실패 시 재시도합니다. - 그러나 이미 완료된 외부 작업은 단순히 “취소”할 수 없습니다. - 예: Bank A에서 출금이 성공한 뒤 Bank B 입금이 실패하면, Bank A의 출금을 삭제하는 대신 다시 입금해야 합니다. - 원래 작업과 이를 의미적으로 되돌리는 보상 작업의 조합을 Saga 패턴이라고 합니다. - 기존에는 개발자가 성공한 단계를 추적하고, 실패 시 어떤 작업을 어떤 순서로 취소할지 직접 관리해야 했습니다. ## `step.do()`에 보상 로직 선언 - 이제 `step.do()`의 마지막 인자로 `rollback` 함수를 전달할 수 있습니다. ```ts await step.do( "debit-bank-a", () => bankA.debit(from, amount), { rollback: async ({ output }) => bankA.credit(from, amount, output.id), } ); ``` - 각 정방향 작업과 롤백 작업이 같은 위치에 정의됩니다. - 새로운 단계를 추가할 때 해당 단계의 보상 로직도 함께 추가할 수 있습니다. - 별도의 대형 `catch` 블록이나 성공 단계 추적 변수, 수동 실행 순서 관리가 필요하지 않습니다. - 롤백 함수는 정방향 작업의 결과인 `output`을 받아 보상 작업에 활용할 수 있습니다. ## 롤백 실행 순서와 실패한 단계 처리 - 어떤 단계에서 오류가 발생하면, 롤백 핸들러는 단계가 시작된 순서의 역순으로 실행됩니다. - 출금 → 입금 → 알림 순서라면, 롤백은 입금 취소 → 출금 환불 순서입니다. - 오류가 발생한 단계 자체도 롤백 대상이 될 수 있습니다. - 외부 시스템에는 작업이 반영됐지만, 결과를 Workflow에 반환하기 전에 단계가 실패할 수 있기 때문입니다. - 예를 들어 결제 제공자가 금액을 승인한 뒤 `chargeId`를 반환하기 전에 오류가 발생할 수 있습니다. - 따라서 롤백 함수는 `output === undefined`인 경우도 안전하게 처리해야 합니다. - 사용자가 오류를 잡고 Workflow를 정상적으로 계속 진행하면 롤백은 시작되지 않습니다. - 다만 오류를 잡은 뒤 Workflow가 나중에 다른 이유로 실패하면, 그때까지 등록된 롤백 핸들러가 역순으로 실행될 수 있습니다. ## 롤백도 내구성 있는 작업으로 실행 - 롤백은 단순한 메모리상의 정리 코드가 아니라 Workflow의 내구성 모델에 따라 실행됩니다. - 재시작이나 일시적인 장애가 발생해도 롤백 작업을 추적하고 재시도할 수 있습니다. - 롤백 과정에서 하나의 보상 작업이 실패하더라도 이후 롤백을 계속 진행할 수 있도록 설계해야 합니다. - 롤백 실패는 운영자가 대응할 수 있도록 알림이나 별도 모니터링을 연결하는 것이 필요합니다. ## 멱등성 보장의 중요성 - 일반 Workflow 단계와 마찬가지로 롤백 함수도 멱등적이어야 합니다. - 같은 롤백이 여러 번 실행되어도 결과가 중복 적용되면 안 됩니다. - 권장 방식: - 결제 환불에는 결제 제공자의 멱등성 키 사용 - 재고 해제는 여러 번 호출해도 한 번만 해제되도록 구현 - 출금·입금과 롤백 각각에 고유한 멱등성 키 부여 - 예시에서는 다음과 같이 작업별 키를 사용합니다. ```ts `${transferId}:debit-account-a` `${transferId}:rollback-debit-account-a` ``` - 이를 통해 Workflow 재시도나 롤백 재실행으로 인해 동일한 이체가 중복 처리되는 것을 방지합니다. ## 실용적인 적용 권장사항 - 외부 시스템을 변경하는 모든 단계에 가능한 한 명시적인 롤백 함수를 함께 정의하세요. - 롤백 함수는 `output`이 없거나 일부 작업만 반영된 상황도 처리해야 합니다. - 정방향 작업과 롤백 모두에 안정적인 멱등성 키를 사용하세요. - 롤백 실패는 조용히 무시하지 말고 알림, 재처리 큐, 운영 대시보드 등으로 추적하세요. - Saga 롤백은 트랜잭션을 원자적으로 만드는 기능이 아니라, 실패 후 상태를 보정하는 보상 처리机制이므로 외부 API의 보상 연산을 신중히 설계해야 합니다.

원문 읽기(새 탭에서 열림)
woowahan원문

장애 대응의 성패를 가르는 First Action — 우아한형제들의 장애 관리 라이프사이클 (새 탭에서 열림)

우아한형제들은 장애 대응의 성패가 장애 인지 속도보다 'First Action(초동 조치)'의 속도와 종류에 달려 있음을 확인하고, 이를 체계적으로 관리하기 위한 장애 관리 라이프사이클을 정립했습니다. 실제 장애 사례 분석 결과, 핫픽스보다 롤백 위주의 기계적 완화 조치가 장애 지속 시간을 절반 가까이 줄이는 효과가 있었으며, 이를 위해 전사 공통의 메트릭과 단계를 정의하여 운영 프로세스를 개선하고 있습니다. 결과적으로 장애 대응을 개인의 역량이 아닌 시스템과 데이터 기반의 프로세스로 전환하여 고객 경험의 악영향을 최소화하는 것을 목표로 합니다. ## First Action의 중요성과 롤백의 효율성 * 70여 건의 장애 사례를 분석한 결과, 첫 조치로 핫픽스를 선택한 경우가 롤백을 선택한 경우보다 장애 지속 시간이 약 2배 더 길게 나타났습니다. * 핫픽스는 원인 파악, 코드 수정, 빌드 및 배포 과정을 거쳐야 하므로 서비스 상태가 방치되는 시간이 길어지는 반면, 롤백은 즉각적인 상태 복구가 가능합니다. * 장애 대응에서 중요한 것은 완벽한 원인 분석보다 '얼마나 빨리 의미 있는 완화 조치를 실행했는가'이며, 이를 위해 롤백이나 스케일 조정 같은 사전 정의된 기계적 조치를 우선시해야 합니다. ## 장애 관리 라이프사이클의 표준화 * 팀마다 장애 인지 및 대응 시점의 기준이 달라 발생하는 혼선을 방지하기 위해 전사 공통의 언어와 구조인 '장애 관리 라이프사이클'을 정의했습니다. * 라이프사이클은 크게 '잠재적 장애 상태(이상 탐지)'와 '실제 장애 상태(6단계)'로 구성되어 총 7단계의 흐름을 가집니다. * 각 단계는 이상 탐지(Anomaly) → 인지 및 전파(Open) → 분석(Investigating) → 원인 확인 및 조치(Identified) → 모니터링(Monitoring) → 해소 확인(Resolved) → 이행 추적(Closure Time)으로 이어집니다. * 특히 '조치(Identified)' 단계에서는 원인 규명에 매몰되기보다 여러 완화 조치를 병렬로 검토하여 고객 영향을 줄이는 데 집중합니다. ## 대응 속도와 병목을 측정하는 핵심 메트릭 * **MTTD(평균 탐지 및 인지 시간):** 단순히 알람이 울린 시점이 아니라, 담당자가 이를 확인하고 'ACK' 등의 객관적 근거를 남긴 시점까지 포함하여 탐지 체계의 신뢰도를 측정합니다. * **MTTR(평균 복구 시간):** 장애 인지 후 서비스가 정상화될 때까지의 시간으로, 복구 작업의 복잡성과 의사결정 구조의 효율성을 나타냅니다. * **MTTFA(평균 초동 조치 시간):** 장애 발생 후 롤백이나 스케일 조정 같은 최초의 기계적 조치가 실행되기까지의 시간으로, 대응 절차의 단순화 수준을 평가합니다. * **MTTEA(평균 유효 조치 시간):** 조치 실행 후 실제로 서비스 지표가 개선되기 시작한 시점까지의 시간으로, 수행한 조치가 얼마나 실질적인 효과가 있었는지 검증합니다. ## 이행 추적과 지속적인 운영 개선 * 장애가 해소(Resolved)된 이후에도 근본 원인 분석(RCA)을 문서화하고 재발 방지 대책을 실행하는 'Closure Time' 단계를 두어 운영 개선의 선순환을 만듭니다. * 장애 보고서 작성과 후속 대책 이행 프로세스를 분리하여 관리함으로써, 장애가 단순 종료에 그치지 않고 실제 시스템 고도화로 이어지도록 관리합니다. * 메트릭 측정을 통해 도출된 데이터는 어디에서 지연이 발생하는지 파악하는 '속도계' 역할을 하며, 이를 기반으로 자동화 도입이나 표준 대응 절차(SOP)를 개선합니다. 장애 대응의 핵심은 장애 상황에서 발생할 수 있는 '판단의 시간'을 줄이는 것입니다. 이를 위해 복잡한 분석 없이도 즉시 실행 가능한 롤백 환경을 구축하고, MTTFA와 같은 지표를 통해 초동 조치 속도를 구조적으로 단축하는 노력이 필요합니다. 조직 전체가 동일한 라이프사이클과 메트릭을 공유할 때, 장애 대응은 개인의 판단이 아닌 데이터 기반의 체계적인 시스템으로 작동할 수 있습니다.