Какие есть хорошие способы сделать асинхронное веб-приложение на ruby ​​в наши дни? - PullRequest
2 голосов
/ 04 сентября 2011

Я собираюсь создать веб-приложение с компонентом WebSocket и запустить внешний интерфейс на основе стоек. Мой первоначальный план состоял в том, чтобы использовать Camping для внешнего интерфейса, работающий на тонком сервере со стойкой config.ru, выглядящей так:

require 'rack'
require './parts/web-frontend'
require './parts/websocket'

AppStationary = Rack::File.new("./stationary")
run Rack::Cascade.new(AppWebSockets, AppWebPages, AppStationary)

AppWebSockets предоставляется websocket-rack и отлично работает. В отсутствие запроса Upgrade: WebSocket это просто 404, и запрос переходит по каскаду к приложению для кемпинга, AppWebPages.

Становится очевидным, что этому веб-приложению для кемпинга неизбежно требуется доступ к IO, чтобы общаться с базой данных CouchDB с помощью регулярных HTTP-запросов. Существует множество способов выполнения http-запросов, в том числе некоторые асинхронные библиотеки, совместимые с eventmachine. Если я подписываюсь на обратный вызов, стойка возвращается, и страница уже отвечает к тому времени, когда я готов создать ответ. Я хотел бы иметь возможность использовать em-synchrony для получения некоторого параллелизма через волокна Ruby 1.9 - о которых я только что подумал - но не могу найти никакой документации о том, как использовать em-синхронность с Thin .

Я столкнулся с веб-сервером под названием Goliath, который утверждает, что он похож на тонкий, с встроенной поддержкой em-синхронии, но в нем отсутствует утилита командной строки для запуска и тестирования сервера, и, похоже, требуется написать другой вид файл в стойку, что довольно неприятно. Также неясно, будет ли он поддерживать websocket-rack, который в настоящее время определяет только поддержку Thin.

Какие есть хорошие способы избежать блокировки ввода-вывода, в то же время используя знакомые инструменты на основе стоек, такие как кемпинг, и имея доступ к WebSockets?

Ответы [ 3 ]

2 голосов
/ 13 сентября 2011

Что касается Голиафа, Голиаф основан на Thin (я начал с тонкого кода и когда оттуда). Большая часть кода изменилась (например, с использованием http_parser.rb вместо анализатора mongrel), но исходной базой был Thin.

Запуск сервера - это просто выполнение вашего файла .rb. Система такая же, как в Sinatra (я позаимствовал код у Sinatra, чтобы он работал). Вы также можете написать свой собственный сервер, если хотите, в репозитории есть примеры, если вам нужен дополнительный контроль. Мы хотели, чтобы запуск был максимально простым и требовал как можно меньше создаваемых файлов. Итак, запуск файла .rb и использование Бога для запуска / перезапуска серверов работали хорошо.

Тесты, которые вы пишете с помощью RSpec / Test :: Unit и запускаете тестовый файл, как обычно. Тесты для Голиафа запустят реактор и отправят реальные запросы API от ваших модульных тестов (обратите внимание, что это не форк, он использует EM для запуска реактора в том же процессе, что и тесты). Все это упаковано в test_helper, который предоставляет Голиаф.

С Голиафом не существует файла для рэка. Вы запускаете файл .rb напрямую. В приложении Голиафа есть команды использования промежуточного программного обеспечения, встроенные прямо в файл .rb. Для нас в PostRank это был самый простой и понятный способ определения сервера. Все ваши операторы использования (с любыми дополнительными битами, которые они используют) были видны во время работы с файлом, а не с несколькими файлами. Для нас это была победа, ваш пробег может отличаться.

Понятия не имею, сработает ли стойка websocket, но в репозитории есть ветка для отправки поддержки websocket прямо в Голиафа. Некоторое время назад я не смотрел на это (были исправлены некоторые вышестоящие ошибки, которые требовались), но его не должно быть слишком сложно, чтобы его запустить и запустить и, с исправленным вышестоящим, слить в master.

На ваш вопрос о em-synchrony и thin у вас должна быть возможность обернуть блок EM.synchrony {} вокруг вашего кода. Метод синхронизации просто вызывает EM.run и оборачивает ваш блок в новое волокно. Если реактор уже работает, EM просто немедленно выполнит пройденный блок. Пока Тонкий уже запустил реактор, он должен работать нормально.

Обновление: Ветвь веб-сокетов была объединена с основной линией Голиафа, поэтому при работе с HEAD имеется поддержка WebSocket, встроенная непосредственно в Голиаф.

1 голос
/ 04 сентября 2011

Вот пример того, как добавить асинхронную поддержку в Camping: https://gist.github.com/1192720 (см. 65 для кода, который вы должны будете использовать в своем приложении).Может быть, мы должны завернуть его в драгоценный камень или что-то ...

1 голос
/ 04 сентября 2011

Вы смотрели на Крампа - http://cramp.in? Cramp полностью асинхронен и имеет встроенную поддержку веб-сокетов.

...