Введение 3
1. Подходы и инструменты, используемые при реализации
высоконагруженных приложений 4
1.1. Обзор существующих подходов для реализации
высоконагруженных приложений 4
1.2. Использование технологий контейнеризации и оркестровки
контейнеров в высоконагруженных проектах 8
1.3. Возможные методы оптимизации при проектировании
backend’a web приложения 9
2. Используемые оптимизации 13
2.1. Оптимизация парсера http запросов 13
2.2. Возможности Linux, используемые для реализации
асинхронного ввода/вывода 14
2.3. Описание реализации итоговой программы 16
3. Сравнительный анализ и тестирование 19
3.1. Обзор фреймворков, решающих ту же задачу 19
3.2. Сравнение производительности описанных подходов 20
Заключение 26
Список использованных источников 27
Использованные определения 28
Приложения
С ростом числа пользователей, которые используют тот или иной сервис, растет и нагрузка на сервера, которые этих пользователей обслуживают. Так как число потоков на компьютере конечно, возникает ситуация, когда компьютер перестает справляться с запросами пользователей за разумное время. Такую ситуацию называют высокой нагрузкой.
Термином «высоконагруженные системы» называют те системы, которые призваны справляться с высокой нагрузкой.
С термином «высокая нагрузка» тесно связан термин «высокая доступность», который налагает на такие системы некоторые обязательства.
Высокая доступность зачастую оценивается такой характеристикой, как uptime (процент времени, который система была доступна). Очевидно, что чем выше uptime, тем лучше система удовлетворяет свойству высокой доступности.
Цель работы - разобраться в подходах к оптимизации систем под высокую нагрузку, абстрагируясь при этом от способов обеспечения их надежности, и написать сервис, который способен обрабатывать 10 тысяч запросов в секунду на машине с 2гб RAM, 4 ядрами и 5гб HDD.
В современных реалиях высоконагруженные системы встречаются повсеместно. Аренда кластеров, которые их обслуживают, стоит очень дорого. Библиотека, разработанная в контексте этой работы, позволит уменьшить количество серверов бэкэнда и тем самым сэкономить деньги. Поэтому эта работа, действительно, актуальна.
Задачи работы:
1. Исследовать подходы и инструменты, используемые при реализации высоконагруженных приложений.
2. Оптимизировать процесс чтения и записи запроса.
3. Провести анализ и тестирование результатов.
В процессе работы были рассмотрены различные подходы к построению высоконагруженных приложений. Были разработаны несколько приложений, отражающих эти подходы. Кроме этого, была разработанная собственная библиотека асинхронного ввода/вывода для операционной системы linux, которая использует ее системные вызовы.
Разработанная библиотека содержит множество микро-оптимизаций, таких как уменьшение числа аллокаций, десериализация запросов на месте, эффективный параллелизм без синхронизации на получение запроса.
Вышеперечисленные оптимизации позволили существенно увеличить производительность ввода/вывода приложения. Сравнительный анализ разработанной библиотеки с аналогами показал превосходство библиотеки примерно в полтора раза.
К минусам библиотеки можно отнести нестабильную работу (99% запросов обрабатываются корректно, но 1% запросов теряются. Это связано с тем, что библиотека способна обрабатывать одновременно фиксированное количество соединений, остальные соединения будут просто сбрасываться. Решением этой проблемы является выставление более большого числа соединений в настройках библиотеки, однако это потребует большего расхода памяти. Несмотря на это, подобный подход оправдан, так как лишние аллокации для создания нового соединения при большом количестве соединений могут существенно снизить производительность.
Таким образом разработанная библиотека, может быть использована в реальных проектах при некоторых ограничениях. В дальнейшем планируется улучшить переносимость библиотеки, а именно, сделать биндинги под windows и freebsd и улучшить стабильность работы, добавлением дополнительной очереди соединений.
1. Contreras M.C. Go design patterns / M. C. Contreras, Packt Publishing,
2017. — 402 c.
2. Fowler M. Patterns of Enterprise Application Architecture / M. Fowler, Addison-Wesley Professional, 2011. — 560 c.
3. Kozyra N. Mastering Concurrency in Go / N. Kozyra, Packt Publishing, 2014. — 328 c.
4. Love R. Linux Kernel Development / R. Love, Pearson Education, 2013. — 440 c.
5. Meyers S. Effective Modern C++ / S. Meyers, O’Reilly Media, 2014. — 314 c.
6. Chapter 32. Boost.Asio [Электронный ресурс] / https://theboostcpplibraries.com - The Boost C++ Libraries — Режим доступа: https://theboostcpplibraries.com/boost.asio
Дата обращения: 21.01.2019.
7. epoll(7) - Linux manual page [Электронный ресурс] / http://man7.org — Linux manual page — Режим доступа: http://man7.org/linux/man- pages/man7/epoll.7.html
Дата обращения: 13.12.2018.