Описание проекта
Главное здесь — надёжность, поэтому больше всего меня волнует поведение при сбоях подписчика. Каждая попытка доставки должна быть подписана, чтобы получатель мог проверить, что она пришла от нас, нести метку времени и уникальный идентификатор доставки для защиты от повторов, и при ошибке повторяться с экспоненциальной задержкой и джиттером до настраиваемого предела, после чего уходить в состояние dead-letter. Нужны лимиты параллелизма на каждый эндпоинт, чтобы один заваленный подписчик не забирал ресурсы у остальных, и ключи идемпотентности, чтобы ретрай никогда не приводил к дублю на стороне получателя. Чтобы не было путаницы по объёму: это не общая очередь сообщений для внутренних задач и не API-шлюз, проксирующий входящий трафик. Речь именно о надёжной исходящей доставке вебхуков третьим сторонам, а очередь тут лишь внутренний механизм, а не результат работы.
Мне также нужны наблюдаемость и управление, которые я смогу отдать поддержке и партнёрам. Каждая попытка должна попадать в журнал доставок с запросом, кодом ответа, задержкой и номером ретрая, с поиском по событию, эндпоинту и статусу. Должна быть возможность вручную переотправить неудачную или dead-letter доставку, поставить эндпоинт на паузу и снять с неё, а также ротировать секреты подписи без простоя. Прошу относиться к этому как к боевой инфраструктуре — с внятной документацией и тестами, а не как к прототипу.
— Эндпоинт приёма входящих событий с валидацией и сохранением
— Модель подписок: сопоставление типов событий и эндпоинтов подписчиков
— Подписанные пейлоады с меткой времени, id доставки и защитой от повторов
— Ретраи с экспоненциальным backoff, джиттером и состоянием dead-letter
— Лимиты параллелизма на эндпоинт и обработка идемпотентности
— Журнал доставок с поиском, ручной переотправкой и паузой эндпоинта
— Ротация секретов, документация и автотесты