Что такое надежность
Что проверяют
Отличаете ли вы надёжность от доступности и умеете ли собирать работающую систему из ненадёжных частей. Сеть рвётся, сторонний сервис отвечает ошибкой, база уходит на переключение, и вопрос в том, становится ли это отказом для пользователя.
Как отвечать
Надёжность это способность системы выполнять свою функцию корректно в заданных условиях в течение заданного времени, включая условия, когда часть компонентов сломана. Доступность это доля времени, когда система отвечает. Система может быть доступной и при этом неверно считать, и с точки зрения надёжности это отказ.
Полезно развести сбой компонента и отказ системы: задача не в том, чтобы ничего не ломалось, а в том, чтобы поломка одного места не выносила целое.
Что называть по существу:
- таймаут на каждый внешний вызов. В популярном клиенте HTTP для Python таймаута по умолчанию нет, и это штатный способ подвесить все воркеры навсегда;
- повторы только для идемпотентных операций, с нарастающей паузой и случайным разбросом, с ограничением числа попыток;
- ключ идемпотентности там, где повтор создаёт сущность или списывает деньги;
- предохранитель и раздельные пулы, чтобы одна медленная зависимость не выела ресурсы всех остальных;
- деградация: отдать кеш или урезанный ответ вместо ошибки;
- очередь с повторной обработкой и отдельным хранилищем неразобранных сообщений.
Проверяется это не верой, а нагрузочными прогонами, тестами на поведение при таймауте зависимости и учениями с отключением компонента.
Где спотыкаются
Путают надёжность с отсутствием багов. Называют красивое число девяток, но не могут сказать, что считается отказом, за какое окно и по чьим часам меряется.
Ставят повторы без идемпотентности и без случайного разброса. В первом случае клиент получает два одинаковых заказа, во втором все клиенты синхронно ломятся в только что поднявшийся сервис и снова его роняют.
Ловят исключение, пишут в лог и идут дальше, называя это обработкой ошибок. Система продолжает работать с потерянными данными, а расхождение находят через неделю по отчётам, когда чинить уже дорого.