Software Craftsmanship
meetup #12 online
Highload Systems
Павел Вейник
CTO @ Leverice
CEO @ Hard & Soft Skills
Мы сегодня online
●Зарегистрировались 233
человека
●Наш второй митап online
●При поддержке Sam Solutions
●Информационный партнер
dev.by
Цель митапов
● Опробовать материал для курса
“Технический лидер”
○ hardsoftskills.by/techlead.html
● Отладить материал для курса
“Тимлид”
○ hardsoftskills.by/teamlead.html
План митапов
11. Мотивация и эффективность
разработчика
12. Highload системы
13. ? Многопоточные вычисления
14. ? Масштабирование монолита
15. ? Шаблоны, DDD... https://bit.ly/3cFSBAB
Что интересует вас по HL
● Что такое HL
● Мониторинг
● Тестирование
● ms vs no ms
● балансировка
● восстановление
● security
● elixir/erlang
● взаимодействие
ms
● обработка
ошибок
● просчет нагрузки
● архитектура SaaS
План этого митапа
1.Что такое highload
2.Приемы оптимизации
3.Алгоритм проектирования
4.Примеры
5.startup vs service company
Что такое highload?
● Когда ваше железо перестает
справляться с нагрузкой
● В проекте есть большие
цифры: одновременные
пользователи, запросы в сек...
Характеристики highload
● Небольшая ошибка влечет
большое влияние на бизнес
из-за технической сложности
(эффект домино)
Характеристики highload
● Вам приходится использовать
горизонтальное
масштабирование и
сопутствующие шаблоны
проектирования
Характеристики highload
● Вы не можете принимать
“приблизительные”
технические решения
○ нужен мониторинг, логи...
Характеристики highload
● Чтобы выполнить задачу
бизнеса, вы используете
очереди сообщений,
потоковую обработку данных,
ферму серверов,
балансировщики...
Что такое highload?
● Нет жесткого и четкого
определения
● Одной машины уже не
хватает
Обрабатываем нагрузку
● Способы обработать больше
нагрузки (запросов, данных...)
○ увеличить throughput одного
сервера
○ добавить больше серверов
Как увеличить throughput?
1.Профайлинг
○ Устранение узких мест
○ Никогда не оптимизируйте
заранее
Как увеличить throughput?
2. Non-blocking IO
3. Async IO
4. Один поток обрабатывает
много запросов
5. Избыточность в бд
Как увеличить throughput?
6. Кэши данных
7. Пулы объектов
8. Многопоточность
9. Пакетная обработка
10. Фоновые задачи
Как увеличить throughput?
11. Запланированные задачи
12. Меньше запросов
13. Специализированные
структуры данных
14. Специализированные
алгоритмы
Как увеличить throughput?
● и еще много оптимизаций:
○ Вставки на assembler
○ Использование
низкоуровневых
особенностей
платформы/ОС...
Больше серверов
● Как распределять
задачи/данные между
несколькими серверами?
Больше серверов
1.Микросервисы и их
взаимодействие (meetup #5)
○ хореография
○ оркестрация
Больше серверов
2. Горизонтальное
масштабирование
○ Одна задача/ms - много
серверов
○ Балансировщик или
очередь задач
Больше серверов
3. Отложенные вычисления
○ Тяжелые операции выносим
через очередь на отдельные
машины
Больше серверов
4. Толстый клиент (для web)
● переносим вычисления с
сервера в клиент
Больше серверов
5. Асинхронная обработка
● сразу отдавать не ответ, а
уведомление о приеме
задачи на обработку
● использовать callback
Больше серверов
6. Кэширование
● ответов
● данных
● на разных уровнях
Больше серверов
7. Функциональное разделение
● один ms/сервер/кластер -
одна независимая задача
Больше серверов
8. Шардирование и
партиционирование баз
данных
● meetup #7
Больше серверов
9. Реплицирование
● копии данных для обработки
большего количества
запрос, для хранения…
● 1 w реплика, много r реплик
Больше серверов
9. Денормализация и
избыточность в бд
● ускоряет запросы на чтение
Больше серверов
10. Очереди сообщений
● meetup #4
● TODО
Больше серверов
11. Потоковая обработка
данных
● TODО
throughput одного сервера
+
много серверов
=
highload система
Приемы
Throughput
● 14+ приемов
Больше серверов
● 11+ приемов
Алгоритм проектирования
1.бизнес-логика
2.цифры
3.SLA
4.схема движения данных
5.схема хранения данных
6.поломать то что получилось
Пример 1: RTB
клиент для участия в RTB
аукционах
● UI + конф: PHP Laravel + Mysql
● stats: CLickhouse
● load: одинаковые java
приложения (5-8k msg/s)
Пример 1: RTB
load:
● любое число серверов
○ точка отказа, deploy
● распределение задач
синхронизация через бд
Принципы
1. независимость
микросервисов
2. отсутствие точек отказа
3. гомогенность узлов
4. взаимозаменяемость узлов
Принципы
5. учитывать цифры
● система мониторинга
● система логирования
6. не делать предварительные
оптимизации
Принципы
7. учитывать особенности
предметной области
8. учитывать особенности
выбранных инструментов
Пример 2: поисковик
поисковик: solr,
распределенный из коробки
crawler: самописный,
распределение задач через 1
управляющий сервер, любое
число краулер-серверов
Опасности
1. преждевременная
оптимизация
2. использование
непроверенных инструментов
Опасности
3. использование
инструментов, незнакомых
команде
4. использование инструментов
с большим порогом вхождения
Опасности
5. overengineering - не плодите
сущности в архитектуре, если
только не знаете точно для чего
Пример 3: чат
клиент: web, mobile, native
бэкенд: около 10 ms, передача
через kafka topics, хранение в
kafka stores, обработка kafka
streams
Highload в стартапе
1.нехватка ресурсов
2.проверяем на проде
3.всегда близки к краху
4.разработка нервничает
5.нет всей информации
6.эволюционное развитие
HL в сервисном проекте
1.фиксированные? ресурсы
2.есть ресурсы на тестирование
3.риски на стороне заказчика
4.есть больше информации для
решений (как правило)
5.развитие придумал-сделал
Тестирование HL
характеристики ответа
● avg, peak response time
● % ошибок
характеристики нагрузки
● req/s, одновременные
пользователи, throughput
Тестирование HL
Load testing
● выдержит ли заданную в SLA
нагрузку?
Тестирование HL
Stress testing
● а какую вообще нагрузку
выдержит?
Тестирование HL
Endurance testing
● а сколько времени сможет
выдерживать заданную в SLA
нагрузку?
Мониторинг
Что мониторить
● server health как обычно
● метрики уровня архитектуры
● бизнес-метрики
● meetup #9
Уровень архитектуры
метрики для любого элемета
архитектуры
● ms req/s, время ответа
● queues size
● producer, consumer msg/s
● cache stats
● db reads/writes and other
● ...
Уровень архитектуры
Метрики для любого элемета
архитектуры
● ms req/s, время ответа
● queues size
● producer, consumer msg/s
● cache stats
● db reads/writes and other
● ...
Курс “Технический лидер”
● Цель митапов - материал для
курса “Технический лидер”
● Для кого: мидлы, сеньеры, лиды,
архитекторы, CTO
● программа готова
○ hardsoftskills.by/techlead.html
Ссылки
что такое highload
● http://allyouneedisbackend.com/blog/2017/08/30/what-is-highload/
● https://ruhighload.com/%D0%A7%D1%82%D0%BE+%D1%82%D0%B0%D0%BA%D0%BE%D0%B5+highload
● http://www.kegel.com/c10k.html
● https://www.youtube.com/watch?v=2FjdOWOuZjQ
● http://highload.guide/blog/highload-for-beginners.html
чуть глубже в детали
● https://medium.com/@copyconstruct/nonblocking-i-o-99948ad7c957
● https://en.wikipedia.org/wiki/Asynchronous_I/O
● https://en.wikipedia.org/wiki/Program_optimization
● http://www.azillionmonkeys.com/qed/optimize.html
тестирование
● https://www.guru99.com/load-testing-tutorial.html
● https://medium.com/better-practices/dont-get-techcrunched-performance-testing-for-your-http-apis-3196e40f6b70
● https://medium.com/edureka/load-testing-using-jmeter-3da837c11a02
● https://loadstorm.com/load-testing-metrics/
● https://www.guru99.com/endurance-testing.html
● https://www.loadview-testing.com/load-testing-vs-stress-testing/
Ссылки
оптимизация одного сервера
● https://en.wikipedia.org/wiki/Category:Software_optimization
оптимизация распределенного приложения
● https://conf.ontico.ru/users/videos.html
● https://ruhighload.com/
● https://studylib.ru/doc/6221865/highload-book-for-beginners
● https://highloadcup.ru/ru/main/
книга
● https://www.amazon.com/gp/product/1680502395

Software craftsmanship 12 online highload systems