2

我正在寻找使用 WebSocket 组件和基于机架的前端运行的 web 应用程序。我最初的计划是使用 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.

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

我遇到了一个名为 Goliath 的网络服务器,它声称与 Thin 类似,具有 em-synchrony 支持,但它缺少用于启动和测试服务器的命令行实用程序,并且似乎需要我将不同类型的文件写入rackup,这是非常令人反感的。目前还不清楚它是否会支持 websocket-rack,它目前只指定对 Thin 的支持。

有什么好的方法可以避免阻塞 IO,同时仍然使用熟悉的基于机架的工具,如露营和访问 WebSockets?

4

3 回答 3

2

关于 Goliath,Goliath 是基于 Thin 的(我从 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 是否可以工作,但是 repo 中有一个分支,用于将 websocket 支持直接烘焙到 Goliath。我有一段时间没看它了(有一些上游错误需要修复),但启动和运行它应该不会太难,并且在上游修复后,合并到 master 中。

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

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

于 2011-09-13T04:47:58.150 回答
1

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

于 2011-09-04T10:28:17.663 回答
1

以下是如何为 Camping 添加异步支持的示例:https ://gist.github.com/1192720 (请参阅 65 了解您必须在应用程序中使用的代码)。也许我们应该把它包在宝石或其他东西中……</p>

于 2011-09-04T11:46:07.780 回答