У платежного шлюза произошел сбой длительностью 400 мс. У вас 10 000 клиентов. Каждый из них истекает в одно и то же мгновение, обнаруживает одну и ту же ошибку и входит в один и тот же цикл повтора. Ваша отсрочка составляет 1 с, 2 с, 4 с, поэтому все 10 000 запросов возвращаются...
У платежного шлюза произошел сбой длительностью 400 мс. У вас 10 000 клиентов.
Каждый из них истекает в одно и то же мгновение, обнаруживает одну и ту же ошибку и входит в один и тот же цикл повтора. Ваша отсрочка составляет 1 с, 2 с, 4 с, поэтому все 10 000 запросов возвращаются через t = 1000 мс. Вместе. Шлюз, который только начал восстанавливаться, получает прежнюю нагрузку — одним пакетом — и снова падает.
Вы не добавили повторных попыток, чтобы еще больше усугубить ситуацию. Вы добавили их, потому что так сказано в документах. Но цикл повторов без джиттера не является обработкой ошибок. Это усилитель трафика с задержкой.
Это исправляют три вещи, и они решают разные проблемы: джиттер нарушает корреляцию между клиентами, автоматический выключатель прекращает отправку трафика на что-то уже мертвое, а ключ идемпотентности в первую очередь делает повторные попытки безопасными. Большинство кодовых баз имеют один из трех.
Все, что указано ниже, работает — никаких зависимостей, Node 24+, включая тесты.
Сбои коррелируют, потому что ваши клиенты синхронизированы
Временный сбой — обрыв соединения, 429, 504 от эквайера — не является случайным шумом. Это поражает каждого клиента одновременно, потому что все они используют одну и ту же деградированную зависимость.
Эти клиенты затем вычисляют