Надёжная обработка webhook: подпись, повторы, идемпотентность и очередь

Как построить надёжный webhook endpoint: проверить подпись, быстро подтвердить запрос, обработать повторы идемпотентно, использовать очередь и мониторинг.

Команда наблюдает за доставкой событий в операционном центре
Команда наблюдает за доставкой событий в операционном центреРедакция Малевич · 13 мин

Что важно понять до начала

Webhook переносит событие от внешней системы в ваш продукт, но сеть не гарантирует единственную и упорядоченную доставку. Поставщик может повторить запрос после таймаута, а разные события — прийти в неожиданной последовательности.

Надёжный обработчик отделяет приём от бизнес-операции: проверяет подлинность, сохраняет событие, быстро отвечает успешным кодом и продолжает работу через очередь. Повтор не должен повторно списать деньги, создать заказ или отправить письмо.

Как закрепить результат

Разовая настройка быстро устаревает. Правила, тесты и владельцы нужны, чтобы качество сохранялось при следующих релизах и новых интеграциях.

  • Секреты ротируются без остановки приёма событий.
  • Логи содержат event ID и correlation ID, но не раскрывают секреты и лишние данные.
  • Очередь и база имеют метрики возраста, повторов и необработанных сообщений.
  • Тесты воспроизводят дубликат, неверную подпись, задержку и перестановку событий.

Что подготовить

До изменений зафиксируйте границы задачи, исходные данные, ответственных и критерий готовности. Это делает проверку воспроизводимой и защищает рабочие процессы.

  • Изучить схему подписи, политику повторов и уникальный идентификатор события у поставщика.
  • Определить допустимую задержку и последствия повторной или пропущенной обработки.
  • Подготовить секреты отдельно для тестового и рабочего окружений.
  • Описать процедуру ручного повторного запуска и восстановления из журнала.

Пошаговый план

Работайте небольшими проверяемыми этапами: каждый шаг должен оставлять наблюдаемый результат, который можно проверить до выпуска и после него.

  • Получить исходное тело запроса и проверить подпись до разбора доверенных полей.
  • Проверить временную метку и защититься от повторного воспроизведения старого запроса.
  • Сохранить ID события с уникальным ограничением и исходным статусом обработки.
  • Поместить подтверждённое событие в очередь и быстро вернуть поставщику 2xx.
  • Выполнять бизнес-операцию идемпотентно и фиксировать результат атомарно.
  • Настроить повторы с backoff, dead-letter очередь, алерты и инструмент replay.

Что измерять

Набор метрик должен одновременно показывать техническое качество, пользовательский результат и скорость реакции команды на отклонение.

  • Доля событий, подтверждённых в пределах SLA поставщика.
  • Количество дубликатов и доля безопасно подавленных повторов.
  • Возраст самого старого сообщения и размер очереди.
  • Число событий в dead-letter очереди и время восстановления.

Типичные ошибки

Большинство сбоев возникает на границах ответственности: когда техническая проверка не связана с бизнес-сценарием, данными и действиями пользователя.

  • Запускать долгую бизнес-логику до ответа поставщику.
  • Считать повторную доставку ошибкой поставщика и не делать операцию идемпотентной.
  • Разбирать изменённое middleware тело при проверке криптографической подписи.
  • Возвращать 200 до надёжного сохранения события, теряя возможность восстановления.

Результат работы

Webhook нужно проектировать как доставку минимум один раз: один и тот же факт может прийти повторно, позже или не по порядку.

Готовое решение включает не только исправление или настройку, но и документированный способ повторной проверки. Так команда может безопасно развивать продукт без возврата прежней проблемы.

Источники

  1. Receive Stripe events in your webhook endpoint

    Stripe Documentation / доступ 2026-09-15

    Официальные рекомендации по подписи, повторной доставке и обработке событий.

FAQ

Почему webhook приходит дважды?

Поставщик повторяет доставку, если не получил своевременный успешный ответ или не уверен в результате. Обработчик должен ожидать такие повторы.

Что использовать как ключ идемпотентности?

Лучше стабильный уникальный ID события от поставщика. Если его нет, ключ формируют из неизменяемых бизнес-полей по документированному правилу.

Нужно ли сохранять исходное событие?

Да, в объёме, разрешённом политикой данных. Это помогает расследовать ошибку и безопасно повторить обработку без запроса к поставщику.

Сделайте следующий шаг.

Разберём, как применить выводы из материала к вашему продукту, процессу или системе.

Обсудить проект