13

大量の写真のアップロードを一度に許可するアプリケーションを構築しており、これに取り組むための最良の設定が何であるかを知りたがっています。Image Heavy App用Ruby on Railsアーキテクチャのベスト

これは私がこれまで使用していますものです:

  • jQueryのファイルのアップロード:ユーザーが
  • CarrierWaveを画像をドラッグ&ドロップすることができます:画像を処理し、ImageMagickの
  • アマゾンS3でそれらのサイズを変更:CarrierWaveアップロードHerokuの
  • を通じてアマゾンS3への画像:

をホストするために、私は、ユーザーがあることを許可したいのですが大量の画像をあるページにドラッグアンドドロップしてから、アップロードがバックグラウンドで行われている間に他のページに移動できます。また、アップロードが完了すると写真が表示されます。私はこのプロセスがHeroku dynosをロックすることを望んでいないので、仕事をバックグラウンドの仕事に移す必要があるかもしれませんが、自分の状況に何を使うべきか分かりません。

このタイプのアプリに最適な設定は何ですか?どのようなバックグラウンドワーカーの宝石を使うべきですか?曇りの良いアイデアですか?

+0

ファイルコピー – Viren

答えて

34

最近、私はHerokuで多数のアップロードを受け付けるアプリケーションを作成しました。私は曇りや同等のものを使うのではなく、私自身のソリューションを作ることに決めました。私が学んだ教訓は次のとおりです。

  • herokuにアップロードしないでください。あなたのウェブワーカー全員がアップロードの全期間中ロックされます。それは最大1分です。容認できない。

  • s3に直接アップロードするにはjavascript uploader(jquery-file-uploadなど)を使用してください。これは最初はやや複雑ですが、一度作業すればそれは素晴らしいです。s3_direct_uploadの宝石を使用することもできます。または、自分のソースを読んで最初から独自のソリューションを作ることもできます。その宝石はrailscasts proエピソードに基づいていましたが、これはお支払いが必要ですが、source availableです。

  • アップロードが完了したら、新しいs3 urlをremote urlとして渡して、アプリケーションにajaxリクエストを行います。その後、Carrierwaveはアップロードされたようにs3上で画像を処理しますが、1分以内ではなく数秒で処理されます。

  • 使用jqueryのファイルアップロードのclient-side image resizing。誰かが5メガバイトの写真をアップロードしようとしていて、アップロードが永遠にかかると嫌になります。これにより、すべてのアップロードが理論上可能な限り速くなります。

  • 設定はclear your uploads folder automaticallyにS3。

  • 薄く使用しないでください。 unicornを使用してください。数秒で長すぎて細い要求を処理することはできませんが、3人または4人の労働者がいるユニコーンははるかに寛容です。

  • rmagickを使用しないでください。これは、複雑な画像操作のための優れたAPIですが、驚異的な量のメモリを使用します。代わりにmini_magickを使用してください。

私はこのためにバックグラウンドワーカーを使用していないことに注意してください。あなたが本当に細心の気持ちであれば、リモートURLを受け取ったコントローラーにバックグラウンドワーカーに作業を渡させることができます。結果がすぐに必要な場合は、バックグラウンドワーカーはpubsub(fayeまたはpusher、おそらくエキサイティングな新しいsync宝石)。しかし、これは私のアプリケーションには必要ではなかったし、私はむしろ従業員のdynoよりも別のWeb dynoにお金を使うだろう。

そして、そうしている間にアプリケーション全体をクリックさせたい場合は、ポップアップでアップロードしたり、何らかのpubsubソリューションを使用したりする必要があります。 emberやバックボーン、角を使ったjavascriptアプリケーションとしてのサイト。

質問がありますか?

+0

Web dynoでは、何秒かの処理でも応答性の問題があります。 Herokuのロード・バランシング層は、各ダイノーが要求を処理するために実際に使用可能かどうかをもはや認識していません。リクエストはランダムに負荷分散され、他のユーザーからのリクエストは、別のダイノーがリクエストを直ちに処理できるにもかかわらず、3〜5秒間、イメージ処理リクエストジョブの後ろで待機することがあります。主人公の要求を超高速に保つことが常に最善です[Source Article](http://rapgenius.com/James-somers-herokus-ugly-secret-lyrics) –

+1

合意。だからこそ、ヒロク氏は、問題がはるかに顕著でない薄いものからユニコーンなものへ(彼らの公式の勧告を変更した)(https://blog.heroku.com/archives/2013/2/27/unicorn_rails)可能な限り最善のアーキテクチャは、ワーカーが関わっていますが、すべてのアプリケーションで必要ではなく、たとえばs3アップロードのダイレクトと同じ影響はありません。 – Taavo

6

私はあなたの言い伝えの前にCloudfinを見たことはありませんでしたが、それはあなたのプロジェクトに非常に適しているようです。

まず、アプリを大幅に簡略化できる可能性があります。 CloudatherはそのHTTP APIを介してdirect uploads from the browserをサポートしています.jQuery File Uploadに基づいており、クライアント側の事前アップロード処理を含めて同様の機能を備えています。jquery pluginがすでにあります。

さらに、それはdragonfly(非常に良いlib)に似たオンザフライ変換をサポートしています。

これは、実際にあなたのアプリを通してそれらの画像をアップロードする必要がない限り、完全に回避し、Cloudifyに直接アップロードし、transformation APIで画像のクロッピングやその他の変換を処理できることを意味します。

必要に応じてCarrierwaveとS3をアプリから削除することができますが、画像処理を処理するバックグラウンドのdynosは必要ありません。さらに、ダイレクトアップロードやオンザフライ操作とアプリへのアップロード、処理、クラウドへのアップロードの方がはるかに高速で、アプリを介してアップロードするための帯域幅がなくなります。

直接アップロードしなくても、Cloudinaryは、変換APIを利用できるCarrierwaveプラグインを提供しているように見えます。アプリケーションの画像処理が不要になります。

+0

上の不必要なCPU使用率を回避するために、ウェブサーバは、このユーザーは、その後、バックグラウンドでアップロードされます写真のグループを投稿できるようになるために(そう、彼らは、アップロード処理を停止せずにページを残すことができ、アップロードモジュールを追加します)? –

+0

アップロードを処理するためのポップアップウィンドウを開かないと、これは起こりません。そうしないと、ページを離れるとアップロードが中断されます。私が知っているWebブラウザには、プロセスのバックグラウンドはありません。 – numbers1311407

+0

しかし、何をしているのかによっては、FayeやWebSocketのようなスタックコンポーネントをスタックに追加して、アップロードされた画像の通知をプッシュすることができます。 – numbers1311407