大视频上传和处理超时

时间:2012-10-19 18:03:13

标签: javascript ruby-on-rails ajax node.js

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

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

所以,这里的问题是ajax上传只会在上传完成后5分钟保持请求存活。文件上传完成后,我需要请求保持活动大约10-20分钟。如果有任何其他基于javascipt的解决方案可用于保持此请求存活直到视频处理完成并且可以向用户显示预览,那将是很好的。

3 个答案:

答案 0 :(得分:2)

在转码视频之前保持阻止请求会给您的服务器带来负担。大多数服务器可以同时处理40-80个并发请求,具体取决于Rails堆栈的内存占用,安装的gem和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 new streaming APIs。 Puma更适合处理并发。

答案 1 :(得分:1)

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

KeepAliveTimeout 1200 # 60sec * 20 min

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

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

答案 2 :(得分: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