Carrierwave を使用して動画ファイルをアップロードし、Transloadit を使用してその動画をエンコードしています。ジョブが遅れているレールでこれを行う最良の方法は何ですか。提案してください。
2 に答える
いくつかのオプションがあります (純粋に HTTP 側であり、プログラミング言語については言及していません)。
質問は実際には環境、スキル、サポートなどに依存します。「現実の世界」で気付いたのは、HTTP 要求を介してサーバーに 100MB を超えるデータを送信すると失敗することです。クライアントのアップロード速度が非常に遅い可能性が高く (ほとんどのソーホー インターネット接続はダウン 10M を超えていますが、アップ 1M 未満です)、最終的にはタイムアウト (ルーター/nat テーブル/ファイアウォール/Web サーバー/スクリプト) に達します。
1) 非常に大きな POST (悪い習慣、大量のメモリを消費する可能性があります。失敗すると、最初からやり直す必要があり、サーバーが DDoS に対して無防備なままになります)
2) Apache/nginx 用の「アップロード モジュール」を使用する (セットアップにはコンパイルが必要で、通常は多くの頭痛の種が必要ですが、うまく機能し、すべてのホスティング状況で機能するとは限りません)
3) クライアントおよびサーバー スクリプト内でのストリーミング。うまくいきます。また、アップロードを 10MB 未満に分割し、失敗した場合はチャンクを再起動することをお勧めします。
私は DJ の経験はあまりありませんが、バックグラウンド処理はすべてのツールで同様のアプローチをとっています。
まず、ファイルをどこかにアップロードする必要があります (ファイルシステム、Amazon S3 など)。DJ はこのタスクを処理しません。コントローラーのアクションでそれを行う必要があります。
次に、アップロード後に、ビデオをエンコードし、その他の関連タスクを実行する DJ タスクを作成できます。
たとえば、次のように、ビデオ モデルでコミット後に DJ を実行できます。
class Video < AR::Base
after_commit :encode_in_background
private
def encode_in_background
self.delay.encode(id)
end
def encode
# code that runs in background
end
end
私の例では構文が間違っている可能性がありますが、主なアイデアは、コントローラーを介してビデオをアップロードし、バックグラウンド処理ジョブを実行することです。