Async Ruby Frameworks
@jalkoby
Каждое новое решение -
решает существующую проблему
Рассмотрим модель клиент - сервер
Однако со временем наше приложение может потребовать намного больше одновременных подключений, а их обработка начинает занимать все больше и больше времени
Настало время исследовать проблемы и
оптимизировать bottlenecks
Если Вы столкнулись с ...
- долгими запросами к базе данных
- длительные операции с i/o
- запросами к внешним сервисам
стоит использовать async подход
Если Вы столкнулись с ...
- долгими вычислениями
- запросы к базе данных < 100 ms
async подход не решит проблему
Особенности async сервера
Reactor pattern
EventMachine
- использование fibers
- em-synchrony решает "callbacks-hell"
- большое количество библиотек и документации
Важно помнить!!!
нельзя блокировать event loop
Но EventMachine всего лишь платформа,
а не полноценный framework
Для обзора решений возьмем Sinatra приложение с одной проблемой
Goliath
https://github.com/sergeyp-presentations/lviv_rug_5/tree/goliath
- поддержка Rack api, middleware и плагинов
- встроенные проверки формата запросов и задание значений по-умолчанию
- аналог rails console
- встроенный генератор распространенных форматов (html, xml, json)
Helmet
https://github.com/sergeyp-presentations/lviv_rug_5/tree/helmet
- надстройка поверх Goliath c Sinatra подобным синтаксисом
- поддержка sessions & params из коробки
- кеширование templates
- поддержка helpers
Sinatra Synchrony
https://github.com/sergeyp-presentations/lviv_rug_5/tree/sinatra-synchrony
- полноценная Sinatra
- минимальные изменение в существующем коде
- более высокое быстродействие за счет использования Thin сервера
One more thing
В 2012 году ruby сообщество стало активно
говорить об двух продуктах
Erlang & Sidekiq
Причин интересоваться данными технологиями было несколько. Одной из которой была
Actor Model
Особенности Actor Model
- отдельный легковесный процесс
- no share state с другими actors
- общение происходит по средствам отправки async сообщений
Erlang имеет встроенную поддержку актеров
Sidekiq использует библиотеку Celluloid
Celluloid
By combining concurrency with object oriented programming, Celluloid frees you up from worry about where to use threads and locks
It allows you to model concurrent (i.e. thread-backed) actors in a system but still interact with them as if they were plain old Ruby objects
Celluloid-based class
Возможности Celluloid
- Automatic "deadlock-free" synchronization
- Futures
- Supervisors
- Pools
- Registry
Богатая экосистема
- DCell - Actor-based distributed objects
- Celluloid::IO - evented sockets for Celluloid actors
- Reel & Lattice
Вернемся к нашей проблеме и решим ее снова
https://github.com/sergeyp-presentations/lviv_rug_5/tree/celluloid
Спасибо за внимание
Ваши вопросы
Async Ruby Frameworks
By Sergey Pchelincev
Async Ruby Frameworks
- 2,373