这些天在ruby上制作异步Web应用程序有哪些好方法?

时间:2011-09-04 02:56:27

标签: ruby rack thin eventmachine camping

我正在寻找一个带有WebSocket组件的webapp,以及一个基于磨机架的前端运行。我最初的计划是使用Camping作为前端,运行瘦服务器,机架config.ru看起来像这样:

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

AppStationary = Rack::File.new("./stationary")
run Rack::Cascade.new(AppWebSockets, AppWebPages, AppStationary)
websocket-rack提供了

AppWebSockets,效果很好。在没有Upgrade: WebSocket请求的情况下,它只是404并且请求沿着级联运行到野营应用程序AppWebPages

很明显,这个野营webapp不可避免地需要访问IO,使用常规的http请求与CouchDB数据库通信。有很多方法可以执行http请求,包括一些与eventmachine兼容的异步库。如果我订阅了回调,则机架会返回,并且在我准备创建响应时页面已经响应。我希望能够使用em-synchrony通过Ruby 1.9的Fibers获得一些并发性 - 我只是刚刚开始 - 但是找不到任何关于如何利用与em同步的文档

我遇到了一个名为Goliath的网络服务器,它声称类似于瘦,同时支持em-synchrony支持,但它缺少一个命令行实用程序来启动和测试服务器,似乎要求我写一个不同的类型提交到一个机架,这是非常令人反感的。目前还不清楚它是否甚至支持websocket-rack,它只指定对Thin的支持。

在使用熟悉的基于机架的工具(如露营)和访问WebSockets时,有哪些避免阻止IO的好方法?

3 个答案:

答案 0 :(得分:2)

关于Goliath,Goliath基于Thin(我从薄的代码开始,从那里开始)。许多代码已经改变(例如使用http_parser.rb而不是mongrel解析器),但原始基础是Thin。

启动服务器只是执行.rb文件的问题。该系统与Sinatra使用的系统相同(我借用了Sinatra的代码使其工作)。如果需要,您也可以编写自己的服务器,如果需要额外的控制,repo中有示例。对我们来说,我们希望启动尽可能简单,并且要求尽可能少地创建文件。因此,启动.rb文件并使用God启动/重启服务器效果很好。

测试您使用RSpec / Test :: Unit编写并像往常一样运行测试文件。 Goliath的测试将激活反应堆并从单元测试向API发送实际请求(注意,这不是分叉,它使用EM在与测试相同的过程中运行反应器)。所有这些都包含在goliath提供的test_helper中。

没有Goliath的机架文件。您直接运行.rb文件。 Goliath应用程序将中间件使用命令直接烘焙到.rb文件中。对于PostRank中的我们来说,这是定义服务器最简单,最清晰的方法。当您处理文件而不是拥有多个文件时,您可以看到所有使用语句(使用它们的任何额外位)。对我们来说,这是一场胜利,你的里程可能会有所不同。

我不知道websocket-rack是否会起作用,但是在回购中有一个分支用于直接向Goliath烘烤websocket支持。我有一段时间没有看过它(有一些上游错误已得到修复,但是它不应该太难以启动并运行,并且上游已修复,并合并为master。

关于em-synchrony和thin的问题,您应该能够在代码周围包装一个EM.synchrony {}块。 synchrony方法只需调用EM.run并将块包装在新光纤中。如果反应堆已在运行,EM将立即执行传递的块。只要Thin已经启动了反应器,这应该可以正常工作。

更新:websockets分支已合并到Goliath主线中,因此如果您从HEAD运行,则会直接向Goliath提供WebSocket支持。

答案 1 :(得分:1)

你看过Cramp - http://cramp.in吗? Cramp是完全异步的,并且内置了websockets支持。

答案 2 :(得分:1)

以下是如何向Camping添加异步支持的示例:https://gist.github.com/1192720(有关您在应用中必须使用的代码,请参阅65)。也许我们应该用宝石或其他东西把它包起来......