Архитектура: про что мы забываем?

Дмитрий Масленников

Руководитель центра надежности ИС Т-Банк

Архитектура — совокупность важнейших решений об организации программной системы

Архитектура должна быть понятной

Архитектуре придется обучать

Логи

Логи используются:

  • в триггерах алертов
  • для ML
  • в аналитике
Логи следует не только структурировать, но относится к ним, как к API
  • обратная совместимость
  • версионирование
  • документирование
  • тестирование

При тестировании логов:

  • тестируем логгирование во время сбоев
  • тестируем объемы порождаемых логов
Возможно необходимо семплирование логов!
Семплировать лучше совместно логи одного запроса

Метрики

RED: входящие и исходящие
USE — для всего, что может заканчиваться
  • очереди
  • воркеры
  • подключения

Статус приложения:

  • состояние выключателей
  • режим работы
  • статус зависимостей

Очереди

Могут быть добавлены фреймворком или рантаймом языка программирования
Что будет если очередь переполнится?
Поведение переполнения очереди надо знать и проектировать
Очереди имеют свойство накапливаться при сбоях

Необходимо:

  • Ограничить размер
  • Уметь сбрасывать
  • Ограничивать время жизни
Очереди часто не нужны
Иногда очередь можно заменить на стек

Редко исползуемый функционал

Скорее всего он уже сломан!
  • Встраиваем в работу
  • Непрерывно тестируем в приложении

Сообщения об ошибках

Часто вообще не об ошибках!

Различаем:

  • некорректные запросы
  • получение ошибок от другого сервиса
  • ожидаемые некорректное состояние сервиса
  • неожиданное состояние сервиса

Фронтенд

(это не UI, а торчащий наружу бекенд)

Фронтенд может:

  • помогать собирать пострадавших от сбоев пользователей
  • задавть глобальный таймаут
  • управлять глобальным семплированием логов

Микросервисы

Минусы

  • Дольше обрабатывается запрос
  • Сетевой вызов ненадежен
  • Надо реализовывать логику повторов
  • Нужна идемпотентность
  • Тратится много ресурсов на сериализацию/десериализацию
  • Надо заботиться над версионированием и совместимостью версий
  • Дополнительное логгирование
  • Дополнительные метрики
  • Нет удобных инструментов рефакторинга, как для локальных вызовов
  • Сложнее отладка
  • Сложнее эксплуатация (особенно устранение сбоев)
  • Сложнее задокументировать и рассказать архитектуру

Плюсы

  • Можно задействовать больше ресурсов на один вызов
  • Позволяет сделать разное время жизни для разного функционала (неодновременные релизы)
  • Изоляция критических ошибок
  • Изоляция ресурсов
Плюсы должны перевешивать минусы

Репиты

Не забыть:

  • Настроить таймауты
  • Рандомизированый сдвиг
  • Экспоненциальное затухание
  • Выключатели
  • Мониторинг
  • Не повторять то, что уже затаймаутилось

Время запуска

Время запуска — важный параметр!

  • Тестируем время запуска
  • Откатываем релиз, если время запуска сильно увеличилось
Приложение должно быть способно стартовать без зависимостей!

Откат на предыдущую версию

Должен быть возможна всегда!
Миграцию данных можно сделать в приложении
Время, за которое возможен откат версии, нужно контролировать
Если нарушается — достаточная проблема, чтобы не релизиться

Модификаторы запроса

  • Идентификатор запроса
  • Идентификатор вызывающей системы
  • Желаемый уровень логгирования для данного запроса
  • Таймаут для данного запроса

Работа под нагрузкой

QPS лимит

Что будет происходить при привышении?

Тестирование работы под нагрузкой

  • Тестируем под нагрузкой многократно превышающей расчетную
  • Тестируем восстановление под рассчетной нагрузкой

CAP/PACELC

Для ускорения работы используйте по максимому отказ от консистентности
Клиент — часть распределенной системы

Спасибо!

Вопросы?