【问题标题】:Rails 3.1 - Firing an specific event with the EventMachineRails 3.1 - 使用 EventMachine 触发特定事件
【发布时间】:2011-09-15 22:52:51
【问题描述】:

我想在 Rails 3.1 项目中使用插件 em-eventsource (https://github.com/AF83/em-eventsource) 来处理服务器发送的事件。我的问题是,只解释了如何监听事件和接收消息,而不是如何触发特定事件并发送消息。我想在 Active Record-Observer 中产生事件。当我认为我必须推迟使用 EventMachine 的操作来产生这个事件时,我是对的吗,或者我该如何解决这个问题?

是的,它必须是 Ruby on Rails。如果我不能让它与 EventMachine 一起工作,我会尝试用 node.js 绕过整个 ruby​​ 部分。

【问题讨论】:

    标签: ruby-on-rails events ruby-on-rails-3.1


    【解决方案1】:

    实际上,我和维护者一起在这个库上做了一些工作。我认为您将客户端部分与服务器部分混合在一起。 em-eventsource 是一个 client 库,您可以使用它来使用 ServerSentEvent API,它并不意味着触发 SSE。

    在服务器端,只要您运行的服务器支持流式传输,您使用的是 Rails 还是任何其他堆栈(nodejs、php……)都无关紧要。 Rails 附带的默认 Web 服务器不支持 (Webrick),但还有许多其他支持:Thin、Puma、Goliath...

    为了在 Rails 中启动 SSE,您必须在引用的服务器中同时使用支持流式传输的服务器,并遵守 SSE 规范。它主要归结为,首先,使用正确的内容类型标头(“文本/事件流”)进行响应,以便客户端(浏览器)知道它应该挂起,然后开始在套接字上流式传输。后一部分是目前在 Rails 3 中不容易实现的部分(但并非不可能!);实际上,Rails 4 现在以一种简单的方式支持流式传输,具有简洁明了的内部 API,因此它肯定会到来。

    与此同时,您可以:

    • 在 Rails 中使用 Rack 的 API(我猜是使用 EventMachine,有一些例子)
    • 或者让它变得聪明,并利用 Sinatra 提供的流式传输功能,构建在 Rack 之上(请参阅 https://gist.github.com/1476463 了解可以安装在 Rails 中的 Sinatra 应用程序示例!)
    • 或者您可以使用 Pusher 等外部服务
    • 或利用完全不同的堆栈...

    一个很好的概述:http://blog.phusion.nl/2012/08/03/why-rails-4-live-streaming-is-a-big-deal/

    【讨论】:

      【解决方案2】:

      也许我错了,但如果 IIRC Rails 不能支持长池。 Rails 为每个请求阻塞整个服务器(或线程,如果你有多个在服务器内部运行),并且除非发送整个响应,否则不能重用它们。这就是为什么如果您怀疑可能有许多并发连接,您应该在 Rails 应用程序前面设置反向代理(如 nginx) - 代理慢速客户端请求并在收到整个请求时将它们发送到 Rails。这就是 Rack 的工作原理,您可能对此无能为力。

      【讨论】:

      • 我不认为这会是个大问题。因为服务器发送的事件是异步工作的,并且有 rails-app-server 之类的 Thin 明确支持基于事件的异步处理。所以它不是长轮询。但目前我什至无法让它仅通过一个连接工作......
      猜你喜欢
      • 2016-10-11
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多