gpt4 book ai didi

ruby-on-rails - 在 Rails 4 中将进度消息从服务器传递到前端

转载 作者:行者123 更新时间:2023-12-04 06:10:50 25 4
gpt4 key购买 nike

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

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

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

对不起,如果这是一个菜鸟问题,离开 Rails 一段时间了!

最佳答案

你的问题比较含糊,如果我的回答是一样的,请见谅:

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

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

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

接收“实时”数据

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

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

您执行此操作的方式因每种技术而异,但实际上对于 SSE 和 WebSockets 来说,这是一个类似的过程

上证所

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

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

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

WebSockets

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

WebSocket is a protocol providing full-duplex communications channels over a single TCP connection



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

大佬都用WebSockets(包括StackOverflow),其实设置起来也比较简单:

“实时”设置

你需要:
  • Rails ActionController::Live 函数和端点(路由)
  • 第三方 Websocket 集成 ( Pusher )
  • 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

    这会打开一个到推送器应用程序的持久连接,然后它会处理我们的数据。每当推送器收到我们的数据时,它都会向我们发送更新,让我们能够提醒用户注意该消息

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

    关于ruby-on-rails - 在 Rails 4 中将进度消息从服务器传递到前端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19996740/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com