신규잘못된 모델을 올린 판매자를 어떻게 잡아내고 환불하는지 알려 드립니다.
UberLLM

웹훅 vs API: 푸시, 폴링 및 각각의 사용 시점

웹훅과 API를 방향, 트래픽, 신뢰성, 비용 측면에서 비교하고, 각각의 사용 시점과 비동기 AI 미디어 작업을 위해 이 둘을 어떻게 결합할 수 있는지 설명합니다.

webhook vs API에 대한 일반적인 조언은 불완전합니다. 웹훅은 실시간 업데이트에 사용하고, API는 그 외 모든 것에 사용하라는 것이죠. 하지만 이것은 가장 어려운 부분을 건너뜁니다. 웹훅 리시버는 비동기 메시지 소비자이며, 푸시 전달을 선택한다는 것은 중복, 누락된 알림, 인증 및 복구에 대한 책임을 수락하는 것을 의미합니다. 유용한 비교는 푸시 대 풀이 아닙니다. 그것은 트래픽 경제성 대 운영 제어이며, 어떤 채널이 실패하든 복구 경로를 포함합니다.

목차

Webhook과 API 한눈에 보기

기준 API (요청-응답 또는 폴링) Webhook (푸시 알림)
방향 클라이언트가 요청을 보내고 서버가 응답합니다 공급자가 클라이언트 URL로 HTTP 요청을 보냅니다
누가 시작하는가 클라이언트 공급자, 이벤트 발생 시
타이밍 클라이언트가 요청할 때 이벤트가 발생할 때
가장 적합한 경우 현재 상태, 기록, 백필, 조정 상태가 변경되거나 작업이 완료될 때 앱에 알림
클라이언트 요구 사항 아웃바운드 HTTP 액세스만 공개 HTTPS endpoint, 서명 확인, 저장소
전달 전송 성공 시 각 요청에 대한 직접 응답 일반적으로 제한된 재시도와 함께 최소 한 번 전달, 중복 및 재정렬 가능성 있음
장애 복구 클라이언트가 재시도하고 다시 확인 공급자가 재시도; 소비자는 API를 통해 중복 제거 및 조정
비용 패턴 폴링 빈도에 따라 트래픽 증가 이벤트 볼륨에 따라 트래픽 증가

Webhook은 HTTP API를 기반으로 구축된 이벤트 전달 메커니즘이며, API를 대체하는 것이 아닙니다. 대부분의 프로덕션 통합에는 두 가지 모두 필요합니다: 명령 및 신뢰할 수 있는 읽기를 위한 요청 경로와 변경 사항에 대한 알림 경로.

애플리케이션이 동영상 생성 작업을 제출한다고 가정해 봅시다. API를 사용하면 백엔드가 저장된 작업 식별자를 사용하여 GET 요청을 보내고 작업의 현재 상태를 받습니다. 애플리케이션은 언제 요청할지, 얼마나 기다릴지, 요청 실패 시 어떻게 할지 선택합니다.

Webhook을 사용하면 공급자가 등록한 endpoint로 작업 완료 이벤트를 보냅니다. 백엔드는 해당 알림을 수락하고 완료된 자산을 검색하는 것과 같은 다음 작업을 예약합니다. 원래 브라우저 세션은 계속 연결되어 있을 필요가 없습니다.

명령과 알림 분리하기

작업을 제출하는 것과 작업이 완료되었음을 아는 것은 다른 작업입니다. API는 기본 계산이 완료될 때까지 연결을 열어두지 않고도 즉시 작업을 수락할 수 있습니다. Webhook은 별도의 완료 신호를 제공합니다.

이러한 구분은 흔한 설계 오류를 방지합니다: 모든 비동기 작업을 열려 있어야 하는 HTTP 요청으로 취급하는 것입니다. 또한 그 반대의 오류, 즉 이벤트 알림을 현재 상태의 완전한 기록으로 사용하려는 시도도 방지합니다.

첫 번째 결정: 애플리케이션이 무언가 변경될 때 반응해야 합니까, 아니면 누군가 물어볼 때만 답변이 필요합니까?

사용자가 작업 기록 화면을 열면 현재 기록을 가져옵니다. 아무도 화면을 보고 있지 않을 때 완료된 작업이 자산 전달을 트리거해야 한다면 이벤트 기반 경로를 사용하세요. 두 패턴 모두 네트워크 장애 처리의 필요성을 없애지는 않지만, 각 패턴은 호출자가 복구할 수 있는 다른 위치에 놓이게 합니다.

각 패턴의 데이터 이동 방식

폴링 방식에서는 클라이언트가 변경 사항 유무와 관계없이 타이머에 따라 상태 요청을 반복합니다. 웹훅 방식에서는 공급자가 이벤트 발생 후 요청을 시작하므로, 알림 트래픽은 시간에 따라가는 것이 아니라 활동에 따라갑니다.

Nylas 웹훅 대 폴링 가이드는 기본 트래픽 예시를 제공합니다. 60초마다 하나의 리소스를 폴링하는 것은 하루에 1,440개의 요청을 의미하며, 10,000개의 계정을 비교한 결과 하루에 2.88백만 개의 폴링 요청과 약 500,000개의 웹훅 전송이 발생합니다.

폴링 간격 및 이벤트 발생률에 따른 트래픽 및 지연

시나리오 하루 요청 또는 전송 수 감지 지연
60초마다 하나의 리소스 폴링 1,440개 요청 평균 30초
5분마다 하나의 리소스 폴링 간격에 따라 계산된 288개 요청 평균 2.5분
5분마다 폴링하는 10,000개 계정 2.88백만 개 요청 평균 2.5분
각 50개 이벤트 알림을 받는 10,000개 계정 약 500,000개 전송 이벤트 디스패치 시간 및 재시도 지연
토큰별로 스트리밍되는 텍스트 응답 생성당 하나의 요청 토큰은 생성되는 대로 도착

폴링 평균은 변경 사항이 폴링 일정과 독립적으로 발생한다고 가정합니다. 이는 공급자가 작업을 수행하는 데 걸리는 시간이 아니라 다음 확인까지의 대기 시간을 설명합니다.

간격이 짧을수록 더 많은 요청을 사용하여 검색 시간을 단축합니다. 간격이 길수록 트래픽은 줄어들지만, 완료된 작업이 발견되지 않은 채로 남아있게 됩니다. 계정 규모에서는 비활성 계정도 모두 확인되기 때문에 적당한 일정으로도 상당한 트래픽이 발생합니다.

웹훅 전송은 고정된 확인 일정을 없애주지만, 전송 횟수가 인프라 비용의 전부는 아닙니다. 알림 후 API 조회, 전송 재시도, 수신자 저장소, 작업자 실행 등도 여전히 리소스를 소비합니다.

이들은 서로 다른 통신 패턴이며, 상호 교환 가능한 용어가 아닙니다.

클라이언트-서버 통신을 위한 세 가지 데이터 전송 패턴(폴링, 웹훅, 스트리밍 API)을 비교하는 인포그래픽.

스트리밍은 다른 문제를 해결합니다

스트리밍 텍스트 응답은 요청을 열어둔 채 토큰이 생성되는 대로 반환합니다. 대화형 코딩 도우미의 경우, 별도의 완료 콜백을 받는 것보다 첫 토큰까지의 시간과 출력의 연속성이 더 중요합니다.

당사의 텍스트 응답은 토큰별로 스트리밍되는 반면, 이미지 및 비디오 작업은 준비되었을 때 폴링하거나 웹훅 알림을 받을 수 있는 작업을 반환합니다. 미디어 API 문서는 이러한 작업 지향적 요청 경로를 구현하기 위한 시작점입니다.

폴링 간격을 선택하기 전에 리소스별 이벤트 발생률을 추정하세요. 조용한 리소스와 지속적으로 변경되는 리소스가 자동으로 동일한 일정을 공유해서는 안 됩니다.

폴링의 경우, 간격이 짧을수록 더 많은 트래픽을 사용하여 감지 지연을 줄입니다. 웹훅은 이러한 특정 교환을 피하지만, 신뢰할 수 있는 수신기를 운영하는 비용으로 대체됩니다.

설계 시 고려해야 할 신뢰성 트레이드오프

웹훅 전송은 일반적으로 **최소 한 번(at least once)**이며, 정확히 한 번(exactly once)이 아닙니다. 이는 전송 모델을 설명하는 것이지, 공급자가 영원히 재시도할 것이라는 약속이 아닙니다. 제한된 재시도도 이벤트가 전송되지 않은 채 끝날 수 있으므로, 정상적인 경로(happy path)보다는 최악의 경우를 대비하여 수신자를 설계해야 합니다.

타임아웃은 발신자에게 다운스트림에서 무슨 일이 일어났는지 아무것도 알려주지 않습니다. 수신자는 이벤트를 저장소에 커밋한 다음, 네트워크에서 확인 응답을 잃을 수 있습니다. 발신자가 재시도할 때, 애플리케이션은 동일한 이벤트를 다시 수신하며 이를 유연하게 처리해야 합니다.

각 실패에 맞는 보호 조치

  • 중복 전송: 고유 제약 조건 아래에 안정적인 이벤트 식별자를 저장하세요. 공급자가 이벤트를 전송 시도와 구별하는 경우, 시도 ID가 아닌 이벤트 ID로 비즈니스 처리를 중복 제거하세요.
  • 반복적인 부작용: 자산 게시, 계정 업데이트 및 고객 알림을 멱등(idempotent)하게 만드세요. 인그레스(ingress) 중복 제거는 작업을 수행한 후 성공을 기록하기 전에 충돌하는 워커에게는 아무런 도움이 되지 않습니다.
  • 순서가 뒤바뀐 이벤트: 전환을 적용하기 전에 신뢰할 수 있는 상태 또는 문서화된 리소스 버전을 확인하세요. 지연된 "처리 중" 이벤트가 완료된 작업을 덮어쓰는 일이 없어야 합니다.
  • 느린 처리: 비용이 많이 드는 작업을 큐 워커에게 넘기기 전에 이벤트를 검증하고, 영구적으로 수락하며, 확인 응답을 보내세요.

공급자 재시도 정책은 서로 호환되지 않습니다. Supabase 웹훅 문서는 20초 이내에 2xx 응답을 요구하며, 지수 백오프(exponential backoff)를 사용하고 다섯 번의 실패한 시도 후에 중단됩니다. Svix 전송 보장 가이드는 Dynamic의 초기 시도와 약 하루 동안의 다섯 번의 재시도를 문서화하며, Glean의 상태별 재시도 규칙도 함께 설명합니다.

공급자별 문서화된 웹훅 재시도 동작

공급자 성공으로 간주되는 조건 재시도 동작
Supabase 20초 이내 2xx 응답 지수 백오프, 다섯 번의 실패한 시도 후 중단
Dynamic 2xx 응답 초기 시도와 약 하루 동안의 다섯 번의 재시도
Glean 2xx 응답 연결 실패, 타임아웃, 408, 429 및 5xx 재시도; 기타 비-2xx 응답은 최종(terminal)

확인 응답은 내구성 경계

영구 저장 전에 성공을 반환하면 손실 구간이 발생합니다. 발신자는 재시도를 중단하지만, 애플리케이션은 복구할 수 있는 것이 아무것도 없습니다. 미디어 처리 후에만 성공을 반환하면 불필요한 타임아웃과 중복 전송이라는 반대 문제가 발생합니다. 완료된 비즈니스 작업이 아닌, 영구적인 수락을 확인 응답하세요.

페이로드를 신뢰하기 전에 서명 검증이 이루어져야 합니다. 서명 체계가 요구하는 경우 원본 요청 본문(raw request body)을 보존하고, 재직렬화된 객체에 서명하는 대신 공급자가 문서화한 검증 절차를 따르세요.

워커 재시도 소진에 대한 데드 레터(dead-letter) 처리와 이벤트 ID, 태스크 ID, 확인 응답 실패 및 처리 결과를 연결하는 전송 관측성(observability)을 추가하세요. 동일한 워크플로의 폴링(polling) 단계에서는 반환된 상태 코드로 실패를 분류하세요. UberLLM의 API는 402, 404, 429 및 503와 같은 오류 코드]로 호출을 거부하며, 이를 통해 조정 작업(reconciliation job)이 청구 거부를 스로틀링(throttling) 또는 일시적으로 사용할 수 없는 판매자와 분리할 수 있습니다.

놓친 폴링은 다시 확인하여 복구됩니다. 놓친 웹훅은 다른 전송 또는 스케줄에 따라 신뢰할 수 있는 태스크 상태를 다시 읽는 독립적인 조정 패스(reconciliation pass)가 필요합니다. 수신자를 노출하든 안 하든 해당 패스를 구축하세요. 그것이 최소 한 번 전송(at-least-once delivery)을 효과적인 정확히 한 번 처리(exactly-once processing)로 바꾸는 것입니다.

폴링이 더 안전한 선택일 때

웹훅은 단순히 더 빠른 API가 아니라, 전달 안정성 문제입니다. 애플리케이션이 수신자 계약을 지원할 수 없다면, 폴링이 더 신뢰할 수 있는 선택이 될 수 있습니다.

운영상의 차이는 소비자 경계에서 가장 쉽게 확인할 수 있습니다.

API 통합을 위해 웹훅 전달보다 폴링이 더 신뢰할 수 있는 대안인 이유를 보여주는 비교 다이어그램.

방화벽 뒤의 데스크톱 에이전트, 내부 도구 또는 임시 CI 러너는 안정적인 인바운드 주소 없이 아웃바운드 액세스를 가질 수 있습니다. 이러한 클라이언트가 콜백을 수신하도록 하려면 추가 호스팅 서비스, 구성 요소 간 인증, 그리고 원래 호출자에게 영구적인 핸드오프가 필요할 수 있습니다. 이는 사소한 구성 변경이 아니라 인프라 문제입니다.

폴링에 유리한 제약 조건 인식하기

  • 안정적인 공개 endpoint 없음: 임시 개발 환경을 노출하는 대신 통신을 아웃바운드로 유지하세요.
  • 영구적인 이벤트 consumer 없음: 안전한 저장 및 처리를 구축하는 동안 신뢰할 수 있는 상태를 폴링하세요. 수신된 이벤트를 잊어버리는 수신자는 개선이 아닙니다.
  • 소비자 제어 복구: 자체 동시성 제한, 유지보수 기간 및 애플리케이션 마감일에 따라 확인 일정을 잡으세요.

개발자 노트북의 빌드 도구가 원격 미디어 작업을 제출한다고 가정해 봅시다. 이 도구는 완료될 때까지 주기적으로 확인하고, 개발자가 취소하면 중지하며, 저장된 작업 식별자로부터 재개할 수 있습니다. 소수의 활성 작업의 경우, 항상 사용 가능한 수신자를 유지하는 것보다 더 간단하고 저렴할 수 있습니다.

폴링에도 여전히 규율이 필요합니다. 일시적인 실패 시에는 후퇴하고, 모든 클라이언트의 확인을 동기화하는 것을 피하며, 완료된 작업은 더 이상 확인하지 마세요. 아웃바운드 요청에서도 재시도 폭풍이 발생할 수 있습니다.

첨부된 비디오는 요청과 콜백의 차이를 시각화하는 또 다른 방법을 제공합니다.

가장 빠른 성공적인 시연을 보이는 패턴이 아니라, 소비자가 안정적으로 복구할 수 있는 패턴을 선택하세요.

인바운드 웹훅 트래픽은 endpoint 보안, 서명 확인, 큐잉, 중복 억제 및 가용성 요구 사항을 추가합니다. 폴링은 다음 작업이 언제 발생할지에 대한 명시적인 제어를 제공하지만, 공급자의 rate limits는 여전히 적용됩니다.

인바운드 전달이 실용적이고 빈번한 이벤트가 정당화될 때 폴링 fallback과 함께 웹훅을 사용하세요. 그렇지 않으면, 자체적인 주기, 동시성 및 timeout으로 폴링하세요.

미디어 작업을 위한 하이브리드 플로우 구축 방법

하이브리드 통합은 콜백을 작업이 존재한다는 유일한 증거가 아니라 작업을 확인하기 위한 프롬프트로 취급합니다. 지속적인 작업 ID는 초기 요청, 수신 알림, 복구 확인 및 최종 고객 결과를 연결합니다.

저희는 대량의 미디어 워크플로우를 원활하게 진행하기 위해 비동기 작업 추적 및 웹훅 콜백을 사용합니다. 이미지 및 비디오 작업의 경우, 이러한 추적은 한 판매자에게 중단이 발생하더라도 고객의 작업을 잃지 않음을 의미합니다.

이 워크플로우는 제출, 알림 및 상태 복구를 분리하여 관리합니다.

API 및 웹훅을 사용하여 미디어 작업을 처리하는 3단계 하이브리드 워크플로우를 설명하는 다이어그램.

작업에 대한 영구적인 소유권 확립

  1. API를 통해 제출하고 반환된 task ID를 저장합니다. 다운스트림 작업을 시작하기 전에 대기열 상태로 유지합니다. 빠른 콜백이 제출 응답보다 먼저 도착할 수 있으므로 가능한 경우 미리 로컬 제출 기록을 생성합니다. 흔한 실수는 콜백이 항상 데이터베이스 커밋 후에 도착한다고 가정하는 것입니다. 일치하지 않는 이벤트는 나중에 연결할 수 있도록 보관합니다.

  2. 수락된 이벤트를 영구적으로 대기열에 추가하는 수신기를 등록합니다. 요청 핸들러를 작게 유지하고 안전하게 수락된 후 즉시 확인 응답을 보냅니다. 저장하기 전에 성공을 반환하지 말고, 핸들러 내에서 완료된 자산을 다운로드하거나 변환하지 마십시오.

  3. 인증을 확인한 다음, 중복 처리를 제거합니다. 이벤트가 신뢰되거나 승인되기 전에 인그레스에서 서명 확인이 이루어져야 합니다. 그런 다음 작업자는 효과를 적용하기 전에 지속된 이벤트 ID를 확인합니다. 흔한 실수는 이러한 단계를 처리 후 선택적 정리로 취급하는 것입니다. 중단된 작업자가 안전하게 재개할 수 있도록 수락 및 처리 상태를 분리하여 유지합니다.

권위 있는 완료로 수렴

  1. 작업의 권위 있는 상태를 가져옵니다. 고객 작업을 완료로 표시하기 전에 저장된 task ID를 사용합니다. 이벤트에는 식별자만 포함될 수 있으며, 지연된 알림은 이전 전환을 설명할 수 있습니다. 이미지 편집 구현의 경우, 사진 편집 API 가이드는 구축할 구체적인 요청 워크플로우를 제공합니다.

  2. 예상 기간을 초과하여 보류 중인 작업을 폴링합니다. 각 확인 주기마다 백오프, 지터 및 최대 시도 횟수를 사용합니다. 콜백이 누락되었다고 해서 무작정 생성을 다시 제출하지 마십시오. 원래 작업이 이미 완료되었을 수 있습니다.

  3. 애플리케이션 마감일을 설정하고 오래된 작업을 매일 조정합니다. 실패한 생성과 상태 확인 실패를 구분합니다. 마감일까지 공급자 상태가 알 수 없는 경우, 고객 인터페이스를 무기한 대기열에 두는 대신 명시적인 복구 또는 실패 결과를 기록합니다.

상태 확인: 저장된 모든 task ID는 타임아웃 내에 완료 또는 실패와 같은 최종 애플리케이션 결과로 이어져야 합니다. 미해결된 공급자 상태를 운영자에게 표시하여 애플리케이션 타임아웃이 복구가 필요한 결과를 포기하지 않도록 합니다.

워크로드 및 제약 조건별 선택

워크로드부터 시작하여 배포가 지원할 수 없는 패턴은 제외하세요. 수신 클라이언트가 인바운드 요청을 수락할 수 없거나 팀이 중단된 처리를 복구할 수 없다면 가장 빠른 알림 메커니즘도 소용없습니다.

워크로드-패턴 매핑

워크로드 권장 패턴 주요 이유
짧은 텍스트 생성 또는 코딩 응답 스트리밍을 사용하는 동기 API 하나의 응답이 빠르게 필요함
이미지, 비디오, 음악 또는 음성 작업 API를 통해 제출, 완료 시 웹훅, 폴링 대체 완료 시간이 예측 불가능함
공개 엔드포인트가 없는 모바일 또는 브라우저 클라이언트 폴링 공급자 시작 인바운드 호출을 수락할 수 없음
과거 기록 백필 또는 조정 API 목록 호출 현재 및 과거 상태가 필요함
주문 상태와 같은 대량 이벤트 피드 멱등성 소비자 및 조정을 사용하는 웹훅 이벤트 발생률이 제안된 폴링률보다 훨씬 낮을 때 적합함

브라우저는 자체 백엔드를 통해 애플리케이션 업데이트를 계속 받을 수 있지만, 해당 백엔드가 웹훅 수신기를 소유합니다. 해당 책임을 우회하기 위해 공급자 자격 증명이나 콜백 확인 비밀을 브라우저에 넣지 마세요.

워크로드와 배포 제약 조건은 함께 평가되어야 합니다.

워크로드 및 제약 조건에 따라 동기 API 호출과 대기열에 추가된 미디어 작업 간의 선택을 보여주는 다이어그램.

총 운영 비용을 최종 결정 기준으로 사용

Xictron의 웹훅 아키텍처 문서에 인용된 분석에 따르면, 30백만 개의 폴링 요청 중 1.5%개만이 업데이트를 반환했습니다. 이는 제대로 조정되지 않은 폴링이 트래픽을 얼마나 낭비할 수 있는지를 보여주며, 모든 웹훅 통합 비용이 더 적게 든다는 의미는 아닙니다.

폴링 간격, 이벤트 빈도, 페이로드 크기, 공급자 제한을 수신기 호스팅, 큐 스토리지, 모니터링 및 사고 대응과 비교하세요. 웹훅 워커가 여전히 필요로 하는 API 읽기 횟수도 계산하세요. 가벼운 알림 후 권한 있는 가져오기가 이어지는 방식은 요청이 없는 아키텍처가 아닙니다.

다중 공급자 애플리케이션의 경우, 이벤트 스키마 일관성과 대체 동작을 검사하세요. 작업 상태를 자체 애플리케이션 모델로 정규화하는 것이 알림 속도의 작은 차이보다 더 중요할 수 있습니다.

선택 규칙: 사용자 요구 사항을 충족하는 가장 간단한 기본 경로를 선호하고, 지연 시간을 최적화하기 전에 복구 경로에 자금을 투자하세요.

애플리케이션이 요청에 대한 응답을 필요로 할 때 API를 사용하세요. 변경 사항에 반응해야 하고 안전하고 내구성 있는 수신기를 운영할 수 있을 때 웹훅을 사용하세요. 장기 실행 작업에는 독립적인 상태 확인을 추가하고, 인바운드 전달이 불가능할 때는 폴링을 소비자 제어 상태로 유지하세요.

구현 전에 리소스당 예상 이벤트 발생률, 안정적인 endpoint를 노출할 수 있는지 여부, 중복 처리를 어떻게 처리할지 기록해 두세요. 그런 다음 일반 API 요청을 하고 콜백을 추가하기 전에 결과 작업을 저장하고 검색할 수 있는지 확인하세요.


UberLLM은 하나의 API key를 통해 모든 모델을 제공하며 OpenAI 및 Anthropic 와이어 형식을 허용하므로, 기존 클라이언트는 적절한 base URL과 자격 증명을 사용할 수 있습니다. 이미지 및 비디오 워크플로의 경우, 결과가 준비되면 작업 폴링 또는 웹훅 알림을 선택하세요. UberLLM을 방문하여 요청 경로를 테스트한 다음, 애플리케이션에 필요한 완료 및 복구 경로를 추가하세요.