По-настоящему надежное программное обеспечение всегда скептически настроено и готово к отказам. Другие системы оно держит на расстоянии, так как слишком тесное взаимодействие может быть небезопасным. Оно не доверяет даже себе устанавливая внутренние барьеры для защиты от сбоев.
2. 2BREST
О докладчике
Dzmitry Nichyparuk
Software Engineering Team Leader
С ЭПАМ с 2010
Экспертиза: Web Applications and Services
Технологии: .NET, JavaScript, NodeJS
Область интересов: Software Architecture
4. 4BREST
Стабильность системы
Отказоустойчивая система продолжает обрабатывать транзакции даже
когда импульсные помехи, постоянная нагрузка или неисправность
отдельных узлов нарушают нормальный процесс обработки транзакций.
Стабильность: компоненты системы не только продолжают работу, но и
дают пользователю возможность закончить работу.
5. 5BREST
Основные опасности для долговечности систем:
• утечки памяти
• рост объемов данных
Как правило не обнаруживается при тестировании.
Долговечность
Долговечная система способна обрабатывать
транзакции долгое время.
Долговечная система
Но как “долго”?
6. 6BREST
К отказу может привести как и внезапные импульсы, так
и чрезмерная нагрузка.
Всегда найдется компонент, который откажет раньше
других и начнет создавать нагрузку на другие элементы
системы.
Нагрузка - катализатор для роста трещин.
• Режим отказа - это фактор, послуживший триггером
дефекта, способ распространения отказа и результат
повреждения.
• Безопасные режимы отказов - ограничители трещин,
защищающие компоненты от выхода из строя
Трещины и режимы отказов
8. 8BREST
• Чем выше нагрузка и чем сложнее интеграционные связи, тем, как правило, выше скорость
распространения трещин (отказов).
• Сильная взаимосвязь может быть
• в коде самого ПО
• в меж-системных вызовах
• в общих ресурсах
• Менее связная архитектура наоборот сработает как амортизатор, уменьшая влияние
ошибки, а не увеличивая его.
• На каждом этапе цепочки отказ можно:
• остановить
• замедлить
• ускорить
Распространение трещин
11. 11BREST
Каждый сетевой канал ставит под угрозу стабильность системы
Проблемы канала связи могу стать проблемой вашего приложения
Точки интеграции
Паттерны
• предохранитель (circuit breaker)
• квитирование (hand shaking)
• связующее ПО
Защита точек интеграции
Тестирование
• Stub-ы, эмулирующие отказы точек интеграции
12. 12BREST
• Передача файла (File transfer)
• Общая база данных (Shared DB)
• Удаленный вызов процедуры (Remote procedure call)
• Обмен сообщениями (Message, BUS)
Возможные схемы интеграции
14. 14BREST
Отказ под нагрузкой
Выход одного сервера из строя ставит под угрозу остальные: вся освободившаяся нагрузка
ложится на их плечи
• Шаблон перегородок
• Предохранитель
Защита
Катализаторы отказа
• Утечки ресурсов
• Скрытые дефекты
16. 16BREST
Каскадные отказы
Каскадный отказ возникает, когда трещина возникая в
одном слое или компоненте вызывает проблемы в
вызывающем слое или компоненте.
Это возможно при наличии механизма перехода
отказа из одного слоя в другой - неправильная
работа в вызываемом слое провоцирует отказы в
вызывающем
Защищайте границы от средств передачи трещин
Используйте паттерны
• предохранитель
• тайм-ауты.
Защита
20. 20BREST
• Держите открытым канал общения с отделом маркетинга.
• Планируйте акции
• Готовьте отдельные экземпляры сервисов под специальные предложения
• Ссылки со специальными предложениями должны вести на специальные “легкие” страницы
• Защищайте общие ресурсы
Хороший маркетинг может “уронить” систему очень быстро
21. 21BREST
• Переход к архитектуре без общего ресурса
• Один процесс выйдя из под контроля при наличии общего ресурса может вывести из игры остальные
экземпляры.
• Замена пессимистических блокировок оптимистическими
• Отдельный фрагмент сети под опасный трафик для случая с неоднородной нагрузкой
• Быстрый отказ - позволит освободить ресурсы для транзакций не связанных с общим ресурсом
Общий ресурс - узкое место
22. 22BREST
Справедлив для отношений
• Многие к одному
• Многие к нескольким
Двух-точечная связь.
• Nсоед = n* (Nузлов^2)
Приемлемость такой скорости роста сложности зависит от
конечного масштаба системы
Альтернативы:
• Очередь сообщений
• Передача сообщений по подписке
• Групповая TCP/UDP рассылка
• Широковещательная рассылка UDP
Эффект масштабирования
24. 24BREST
Несбалансированные мощности
Перегрузка внешней системой Защита
Внутренняя система система
• Шаблон “квитирование” – обратная
связь для внешней системы
• Переборки – резервирование ресурсов
для внутренних операций
Внешняя система
• Шаблон “предохранитель” – снизит
нагрузку на внутреннюю систему
25. 25BREST
Несбалансированные мощности
Тестирование
• Не ограничивайтесь стандартной нагрузкой при тестировании.
– Найдите самую ресурсоемкую операцию, типовую нагрузку и удвойте ее.
• Убедитесь что система ведет себя предсказуемо.
– Устойчивая система замедлит свою работу либо быстро завершит ее, если не сможет выполнить
транзакцию за отведенное время.
– После снятия нагрузки система начнет функционировать в обычном режиме.
– Аварийное завершение, зависшие потоки, бессмысленные ответы показывают, что система не выживет.
• Тестировать стоит оба интерфейса
– внешний сервис, когда внутренний не отвечает
– внутренний сервис, когда нагрузка выше расчетной
27. 27BREST
Причина медленных ответов
• избыточный спрос - нет резерва мощности для обработки входящих запросов
• утечки памяти (GC) - высокая загрузка ЦПУ может быть обусловлена не работой над
транзакциями, а работой сборщика мусора, дефрагментацией памяти.
• Медленное реагирование распространяется вверх - как постепенно нарастающий каскадный
отказ и ответы ведут к росту трафика
– Избавляйтесь от общих ресурсов и узких мест
– Используйте принцип быстрого отказа
Медленная реакция
Медленный ответ намного хуже, чем отказ в соединении или возвращение ошибки!
31. 31BREST
• Не полагайтесь на поставщика, что он вернет ожидаемо ограниченный набор данных. В какой-
то момент этих данных может стать слишком много.
• Огромные наборы данных - причина медленной реакции (долгих ответов)
• Используйте реальные наборы данных при тестировании
Огромные наборы данных
• Ограничение размера ответа в запросе (LIMIT, TOP)
• Прерывание обработки результата, если данных слишком много
Защита приложения
Что произойдет, когда БД неожиданно вернет 1 млн записей, а приложение явно не
ограничивает набор результатов?
34. 34BREST
• при защите от отказов в точках интеграции
• при каскадных отказах
• при несбалансированной производительности
• медленных ответах
Предохранители
Эффективны
Используйте предохранители вместе с таймаутами
• таймауты укажут на проблемы с точкой интеграции
• предохранитель предотвратит обращения к проблемной точке интеграции
Комбинируйте
36. 36BREST
Таймауты
• с шаблоном “предохранитель”
• с шаблоном “быстрый отказ”
Комбинируйте
В случае
• наличия точек интеграции
• блокированных потоков
• медленных ответов
Для восстановления после неожиданных отказов
• Иногда зависшую операцию проще отменить и перезапустить
Эффективны
Позволяют устранить или смягчить влияние трещин на систему
38. 38BREST
Переборки реализуют идею изоляции повреждений.
Применив этот шаблон в системе вы разделите систему на части и не дадите отказу возникшему в
одной ее части, разрушить всю систему.
Наиболее распространенный вид изоляции - физическая избыточность:
• несколько серверов
• несколько приложений
• отдельные фермы для важных задач
• разделение через привязку к процессору или группе процессоров
• разделение пулов потоков
• виртуальные машины
Переборки
39. 39BREST
• Шаблон переборок позволяет распределить вычислительную мощность с целью сохранения
частичной функциональности в случае проблем.
• Определяя границы следует оценить влияние ф-циональных возможностей на бизнес и
рассмотреть эти данные в рамках архитектуры.
• Разбиение системы на группы означает, что каждой отдельной группе нужны резервные
мощности - это больше чем при объединении всех сервисов.
Переборки
41. 41BREST
• Шаблон быстрого отказа повышает общую стабильность системы не допуская медленных
ответов.
• Позволяют поддерживать вычислительную мощность противодействуя пустым расходам
процессорного времени.
Быстрый отказ
Преимущества
• В комплексе с таймаутами быстрые отказы позволяют предотвратить каскадные отказы.
Комбинируйте
43. 43BREST
Квитирование - попытка сервера защитить себя путем регулировки внешней нагрузки.
• Сервер может отказаться от предлагаемой работы, если он испытывает недостаток ресурсов
• Клиент может проверить готовность сервиса принять его запрос через запрос “проверки здоровья”
Квитирование особенно полезно в случаях несбалансированной вычислительной мощности
• Использование предохранителя на клиенте и быстрого отказа или квитирования на сервере
• Использование квитирования на паре клиент-сервер
Квитирование
Квитирование - передача от одного устройства к другому сигнала, удостоверяющего
наличие связи с этим устройством.
Пример: HTTP (503) - Сервис недоступен
45. 45BREST
• СПО позволяет связывать сервисы изначально не предназначенные для совместной работы.
• Хорошо сделанное СПО одновременно интегрирует и разделяет системы.
Связующее ПО
• Лицензии на ПО
• Плата за трафик
СПО влияет на стоимость продукта!
Преимущества
47. 47BREST
• Изучайте внимательно требования.
• Согласовывайте уровень защиты элементов системы.
• Смотрите на все внешние зависимости с недоверием.
• Используйте паттерны стабильности.
• Тестируйте режимы отказов
• Инфраструктурные
• Отказы в точках интеграции или ненадежных внутренних системах
Отказы неизбежны
Интегрировать плохо совместимые между собой системы - это нормально
Выход одного сервера из строя ставит под угрозу остальные: вся освободившаяся нагрузка ложится на их плечи.
Это повышает вероятность следующего сбоя.
Остальные серверы должны иметь защиту. Иначе весь кластер прекратит работу в результате каскадных отказов.
Системные отказы начинаются с одной трещины в некотором компоненте из-за какой-то фундаментальной проблемы.
Трещину можно замедлить или остановить. Но если не принимать мер, то трещина будет распространяться по пути различных структурных проблем
В приведенном примере внешняя система всегда может перегрузить внутреннюю.
Медленный ответ намного хуже, чем отказ в соединении или возвращение ошибки. Особенно в ситуации со службами промежуточного уровня в SOA.
Если медленная обработка транзакции хуже отказа, то медленная реакция на отказ - еще хуже!
Отказы неизбежны. Они будут возникать как в ваших так и в удаленных системах
Антипаттерны стабильности ускоряют и усиливаю эффект от временных событий, ускоряют скорость роста трещин.
Устранение антипаттернов не избавит вас от отказов, но значительно снизит причиняемый ими вред.