Лекции Технополиса. Проектирование высоконагруженных систем (осень 2017).

Tags: читательский дневник, высоконагруженные системы, конспект, спойлеры

Статья на хабре

Лекция #2. HIGHLOAD. Типовые архитектуры | Технострим

Докладчик проходится по следующим темам построения архитектуры бэкенда: - развитие от толстых клиентов (приложение) в тонкие (web) и обратно в толстые (web) - ресурсы серверов, способы оптимизации одного ресурса за счет другого - переход от вертикального масштабирования серверов к горизонтальному, как распределить бэкенд при горизонтальном масштабировании - работа с централизованной БД и переход к распределенным БД - ACID, CAP, проблемы кешей - очереди - микросервисная архитектура

Перечислены плюсы, минусы и стоимость перехода на более сложную архитектуру, описаны типовые проблемы обеспечения консистентности и их решения.

Доклад хорошо воспринимается на скорости х1,5

Далее вольный конспект.


Сравнение архитектур

Толстый клиент Тонкий клиент(web) Толстый клиент(web)
Трафик + - +
Задержки + -
Кэширование + - +
Постоянное соединение + - +
Пуши + - +
Работа в оффлайн + - +
Сервер без состояния + - -
Обновление - + +
Совместимость API - + +
Консистентность состояния - + +
Локализация - + +
Эксперименты - + +
Скорость разработки + +
Проблемы производительности (при росте продукта):

Нужно уметь считать потребление основных ресурсов сервера: память, процессор, диск, сеть и понимать, что один ресурс можно менять на другой.

Нужно понимать сколько пользователей вашего сервиса поместится в память (актуально для демонов с БД в памяти), за счет применения других структур данных можно сократить потребление памяти за счет потребления процессора. Память работает не так быстро, как процессор, за счет больших вычислений и меньшего обращения к памяти - можно повысить утилизацию процессора.

У процессора можно определить процент полезной работы вашего кода от системного времени ОС(system) и времени ожидания IO (iowait). Возможно, стоит ускорить работу за счет тюнинга/настройки ОС, либо определить что алгоритм не оптимально обращается к системе (слишком много ждет).

Так как гигагерцы уже так сильно не растут, следует уделять внимание многопоточному программированию.

Стоит учитывать возможные объемы дискового пространства сервера, латентность доступа к диску и количество операций/байт с диском.

У сети тоже нужно знать латентность и объем доступной полосы пропускания, в ДЦ она на порядок ниже, чем доступ к диску. Также не стоит забывать о возможном лимите на количество сетевых пакетов, т.к. это нагружает сетевой стек.

Оптимизации утилизации ресурсов. Можно обменивать в разные стороны:
Разделение бэкенда:
Проблема отказов. Если сервер, при выполнении запроса клиента возвращает ошибку, что показывать клиенту?
Оптимизации работы с СУБД:
Проблемы распределенных БД:
Проблемы кэширования:
Очереди.

Фишки: - cпособ хранения: память, диск, распределенные - гарантии доставки - queue/Topic. Можно читать по событию из очереди, а можно подписываться на события - отложенная доставка - протухание. Иногда необработанные события теряют свою актуальность - пакетная обработка. Сбор пачки событий для более производительной обработки

Проблемы: - не избавляет нас от проблем атомарности в распределенных системах: если агент обработки очереди сделал запись в БД и БД отпала - непонятно обработалась ли запись в очереди. Все аналогично с проблемой отказов - требуется мониторить очередь, отследить ее переполнение и ситуации, когда обработка очереди не поспевает за новыми запросами (есть хорошая лекция по поводу проблем очередей https://www.youtube.com/watch?v=CvT1v7xiRS0)

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

Фишки: - масштабирование - простота разработки: быстрая компиляция и запуск, меньше связанность, проще тестирование, гибкий цикл релизов - простота развертывания - изоляция отказов

Минусы: - производительность - сложность разработки: удаленные вызовы, discovery, сложная отладка - сложность развертывания - больше точек отказа

Боль: - конфигурация - сбор логов - сбор статистики - мониторинг

Выводы: