4

我正在开发一个 Rails 应用程序,它具有一个自定义回形针处理器,它接受视频文件并将它们处理成各种其他格式。

由于我正在处理视频并且此过程需要一段时间才能在服务器上完成,因此我想将有关处理状态的信息从服务器传递到前端,因为它正在发生。

我的问题是:在不重新加载页面的情况下,将这些消息从我的自定义回形针类获取到我的 JS 的最佳方法是什么?我猜测某种事件发布/订阅系统,但不清楚实现这一点的最佳方法。

抱歉,如果这是一个菜鸟问题,请远离 Rails 一段时间!

4

1 回答 1

8

您的问题相对含糊,如果我的回答相同,请道歉:


WebSockets 或 SSE(服务器发送事件)

我们刚刚用一个删除多条记录的应用程序实现了类似的东西,并发送已删除的更新

您对 pub/sub 是正确的,我将尝试解释底层技术。这实际上是 SSE 或 WebSockets 的类似过程


接收“实时”数据

从服务器接收“实时”数据的过程是在 Rails中使用ActionController::Live控制器。这与response.headers['Content-Type'] = 'text/event-stream'HTTP mime-type 一起使用,将小数据包发送到 Javascript“侦听器”(您在前端初始化)

无论您使用 SSE 还是 WebSockets,您都必须有一个“实时”控制器操作(它创建实时信息),并且还必须有一个Javascript EventListener来捕获浏览器中的实时数据

您执行此操作的方式因每种技术而异,但实际上 SSE 和 WebSockets 的过程类似


上证所

服务器发送事件是一种 HTML5 技术,它基本上允许您通过打开与服务器上的端点(您的 Rails ActionController::Live 操作)的异步连接来接收(而不是发送)更新的数据,这将发布您需要的数据

您通常使用Redis进行设置(将数据编译为 JSON)并使用 Rails 的 ActionController::Live 功能发送它。您的 Javascript 将“监听”被触发的事件,从而允许您捕获从服务器发送的实时数据并在前端对其进行操作

SSE 的问题在于它使用长轮询来不断“ping”端点以尝试获取最新信息。尽管 Puma 允许多线程,但我们无法让它同时运行连接,从而显着降低了性能(基本上,每秒发送一个请求会占用您的连接)


网络套接字

Websockets是与 SSE 类似的技术,但有一个主要区别——它们允许永久连接:

WebSocket 是一种通过单个 TCP 连接提供全双工通信通道的协议

这意味着您可以发送接收数据,以及只连接一次并保持连接,无论您临时做什么。我们发现这是一个比 SSE 更稳定的解决方案,因为它消除了对长轮询的要求,并且,如果您可以保持身份验证正确,则可以让您正确接收数据

所有的大人物都使用 WebSockets(包括 StackOverflow),而且设置起来实际上相对简单:


“实时”设置

你需要:

  1. Rails ActionController::Live Function & Endpoint (路由)
  2. 第三方 Websocket 集成(Pusher
  3. Javascript EventListeners(处理返回的数据)

这是我们使用的一些实时代码:

#app/controllers/resources_controller.rb (inherited resources)
        def destroy        
            element = @resource.find(params[:id])
            element.destroy
            Pusher['private-user-' + current_user.id.to_s].trigger('my_event', {
                message: "Removed #{element.title}"
            })
        end

   #app/assets/javascripts/users.js.coffee.erb
   pusher = new Pusher("******************",
        cluster: 'eu'
   )

   channel = pusher.subscribe("private-user-#{gon.user_id}")
   channel.bind "my_event", (data) ->
       alert data.message

这将打开与推送应用程序的持久连接,然后由它处理我们的数据。每当推送器接收到我们的数据时,它都会将更新发送给我们,允许我们提醒用户注意消息

我知道这是一个简单的概述,但我希望它有所帮助

于 2013-11-15T09:36:27.213 回答