3

我正在开发一个 Rails 应用程序,用户可以在其中上传一些视频。带乘客的 Apache 是我的服务器。视频可以大到 500MB 或 1GB。视频上传后会转换为 mp4 并播放。

我正在使用https://github.com/valums/file-uploader上传文件。有了这个,我可以轻松上传高达 500MB 的视频文件。我想在上传完成后立即显示视频的 mp4 预览。我正在使用 ffmpeg 将视频转换为 mp4。此转换有时可能需要 10 多分钟,由于默认的 apache 超时,我的请求会在 5 分钟后超时。

因此,这里的问题是 ajax 上传仅在上传完成后 5 分钟内使请求保持活动状态。文件上传完成后,我需要请求保持活动状态约 10-20 分钟。很高兴知道是否有任何其他基于 javascipt 的解决方案可用于保持此请求活动,直到视频处理完成并且可以向用户显示预览。

4

3 回答 3

3

在视频被转码之前保持阻塞请求会给您的服务器带来负担。大多数服务器可以同时处理 40-80 个并发请求,具体取决于 Rails 堆栈的内存占用、安装的 gems 和 Apache 服务器设置。如果您允许 10 分钟的请求,这意味着同时上传的 40 个用户可能会关闭您的服务。

我的建议是使用 Ajax 每隔几秒钟轮询一次 Rails 服务器,如果工作完成转码。如果是这样,您可以刷新页面或添加更多 javascript 来初始化视频播放。

window.setInterval( function() {
  $.get('video_path').done(function(data, code, xhr) {
    location.reload(); // or some code for playing back the video
  });
}, 2000);

另一个类似的解决方案可以使用第三方服务,如PusherPubNub,它允许浏览器保持持久连接,然后允许 Rails 服务器在触发事件时通知客户端。像这样的推送服务通常使用Node.Js来更好地进行异步处理并同时维护许多打开的连接。

第三种选择是将 Apache 切换到Puma并使用 Rails新的流 API。Puma 更适合处理并发。

于 2012-10-19T19:44:26.423 回答
1

这听起来像一个 Apache 配置指令(KeepAliveTimeout 和 TimeOut)。

KeepAliveTimeout 1200 # 60sec * 20 min

来自 Apache 的更多信息和语法:http ://httpd.apache.org/docs/2.2/mod/core.html#keepalivetimeout

另一种选择:您能否修改您的 JS/AJAX 以每 2 分钟重新请求一次,并检查预览是否存在?

于 2012-10-19T18:09:01.023 回答
0

两个 tomcat 参数(注意!仅在 Tomcat 7.0 之后可用)允许您在运行请求时保持会话活动。此外,只有在请求完成后,会话超时才会重新开始计数:

org.apache.catalina.session.StandardSession.ACTIVITY_CHECK=true
org.apache.catalina.session.StandardSession.LAST_ACCESS_AT_START=false

您可以在 server.xml 中设置两者或通过 JAVA_OPTS 传递它们:

-XX:MaxPermSize=252m -Dorg.apache.catalina.session.StandardSession.ACTIVITY_CHECK=true -Dorg.apache.catalina.session.StandardSession.LAST_ACCESS_AT_START=false
于 2015-03-21T22:43:21.803 回答