Сравнительный анализ и реализация различных конкурентных паттернов для работы с асинхронным вводом и выводом с использованием Kotlin и библиотеки kotlinx.coroutines
Компания: JetBrains d.o.o. Beograd
Уровень: бакалаврская
Описание предметной области
Проблема C10k, заключающаяся в сложности одновременной обработки сервером большого количества соединений, была обозначена еще в конце 1990-х, но является актуальной и на сегодняшний день. В процессе создания высоконагруженных серверов применялись различные стратегии: от блокирующего подхода до асинхронной работы с серверными сокетами. К примеру, NGINX, разработанный на асинхронной архитектуре, был создан как раз для решения проблемы C10k. Были разработаны и различные конкурентные паттерны, такие как proactor и reactor.
В фреймворке Ktor, для которого и пишется дипломная работа, одной из важных частей является полностью асинхронный движок CIO на основе kotlin корутин, в котором для работы с серверными сокетами используется свой компонент.
Актуальность:
В настоящее время у пользователей Ktor усиливается потребность в написании высоконагруженных серверов, способных обрабатывать множество одновременных соединений. Для того чтобы оставаться конкурентоспособными и улучшать пользовательский опыт, нужно развивать и совершенствовать существующие решения и находить новые способы работы с асинхронным вводом и выводом. К тому же одним из фокусов в Ktor является собственный написанный мультиплатформенный движок CIO, для которого и будет создаваться решение. Kotlin сейчас делает
большой акцент на мультиплатформенную разработку и поэтому официальные библиотеки во главе с Ktor также ставят это одной из главных своих задач. В то же время существует открытый вопрос какой из паттернов наиболее эффективно работает с корутинами.
Цель работы:
Реализация и улучшение компонента библиотеки Ktor для работы с асинхронным вводом и выводом. Планируется улучшение отзывчивости серверных приложений, сокращение времени ожидания ответов от сервера и обеспечение высокой производительности в условиях интенсивного ввода-вывода.
Что следует сделать:
- Реализовать сервера с различными паттернами для работы с асинхронным вводом и выводом: блокирующие, неблокирующие, асинхронные
- Разработать несколько сценариев работы клиента и сервера: один клиент и один сервер, 1000 клиентов и один сервер
- Измерить характеристики (пропускная способность, время отклика) серверов в сценариях работы
- Оценить проблемные места и сравнить паттерны используемые в серверах
- Внедрить итоговый паттерн в модуль Ktor
Ожидаемые результаты: внедренный в модуль Ktor компонент для работы с асинхронным вводом и выводом с использованием kotlin корутин
Способ верификации результатов:
Нагрузочное тестирование и сравнительный анализ метрик, таких как пропускная способность и время отклика, после реализации каждого паттерна, с учетом различных сценариев клиент-серверного взаимодействия
Источники:
C10k problem http://www.kegel.com/c10k.html
Reactor https://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf
Ktor https://ktor.io/
Comparing Two High-Performance I/O Design Patterns https://www.artima.com/articles/comparing-two-high-performance-io-design-patterns
Wrk https://github.com/wg/wrk
kotlinx.coroutines https://github.com/Kotlin/kotlinx.coroutines
Kotlin https://kotlinlang.org/