API 장애 자동 복구 (트리거 설계, 복구 전략, 안전 장치)

API 장애는 평균 감지부터 수동 대응까지 최소 수 분이 걸립니다. API 장애 대응에서 가장 중요한 요소는 속도입니다. 장애는 대부분 짧은 시간 안에 급격하게 확산되며, 대응이 지연될수록 시스템 전체에 미치는 영향은 기하급수적으로 증가합니다. 기존의 운영 방식에서는 모니터링을 통해 장애를 감지하고, 담당자가 이를 확인한 후 수동으로 대응하는 구조가 일반적이었습니다. 그러나 이 방식은 인간의 인지 속도와 의사결정 과정에 의존하기 때문에, 실시간 대응이 필요한 환경에서는 명확한 한계를 가집니다. 이러한 문제를 해결하기 위해 등장한 개념이 바로 자동 복구 전략입니다.

트리거 설계: 언제 시스템이 스스로 깨어나야 하는가

자동 복구에서 가장 먼저 물어봐야 할 것이 있습니다. "어떤 상황에서 시스템이 스스로 대응해야 하는가?" 이 질문에 제대로 답하지 못하면, 자동화는 오히려 더 큰 혼란을 만들어냅니다. 에러율 하나만 보고 트리거를 걸었더니, 배치 작업 중 일시적인 오류가 복구 루틴을 반복 실행시켜 멀쩡한 서비스가 재시작되는 황당한 상황이 벌어졌습니다.

트리거는 SLO(서비스 수준 목표, 즉 서비스가 얼마나 안정적으로 운영되어야 하는지 정의한 기준)를 기반으로 설계하는 것이 맞습니다. 에러율이 올라갔는가, 응답 지연이 특정 임계값을 넘었는가, 이 두 가지가 동시에 충족되는 복합 조건을 써야 오탐(False Positive, 실제 장애가 아닌데 장애로 잘못 감지하는 것)이 줄어듭니다. 단일 지표는 생각보다 거짓말을 자주 합니다.

"에러율 5% 이상 + 해당 엔드포인트 호출 집중"처럼 맥락을 포함한 조건이 훨씬 안정적이었습니다. 트래픽이 극도로 낮은 시간대에 에러 1~2건이 나면 에러율이 순간적으로 높게 잡히는 경우가 있는데, 이걸 복합 조건이 걸러줍니다. 설계 단계에서 이 부분을 충분히 테스트하지 않으면 나중에 꼭 후회하게 됩니다.

복구 전략: 재시도, 스케일링, 격리 중 무엇을 선택할 것인가

트리거가 발동하면 다음 질문이 생깁니다. "그래서 시스템이 뭘 해야 하는가?" 자동 복구 전략은 크게 세 방향으로 나뉩니다.

  1. 재시도(Retry) + 지수 백오프: 일시적인 네트워크 오류나 외부 서비스 불안정에 효과적입니다. 지수 백오프(Exponential Backoff)란 재시도 간격을 1초, 2초, 4초처럼 지수적으로 늘리는 방식으로, 요청이 한꺼번에 몰려 서버를 더 압박하는 상황을 막아줍니다.
  2. 자동 스케일링(Auto Scaling): 트래픽 급증이 원인이라면 인스턴스를 자동으로 늘리는 것이 현실적인 답입니다. 클라우드 환경에서는 이 방식이 가장 빠른 대응 수단 중 하나입니다.
  3. 자동 롤백(Rollback) + 장애 격리: 배포 이후 문제가 생겼다면 이전 안정 버전으로 즉시 되돌리는 것이 맞습니다. 특정 서비스가 원인일 때는 Circuit Breaker(서킷 브레이커, 문제가 생긴 서비스로의 요청을 일정 시간 차단해 전체 시스템으로의 장애 확산을 막는 패턴)를 함께 써서 요청을 격리해야 합니다.

재시도만 잘 설계해도 체감 장애 빈도가 크게 줄었습니다. 외부 API 연동에서 발생하는 오류 중 상당수가 일시적인 것이었는데, 단순 재시도 없이 곧바로 에러를 올리던 구조를 바꾸고 나서 불필요한 알람이 절반 이하로 떨어진 경험이 있습니다. Circuit Breaker는 구현 난이도에 비해 효과가 크다고 느꼈고, 출처: Martin Fowler - CircuitBreaker에 정리된 개념을 기반으로 적용하면 이해하기 훨씬 쉽습니다.

다만 세 가지 전략을 무분별하게 조합하면 안 됩니다. 재시도가 과도하면 장애 중인 서버에 요청이 더 쌓이고, 스케일링이 빠르게 붙더라도 원인이 코드 버그라면 인스턴스만 늘어날 뿐입니다. 각 전략이 어떤 유형의 장애를 대상으로 하는지 명확히 구분해두는 것이 먼저입니다.

안전 장치: 자동화가 자동화를 망치지 않으려면

자동 복구를 도입하고 나면 반드시 이런 생각이 듭니다. "이 복구 루틴 자체가 잘못 돌면 어떻게 되지?" 맞습니다. 자동화는 사람의 실수를 줄이지만, 설계 결함이 있으면 사람보다 훨씬 빠르게 더 큰 문제를 만들어냅니다.

안전 장치의 핵심은 세 가지입니다. 첫 번째는 실행 횟수 제한입니다. 동일한 복구 작업이 일정 횟수 이상 반복되면 자동 대응을 멈추고 수동 개입으로 전환해야 합니다. 같은 복구가 5번 이상 반복된다면 그건 자동화가 해결할 수 없는 문제라는 신호일 가능성이 높습니다.

두 번째는 복구 이후 헬스 체크(Health Check, 시스템이 정상 상태인지 주기적으로 확인하는 검증 요청)입니다. 복구 작업이 완료됐다고 해서 시스템이 정상 상태로 돌아온 것은 아닙니다. 테스트 요청을 보내 실제로 응답이 정상인지 확인하는 단계가 없으면, 복구가 됐다고 착각한 채로 알람만 해제되는 경우가 생깁니다. 저는 이 단계를 빼먹어서 장애 상황을 30분 넘게 인지하지 못했던 적이 있습니다.

세 번째는 관측 가능성(Observability)과의 연동입니다. 모든 자동 대응은 반드시 로그로 남아야 합니다. 어떤 트리거가 발동했는지, 어떤 복구가 실행됐는지, 그 결과가 어땠는지가 기록되지 않으면 나중에 개선할 방법이 없습니다. 출처: Google SRE Book에서도 자동화와 관측 시스템의 연계를 핵심 운영 원칙으로 강조하고 있습니다. 이 기록들이 쌓여야 어떤 트리거가 효과적이었고, 어떤 복구 방식이 실패했는지 데이터로 판단할 수 있습니다.

자동 복구 전략은 사람을 대체하려는 것이 아닙니다. 반복적이고 예측 가능한 장애는 시스템이 처리하고, 복잡한 판단이 필요한 문제는 사람이 집중할 수 있도록 역할을 나누는 구조입니다. 처음부터 완벽한 설계를 하려 하기보다는, 가장 자주 발생하는 장애 유형 하나부터 자동화해보는 것을 권합니다. 저도 그렇게 시작했고, 그게 쌓여서 지금의 구조가 됐습니다.


관련 글

댓글

이 블로그의 인기 게시물

HTTP 메서드의 필요성 (GET과 POST, PUT과 DELETE, API 보안)

API 없는 세상의 불편함 (로그인 연동, 서비스 구조, 디지털 인프라)

API 이해하기 (서비스 연결, 시스템 협력, 디지털 구조)