← Все новости
Как тестировать распределенные системы: тайм-ауты, дубликаты, Saga и частичные отказы

Как тестировать распределенные системы: тайм-ауты, дубликаты, Saga и частичные отказы

Распределенная система может сломаться так, что по отдельности все ее части будут выглядеть исправными.Представим обычную оплату заказа: сервис отправил запрос платежному провайдеру, тот списал деньги и вернул успешный ответ. На обратном пути соединение оборвалось. Для платежной системы операция завершена, а сервис заказа получил тайм-аут и не знает, произошло списание или нет.Самое очевидное решение — повторить запрос. И получить второе списание.В монолите подобные ситуации встречаются реже: операция обычно проходит внутри одного процесса или одной транзакции, поэтому место сбоя проще определить. В распределенной системе между началом и концом одной бизнес-операции могут быть несколько сервисов, брокер сообщений, разные базы данных и внешний API (интерфейс программирования приложений). У каждого компонента при этом свое состояние и свое представление о том, что уже произошло.Так, проверки «отправили запрос — получили ожидаемый ответ» здесь недостаточно. Интереснее проверить, что будет, если ответ задержится или потеряется, запрос придет повторно, события поменяются местами, а один из сервисов восстановится после нескольких минут простоя.В таких ситуациях проявляются ошибки, которые сложно увидеть на happy path (позитивном сценарии). Ниже разберем, как их воспроизводить и что проверять, чтобы отказ одного компонента не превращался в некорректное состояние всей системы.Почему распределенную систему нельзя тестировать как обычное приложениеВозьмем простой пример — оплату заказа в интернет-магазине. Читать далее