asynchronous applications in ruby. roman gorel
DESCRIPTION
Kiev-rb#2TRANSCRIPT
Асинхронные приложения в руби
Роман Горель
Вебсервер
Приложение
БД
Запрос
Ваше приложение
Вебсервер
Приложение
БД
Запрос
Остальные запросы – в очередь
Фронтэнд-сервер
Приложение
БД
Запрос
Приложение Приложение
Нужно больше инстансов!
Фронтэнд-сервер
Приложение
БД
Приложение
Приложение
Фронтэнд-сервер
Приложение
БД
Приложение
Приложение
Балансер
Сервер 1
Сервер 2
Докупим еще серверов
Синхронная модель
Многопоточность / многопроцессовость
Многопроцессовость
● Параллельное выполнение
● Легко управлять
● Дорогое переключение контекста
● Ресурсоемкость
● Параллельное выполнение
● Легко управлять
Многопоточность
● Потокобезопасность
● GIL
● Параллельное выполнение
● Дешевле переключение контекста
● Меньшее потребление ресурсов
Запрос Поток
Запрос Поток
Запрос Поток
Пул
10k
Очередь
Проблема C10k
Асинхронная модель
Блокировка в синхронной модели
Асинхронные технологии
Reactor pattern
EventMachine
Простой веб-сервер
ab -c 5 -n 10 "http://127.0.0.1:3000/"
EM deferred
Sync vs Deferred
Свои Deferred классы
Спагетти из коллбеков
Файберы приходят на помощь
EM-Synchrony
Немного магии EM-Synchrony
Поддерживаемые клиенты
● Mysql2● Activerecord (via mysql2)● Mongo / Mongoid● Memcached● Redis
Как же применить это к вебу?
Sinatra::Async
Маунтим к рельсам
● Gemfile
● Routes.rb
Проверим асинхронность
Rails controller, sleep(1)
AsyncTest
Почитать
● Илья Григорик - http://www.igvita.com/● Мануал по Twisted
http://krondo.com/?page_id=1327 ● http://everburning.com/news/eventmachine-intro
ductions/