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

ビデオがトランスコードされるまでブロッキング要求を保持すると、サーバーに負担がかかる可能性があります。ほとんどのサーバーは、Railsスタックのメモリフットプリント、インストールされているgem、およびApacheサーバーの設定に応じて、40〜80の同時リクエストを同時に処理できます。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.Jを使用します。

3番目のオプションは、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

2つの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 に答える