Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KharkivJS 2015: Надежные системы из ненадежных компонент

KharkivJS 2015: Надежные системы из ненадежных компонент

Техники и подходы к написанию надежных систем из ненадежных компонентов на JavaScript (и в целом)

Max Klymyshyn

November 07, 2015
Tweet

More Decks by Max Klymyshyn

Other Decks in Programming

Transcript

  1. Сегодня поговорим о Тема ‣ Системной дизайне ‣ Архитектуре приложений

    ‣ Разработке ‣ Компонентах, ненадежных и надежных
  2. Системный дизайн Определения Системный дизайн – это определения архитектуры, компонент,

    модулей, интерфейсов, данных и хранилищ, которые удовлетворяют определенные требования
  3. Производительность Определения Производительность системы – это количество полезной работы, достигнутой

    компьютерной системой или множеством систем в сравнении с потраченным временем и использованными ресурсами
  4. Архитектура ‣ Без параметров нет корреляции архитектуры с производительностью ‣

    Производительность системы не коррелирует с поддерживаемостью системы
  5. Легко vs Просто Разработка ‣ Просто – одна роль, концепция,

    измерение. Линейная сложность ‣ Легко – удобно, нетрудно. Легко в сравнении с чем-то
  6. Легко Разработка ‣ Быстро стартуем ‣ Первый прототип ‣ Быстро

    ‣ Проходит время, новые требования ‣ Долго переписываем прототип в что-то работающее с новыми требованиями
  7. Что такое код? Разработка ‣ Код – это проекция ментальной

    модели автора о требованиях, записанной в виде соотв. конструкций ‣ Поддерживаемость – это средняя скорость проекции конструкций языка в ментальную модель требований + дополнение кода новыми требованиями
  8. Проблемы Разработка ‣ Проекция ментальной модели ограничена способностями конкретного инженера

    одновременно удержать количество сущностей и связей между ними ‣ Легко упустить детали требований, если логика размазана (scattering) ‣ Легко упустить детали, если много сущностей связаны между собой (coupling)
  9. Проблема Надежность Поскольку количество вариантов произвольных данных на входе и

    выходе требуют слишком много времени для тестирования, невозможно их исчерпывающе протестировать.
  10. Справляемся с ошибками Надежность Но если компонент ненадежный… нужно изолировать

    отлов ошибок, уметь их понимать и реагировать соответственно.
  11. В теории Подходы к решению Браузер – закрытая система до

    тех пор, пока мы не подключим: ‣ ajax requests ‣ web sockets ‣ web-workers
  12. Архитектурно Подходы к решению ‣ Унифицировать data flow ‣ Контролировать

    пропускную способность ‣ Валидировать input с помощью соотв. средств (Robustness principles) ‣ Описать состояние приложения в явном виде
  13. Подходы к решению ‣ Унифицировать обработку ошибок до поэлементной и

    реализовать протокол реакции системы на ошибки ‣ Коды ошибок (выполнил/не выполнил) ‣ Реализовать техники повторной обработки: ‣ Retry ‣ Backoff (напр. exponential backoff) ‣ Redundancy
  14. Для разработки надежной системы нужно Выводы ‣ Писать поддерживаемый код

    ‣ Унифицированная обработка ошибок ‣ Протокол реакции на ошибки ‣ Контроль скорости входящего потока ‣ Валидация данных на входе
  15. Производительность Выводы ‣ Производительность можно оценить ‣ Для оценки нужны

    параметры – какая цель, что мы хотим обрабатывать и с какой скоростью ‣ Пример: ‣ Какой будет λ на входе в конкретном канале? ‣ Какой μ обработки потока? ‣ Что будет, если увеличить λ в 10 раз?
  16. COMPONENT VER#2 RATE CHECK VALIDATION OUTPUT DATA SOURCE PAYLOAD ERRORS

    DISPATCHER COMPONENT VER#1 REDUNDANCY Архитектура надежного компонента