0

Carrierwave を使用して動画ファイルをアップロードし、Transloadit を使用してその動画をエンコードしています。ジョブが遅れているレールでこれを行う最良の方法は何ですか。提案してください。

4

2 に答える 2

1

いくつかのオプションがあります (純粋に HTTP 側であり、プログラミング言語については言及していません)。

質問は実際には環境、スキル、サポートなどに依存します。「現実の世界」で気付いたのは、HTTP 要求を介してサーバーに 100MB を超えるデータを送信すると失敗することです。クライアントのアップロード速度が非常に遅い可能性が高く (ほとんどのソーホー インターネット接続はダウン 10M を超えていますが、アップ 1M 未満です)、最終的にはタイムアウト (ルーター/nat テーブル/ファイアウォール/Web サーバー/スクリプト) に達します。

1) 非常に大きな POST (悪い習慣、大量のメモリを消費する可能性があります。失敗すると、最初からやり直す必要があり、サーバーが DDoS に対して無防備なままになります)

2) Apache/nginx 用の「アップロード モジュール」を使用する (セットアップにはコンパイルが必要で、通常は多くの頭痛の種が必要ですが、うまく機能し、すべてのホスティング状況で機能するとは限りません)

3) クライアントおよびサーバー スクリプト内でのストリーミング。うまくいきます。また、アップロードを 10MB 未満に分割し、失敗した場合はチャンクを再起動することをお勧めします。

于 2015-03-30T17:30:43.310 に答える
0

私は 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

私の例では構文が間違っている可能性がありますが、主なアイデアは、コントローラーを介してビデオをアップロードし、バックグラウンド処理ジョブを実行することです。

于 2015-03-30T17:26:18.150 に答える