Перейти к содержимому

Шторм вебхук-ретраев

Большинство платформ ретраят failing-вебхуки час-сутки. Если вы пропустите этот период — событие потеряется навсегда. Простой счётчик повторов:

import os, time, requests, collections
W = collections.defaultdict(list) # delivery-id → [timestamps]
@app.post("/hook/<provider>")
def hook(provider, request):
delivery_id = request.headers.get("X-GitHub-Delivery") or \
request.headers.get("Stripe-Delivery-Id") or \
request.headers.get("X-Hook-Id")
if delivery_id:
W[delivery_id].append(time.time())
if len(W[delivery_id]) >= 3:
push(f"🌪️ Webhook retry storm: {provider}",
f"Delivery {delivery_id} получен {len(W[delivery_id])}× за "
f"{int(time.time()-W[delivery_id][0])} сек",
priority=8)
process(provider, request.json)
def push(t, m, p):
requests.post(f"{os.environ['NOTIFLY_URL']}/message",
params={"token": os.environ["NOTIFLY_TOKEN"]},
json={"title": t, "message": m, "priority": p}, timeout=5)

Прямо в Notifly есть вебхуки — заведите dynamic-webhook в роли «прокси»: внешний сервис шлёт ему, он транслирует в push и одновременно фиксирует delivery-id.