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,255