200 Заключение
Как сделать надежную ИТ систему:
- Проектирование
- Заложить возможность детектирования сбоев
- Заложить мониторинг внутренних исчерпаемых ресурсов
- Пулы соединений
- Очереди
- Воркеры
- Заложить мониторинг зависимостей
- Найти моменты, где мы можем разменять консистентность на большую доступность
- Кеши
- Определиться нужно ли скалироваться горизонтально (шардироваться) и выбрать, как это будет работать
- Средствами какой-либо БД
- Самим приложением
- Заложить возможность отключать тяжелый функционал, который предоставляет удобство пользователю
- Заложить возможность быстрой починки выключением сбойный участков из балансировки
- Поделить на разные сервисы, то что можно быстро и безопасно рестартовать и то, что нельзя
- Для нагруженных приложений
- Заложить возможность включения дебаг логов для запроса
- Если заботит выполнение каждого запроса
- Сделать все такие операции идемпотентными (возможно с ключом дедупликации)
- Исплользовать "Сагу" с ACID хранилищем для статуса запроса и идемпотентными стадиями
- При проектированиии системы учитывать простоту обучения, логичность и вероятные ошибки, из-за того, что инженер что-то не знал или забыл в моменте
- Надежный код
- Выставить таймауты на всех внешних вызовах
- Рассказать о своих таймаутах в документации
- Понять, где необходимо использовать повторы и реализовать
- Не забыть про бюджеты ретраев
- Уметь автоматически выключать запросы на внешние причины, чтобы не убивать их нагрузкой, если они не отвечают или отвечают с ошибкой
- Убедиться, что правильно пишем ERROR логи (свидетельствуют именно о возникновении нештатной ситуации)
- Добиваемся полного отсутствия ошибок в логгах при штатной работе
- Уделиться, что возвращаем правильные ошибки
- не корректный запрос
- наша внутренняя ошибка
- Ограничиваем максимальное входящее количество запросов (rate-limit)
- Устойчивый клиент
- Добавляем в клиент возможность отобразить сообщение, когда бек не работает (через примитивный CDN)
- Тестируем клиент на то, что он не разваливается при недоступности части API
- Закладываем возможности удаленного администрирования клиента (сброс кешей и т.п.)
- Тестирование
- Тестируем адекватность работы, когда сломались зависимости и восстановление
- Тестируем работу под нагрузкой, кратно превышающей максимальную рассчетную, и восстановление при возвращении к максимальной рассчетной
- Тестируем в продакшен
- CI/CD
- Делаем более безопасные релизы
- Canary и другие методики
- Конфиги и выкладывание новых данных/справочников — тоже релиз
- Делаем более безопасные релизы
- Мониторинг
- Мониторим работу самого функционала
- Используем тестирование в продакшен — проберы
- Система алертирования звонит на телефон
- Дежурные подтверждают прием алерта, в противном случае эскалация на второго дежурного, всю команду, руководство
- Детектирование сбоев
- Реализованы достаточно надежные способы детектирования сбоев, которые не дают false positive/false negative
- Хранится история всех сбоев
- Команда эксплуатации
- Есть специальное обучение для инженеров проекта
- Есть документация по продакшену
- Есть регулярная встреча с обзором всех текущих проблем продакшена
- Процессы
- Проект можно очень быстро зарелизить
- Проект разрабатывается так, что его всегда можно откатить на несколько версий назад (минимум на 3 месяца)
- Откат проекта быстрый
- Есть план восстановления "с нуля" — DRP
- Регулярно проводятся учения
- Виртуальные
- Реальные
- Дежурные реагируют на каждый единичный алерт
- После сбоев делается детальный разбор
- Задачи после разбора сбоев имеют высокий приоритет и сразу берутся в работу
- Разработаны классификации причин и триггеров сбоев, сбои размечаются для сбора статистики
- Избегаем хождения на прод и ручных изменений в нем