Async Ruby Frameworks
@jalkoby
Каждое новое решение -
решает существующую проблему
Рассмотрим модель клиент - сервер
Однако со временем наше приложение может потребовать намного больше одновременных подключений, а их обработка начинает занимать все больше и больше времени
Настало время исследовать проблемы и
оптимизировать bottlenecks
Если Вы столкнулись с ...
- долгими запросами к базе данных
- длительные операции с i/o
- запросами к внешним сервисам
стоит использовать async подход
Если Вы столкнулись с ...
- запросы к базе данных < 100 ms
async подход не решит проблему
Особенности async сервера
Reactor pattern
EventMachine
- em-synchrony решает "callbacks-hell"
- большое количество библиотек и документации
Важно помнить!!!
нельзя блокировать event loop
Но EventMachine всего лишь платформа,
а не полноценный framework
Для обзора решений возьмем Sinatra приложение с одной проблемой
В 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
Богатая экосистема
- DCell - Actor-based distributed objects
- Celluloid::IO - evented sockets for Celluloid actors
Спасибо за внимание
Ваши вопросы