advanced
Webhooks и event-driven APIs
Доставляйте external events с signatures, retries, idempotency, ordering expectations, subscription management и dead-letter handling.
Webhooks доставляют domain events на URL подписчиков — payment settled, shipment dispatched. Consumers должны считать доставку **at-least-once**.
Обязанности отправителя:
- **Подпись payloads** (HMAC-SHA256 с timestamp, как `Stripe-Signature`).
- **Retries** с exponential backoff при non-2xx; лимит попыток; dead-letter queue.
- **Idempotency**: event id + dedup store у consumer; одно событие может прийти дважды.
- **Ordering**: обычно sequence per-resource, не глобально — документируйте гарантии.
POST https://merchant.example/webhooks/payments
Content-Type: application/json
X-Webhook-Id: evt_01H...
X-Webhook-Signature: t=1710000000,v1=abc123...
{"type":"payment.succeeded","data":{"paymentId":"pay_1"}}
Обязанности consumer:
- Проверка подписи и окна timestamp skew.
- Быстрый 2xx; обработка async через queue.
- 4xx только при permanent rejection (bad signature); 5xx вызывает retry.
На интервью: webhook vs polling, шаги verification подписи, идемпотентные handlers.
Типовые ошибки: нет проверки подписи, тяжёлая работа в request thread, ожидание exactly-once, тихая смена endpoint без versioning.
Компромисс: realtime интеграция против сложности доставки — replay tools и event catalogs.
Чеклист:
- Подписанные payloads с timestamp.
- Документированная политика retry и DLQ.
- Dedup consumer по event id.
- Быстрый 2xx + async processing.