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.