Dovrei usare webhook o polling per un'API di trascrizione?
Risposta breve
Webhook per la consegna principale, polling come backup – la configurazione di produzione più robusta. Il solo polling spreca richieste; i soli webhook rischiano di perdere eventi.
I job di trascrizione sono in genere asincroni: carichi un file, l'API restituisce un `transcription.id` e il risultato arriva più tardi. Come scopri che è pronto?
Polling Il tuo codice interroga l'API periodicamente: « Il job X è finito? \" Tipicamente: GET `/v1/transcriptions/{id}/status` ogni 2-5 secondi. Quando lo stato passa a `completed`, recuperi il risultato.
Vantaggi: semplice, nessun URL pubblico necessario, funziona dietro i firewall e nei job in background. Svantaggi: molte richieste vuote (un file da 1 h elaborato in 2 min costa 60-100 sondaggi), rischio di limite di frequenza, latenza max = intervallo di polling.
Webhook Registri un URL; l'API lo chiama quando il job finisce. POST con un corpo del tipo `{ "event": "transcription.completed", "id": "…", "result": { … } }`. Firmato con HMAC-SHA256, così puoi verificare che sia davvero il fornitore.
Vantaggi: nessuna richiesta vuota, latenza inferiore al secondo, scala a milioni di job. Svantaggi: richiede un URL pubblico (o un tunnel come ngrok in dev), devi implementare tu i tentativi, l'idempotenza e la verifica della firma. Se la consegna del webhook fallisce (server offline, problema di rete), l'evento può andare perso.
La risposta giusta: entrambi I sistemi in produzione combinano i due. Webhook per la consegna principale – veloce, efficiente. Polling come rete di sicurezza ogni 5-10 minuti per i job in coda da più di 30 min – intercetta i casi in cui il webhook è andato perso.
Pattern concreto ``` // Al caricamento const job = await api.transcribe({ file, webhook_url: "https://…" }) await db.insert({ id: job.id, status: "queued" })
// Endpoint del webhook app.post("/webhook", (req) => { if (!verifySignature(req)) return 401 await db.update(req.body.id, { status: "completed", result: req.body.result }) })
// Job di backup (cron, ogni 10 min) const stuck = await db.where("status", "queued").and("createdAt", "<", now-30min) for (const j of stuck) { const fresh = await api.getStatus(j.id) if (fresh.status === "completed") await db.update(j.id, fresh) } ```
Specifiche DeepScript Supportiamo entrambi: registra i webhook tramite `POST /v1/webhooks` (eventi: `transcription.completed`, `transcription.failed`, `balance.low`), fai polling tramite `GET /v1/transcriptions/{id}/status`. Per un'interfaccia in tempo reale nel browser, esponiamo anche SSE (`GET /v1/transcriptions/{id}/events`) – i server-sent event trasmettono gli aggiornamenti di stato direttamente al client senza aprire un canale WebSocket.
Domande correlate
Ti è rimasta una domanda?
Tre trascrizioni gratuite da provare. Oppure scrivici un'e-mail – rispondiamo entro 24 ore, anche per le domande sulla conformità.