"최소 한 번 전달"이 기본 계약인 이유

콜봇 플랫폼이 통화 종료·상담원 연결·DTMF 입력 같은 이벤트를 웹훅으로 쏠 때, 대부분의 공급자는 "정확히 한 번"이 아니라 "최소 한 번(at-least-once)" 전달을 기본 계약으로 삼습니다. Twilio는 연결 실패나 응답 타임아웃이 발생하면 같은 상태 콜백을 다시 보내고, Amazon Connect가 EventBridge로 흘려보내는 통화 이벤트도 대상 호출이 실패하면 재시도 큐에 다시 올라갑니다. 수신 측이 이 계약을 "한 번만 온다"고 가정하고 설계하면, 재시도 한 건이 그대로 중복 처리·중복 과금으로 이어집니다.

EventBridge 재시도가 멈추는 두 개의 선

Amazon EventBridge의 재시도 정책은 MaxRetryAttempts(0~185회, 기본 5회)와 MaxEventAgeInSeconds(60~86,400초, 기본 300초) 두 한도 중 먼저 닿는 쪽에서 멈춥니다. 재시도 횟수를 185로 올려도 이벤트 수명을 5분 기본값으로 두면 5분 안에 실패가 반복될 때만 재시도되고, 그 이후는 곧바로 데드레터 큐로 빠집니다. 반대로 수명을 24시간으로 늘리면 같은 이벤트가 그만큼 더 오래, 더 여러 번 재도착할 창이 열립니다 — 재시도 윈도우를 넓히는 선택은 곧 중복 수신 윈도우를 넓히는 선택이기도 합니다.

현장 적용 가이드: 통화 종료 웹훅 멱등성 체크리스트

멱등 처리 목표를 수치로 먼저 선언합니다. 중복 이벤트로 인한 중복 과금 건수 0건, 멱등 키 충돌 감지율 100%, 웹훅 핸들러의 2xx 응답 p99 300ms 이내를 배포 전 합격선으로 둡니다. 멱등 키 저장소의 TTL은 재시도 윈도우로 잡은 MaxEventAgeInSeconds보다 길게 설정해야 하며, 24시간 윈도우를 쓴다면 TTL은 최소 48시간으로 여유를 둡니다.

핸들러가 녹취 변환과 CRM 갱신까지 동기로 끝낸 뒤 응답하다 보니 처리 시간이 응답 타임아웃을 넘기고, 공급자는 이를 실패로 간주해 같은 이벤트를 다시 보내는 경우가 흔합니다. 수신 즉시 202를 반환하고 실제 처리는 큐로 넘기는 구조로 바꾸면 이 재전송 자체가 줄어듭니다.

call_sid 하나만으로 중복을 거르면 같은 통화에서 일어나는 종료·보류·전환처럼 서로 다른 이벤트가 하나로 뭉개집니다. 멱등 키는 call_sid와 event_type, 타임스탬프 버킷을 합쳐 만들어야 이벤트 종류별로 독립적으로 중복을 걸러낼 수 있습니다.

배포 전에는 같은 이벤트를 3회 연속 발송하는 재전송 시나리오를 반드시 재현합니다. 로그에는 수신 시각, 시도 횟수(attempt), 멱등 키, 중복 판정 여부(dedup) 네 필드를 필수로 남겨 재시도 패턴을 사후에 재구성할 수 있게 합니다. 데드레터 큐에 쌓인 이벤트는 사람이 수동으로 재처리하기 전, 185회 안에 처리되지 못한 이유부터 확인합니다(다운스트림 장애인지, 멱등 키 충돌인지).

멱등 키 충돌이 감지되면 두 번째 요청은 처리하지 않고 첫 처리 결과를 그대로 재반환해, 호출자 쪽에서도 성공으로 받아들이게 합니다. 처리 자체가 실패해 데드레터로 빠졌다면 알림을 즉시 보내고 재처리 큐에 넣어 두어, 사람이 승인하면 바로 재주입되게 합니다.

주간 단위로 중복 수신율(전체 이벤트 대비 dedup=true 비율)과 데드레터 적재 건수를 추적합니다. 중복 수신율이 꾸준히 오른다면 공급자 쪽 타임아웃 설정이나 네트워크 구간을 의심할 신호이고, 데드레터가 쌓인다면 재시도 윈도우나 다운스트림 처리 용량을 다시 맞춰야 할 신호입니다.

한눈에 보는 적용 포인트

콜봇 루프의 통화 이벤트 웹훅은 최소 한 번 전달이 기본값이라는 전제에서 출발해야 합니다. call_sid와 event_type을 합친 멱등 키, 재시도 윈도우보다 긴 TTL, 즉시 202 응답 구조, 재전송 시나리오 테스트를 갖추면 재시도가 185회까지 반복되어도 중복 과금이나 상태 꼬임 없이 받아낼 수 있습니다.

참고 링크

Event retry policy and using dead-letter queues — Amazon EventBridge

Webhooks (HTTP callbacks): Connection Overrides — Twilio

이 글에 대해 AI와 대화하기

AI가 이 글을 읽은 상태로 답합니다. 무엇이든 물어보세요 — 글에 없는 내용이면 없다고 먼저 알려줍니다.

대화창을 불러오는 중…