我希望建立一个具有WebSocket组件的and应用程序,并基于前端的磨机机架运行。我最初的计划是使用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。
很明显,这个露营webapp不可避免地需要访问IO,以便使用常规的http请求与CouchDB数据库进行对话。有很多方法可以做http请求,包括一些与eventmachine兼容的异步库。如果我订阅了一个回调,当我准备创建一个响应时,rack返回,页面已经响应了。我希望能够使用em-synchrony通过Ruby1.9的Fibers来获得一些并发性--我才刚刚接触到这个东西--但是找不到任何关于如何在Thin中使用em-synchrony的文档。
我遇到过一个名为Goliath的the服务器,它号称类似于瘦服务器,内置了em-synchrony支持,但它缺少启动和测试服务器的命令行工具,而且似乎需要我将不同类型的文件写入rackup,这非常令人反感。目前还不清楚它是否会支持websocket-rack,后者目前只指定了对Thin的支持。
有哪些好方法可以避免阻塞IO,同时仍然使用熟悉的基于机架的工具,如露营和访问WebSockets?
发布于 2011-09-04 19:46:08
这里有一个如何向Camping:https://gist.github.com/1192720添加异步支持的示例(请参阅65获取您的应用程序中必须使用的代码)。也许我们应该把它包在宝石或者…里
发布于 2011-09-13 12:47:58
关于Goliath,Goliath是基于Thin的(我是从thin代码开始的,以及何时从那里开始)。很多代码已经改变(例如,使用http_parser.rb而不是混合解析器),但最初的基础很薄。
启动服务器只需执行.rb文件即可。该系统与Sinatra使用的系统相同(我借用了Sinatra的代码以使其工作)。如果你愿意,你也可以编写你自己的服务器,如果你需要额外的控制,在repo中有一些例子。对我们来说,我们希望启动尽可能简单,并且需要创建尽可能少的文件。因此,启动.rb文件并使用God启动/重启服务器效果很好。
使用RSpec/ test ::Unit编写测试,然后像往常一样运行测试文件。Goliath的测试将启动反应器,并从您的单元测试向API发送真实的请求(注意,这不是分支,它使用EM在与测试相同的进程中运行反应器)。所有这些东西都封装在goliath提供的test_helper中。
Goliath没有rackup文件。您可以直接运行.rb文件。Goliath应用程序将中间件使用的命令直接放入.rb文件中。对于PostRank的我们来说,这是定义服务器的最简单、最清晰的方法。在处理文件时,您可以看到所有use语句(以及它们使用的任何额外部分),而不是拥有多个文件。对我们来说,这是一场胜利,你的里程可能会有所不同。
我不知道websocket-rack是否可以工作,但是,在仓库中有一个分支直接用于烘焙websocket支持到Goliath中。我已经有一段时间没有看过它了(有一些上游的bug被修复了),但它应该不会太难启动和运行,并在上游修复后合并到master中。
对于你关于em-synchrony和thin的问题,你应该只需要在你的代码周围包装一个EM.synchrony {}块即可。synchrony方法只是向下调用EM.run,并将块包装在一个新的纤程中。如果反应器已经在运行,EM将立即执行传递的代码块。只要Thin已经启动了反应堆,这应该可以很好地工作。
更新:的websockets分支已经合并到了巨人主线中,所以如果你是从HEAD运行的,那么WebSocket支持就会直接融入到巨人中。
发布于 2011-09-04 18:28:18
你看过Cramp - http://cramp.in吗?Cramp是完全异步的,并且有一个内置的websockets支持。
https://stackoverflow.com/questions/7297151
复制相似问题