【问题标题】:Quick AJAX responses from Rails application来自 Rails 应用程序的快速 AJAX 响应
【发布时间】:2011-03-12 21:14:37
【问题描述】:

我需要向用 RoR 编写的基于 Web 的监控系统发送警报。蛮力解决方案是使用 javascript 频繁轮询轻量级控制器。当然,缺点是为了获得对警报的紧迫响应时间,我必须非常频繁地轮询(每 5 秒一次)。

我的一个想法是让源自 AJAX 的轮询线程在服务器端休眠,直到服务器收到警报。然后,服务器将唤醒睡眠线程并立即向 Web 客户端返回响应。这将使我能够将轮询间隔缩短到每 30 秒或每分钟一次,同时缩短提醒用户的时间。

我没想到的一件事是 mongrel/rails 不会像我预期的那样为每个 Web 请求启动一个线程。这意味着其他传入的 Web 请求会阻塞,直到第一个线程的睡眠超时。

我尝试修改调用“config.threadsafe!”在我的配置中,但这似乎并没有将行为更改为每个请求模型的线程。另外,似乎使用 config.threadsafe 运行!这是一个冒险的提议,可能需要对我现有的应用程序进行大量测试和返工。

对我采取的方法或更好的方法来获得我正在寻找的响应时间,而不需要用请求淹没服务器有什么想法?

【问题讨论】:

    标签: javascript ruby-on-rails mongrel


    【解决方案1】:

    您需要的是Juggernaut,它是一个 Rails 插件,允许您的应用启动连接并将数据推送到客户端。换句话说,您的应用可以利用即时更新的优势与服务器建立实时连接。

    【讨论】:

    • Juggernaut 看起来确实是一个合理的解决方案。不过,我讨厌不得不在防火墙中为闪存打开一个新端口。
    【解决方案2】:

    您可以使用Rails Metal 来提高控制器性能,甚至可以将其完全分离到Sinatra 应用程序中(Sinatra 可以处理一些严重的请求吞吐量)。

    另一个想法是研究使用Juggernaut 或类似的推送解决方案。

    【讨论】:

    • 这与控制器性能无关。我的问题实际上是故意延迟某些服务器响应 - 而 AJAX 查询正在等待警报 - 同时允许其他人继续。
    • 我只是回顾旧问题,并认为我会在这个问题上给予信任。 Juggernaut 是 Orbited 的一个很好的 COMET 解决方案。我通过切换到 Phusion Passenger 解决了我的杂种单线程问题。多么容易上手的服务!
    【解决方案3】:

    您可以考虑的一种方法是让(部分或全部)您的请求在 external queue 中创建延迟监控作业,这反过来会定期通知监控应用程序。

    【讨论】:

    • 我看到了对排队插件的引用,但认为一旦您将请求排队以处理它,您仍然会立即向客户端返回响应。我想在服务器等待警报时推迟向客户端发送响应。也许我对排队插件有误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多