2

ファイルをherokuインスタンスにアップロードすると同期リクエストであり、リクエストが完了すると200が返されることを理解しています。これは、アップロードが処理され、ペーパークリップによって保存されたことを意味します。

シリアル アップロード (一度に 1 つのファイル) を行う plupload を使用しています。Heroku には 3 つの dyno があり、アプリが応答しなくなり、アプリを使用しようとするとタイムアウトが発生します。私のアップロードは、すべてのファイルがアップロードされている間、実際には最大で 1 つの dyno のみを結び付ける必要があります。これは、ファイル 1 から応答が返されるまでファイル 2 が開始されないためです。

テストとして、dyno を 15 に増やしてアップロードを実行しました。再び投稿がログに記録されるのを確認してから、ペーパークリップ コマンドの出力を確認し始め (それが識別か変換かを思い出せません)、タイムアウトが発生し始めます。

なぜこれが起こっているのか、私は本当に迷っています。s3に直接アップロードできることは知っていますが、現在のアプローチは問題ないはずです。アップロードされたすべてのファイルが連続して送信されるため、1 人のユーザーのみが使用する管理インターフェイスであり、多くても 1 つの dyno を結び付ける必要があります。

何か案は?

4

2 に答える 2

1

私は数日間同じ問題に取り組んできました。私が理解している限り、問題は、heroku を介してファイルをアップロードするときに、リクエストがまだ 30 秒のタイムアウト制限によって管理されていることです。これに加えて、同じ dyno (アプリケーション インスタンス) に対して発行された後続の要求により、応答時間が発生して終了する可能性があるようです。たとえば、アップロードにそれぞれ 15 秒かかる 2 つの後続の要求を Web アプリに発行すると、タイムアウトを受け取る可能性があり、dyno は要求を強制的に終了します。これが、タイムアウト エラーを受け取る理由である可能性が最も高いです。これが複数の dyno で継続すると、アプリケーションがクラッシュするか、一般的にパフォーマンスが低下する可能性があります。

私がやったことは、jquery-file-uploadを使用することでした。ただし、大きなファイル (数 MB) をアップロードする場合は、heroku がまだアップロードを処理しているため、エラーが発生します。特に、私はこの手法を使用して、heroku を完全にバイパスし、クライアントのブラウザーから s3 に直接アップロードしました。これを使用して一時ディレクトリにアップロードし、次にcarrierwave を使用してファイルを「再ダウンロード」し、ジョブを Qu にプッシュしてバックグラウンドでメディア バージョンとサムネイル バージョンを処理します。現在、タイムアウトはありませんが、ユーザーはジョブがバックグラウンドで処理されるまで待機する必要があります。

また、heroku dyno は互いに独立して動作することにも注意してください。そのため、Web dyno の数を増やすことで、他のユーザーのためにアプリケーションのより多くのインスタンスを作成することになりますが、各インスタンスには 30 秒のタイムアウトと 512Mb のメモリが必要です。dyno の数に関係なく、同じ問題が発生します。より多くの dyno != より良いパフォーマンス

于 2012-11-15T00:35:02.583 に答える