Короткий ответ
Polling — это когда ваш сервис сам периодически опрашивает внешний API, чтобы узнать об изменениях; webhook — это когда внешний сервис сам отправляет HTTP-запрос на ваш URL в момент события, без необходимости постоянно спрашивать.
Как это работает подробнее
при polling клиент шлёт запросы с интервалом (например, раз в минуту) и сравнивает состояние с предыдущим; при webhook сторонний сервис заранее настраивается на отправку POST-запроса на указанный URL при возникновении события (оплата прошла, статус изменился).
Пример кода
example.py
from fastapi import FastAPI, Request
app = FastAPI()
@app.post("/webhooks/payment")
async def payment_webhook(request: Request):
payload = await request.json()
event_id = payload["event_id"]
if already_processed(event_id):
return {"status": "duplicate_ignored"}
process_payment_event(payload)
mark_processed(event_id)
return {"status": "ok"}Что использовать на практике
- Рекомендация. webhook снижает задержку реакции на событие и нагрузку по сравнению с частым polling, но требует, чтобы ваш сервис был доступен из интернета по HTTPS и мог обработать повторную доставку одного и того же события (внешние сервисы обычно не гарантируют доставку ровно один раз). Polling проще реализовать и тестировать, но создаёт либо задержку, либо лишнюю нагрузку при частом опросе.
Подводные камни
- Риски. не проверять подлинность входящего webhook-запроса (его может отправить кто угодно, кто знает URL), не обрабатывать повторную доставку одного и того же webhook как идемпотентную операцию, использовать слишком частый polling "на всякий случай", создавая лишнюю нагрузку на внешний API и риск упереться в rate limit.