概要:
写真を撮って Web アプリケーションに送信するフォトブースがあります。次に、私のWebアプリケーションはユーザーデータを保存し、写真をユーザーのfacebookプロファイル/ファンページに送信します.
私の Web アプリでは、Ruby on Rails @ Heroku Cedar スタックを実行しています。
フロー:
- 私の webapp は、web フォームのように、POST を介してフォトブースから写真を受け取ります。
- ブースはサーバーの応答を待ちます。アップロードに失敗した場合は、画像が再度送信されます。
- Facebook のアップロードが完了した後、webapp からの応答のみが発生します。
問題:
Webapp は、すべての処理が完了した後にのみ、フォトブースにデータを送信します。多くの場合、これは 30 秒後に発生します。これにより、Heroku で H12 - タイムアウトが発生します。
ソリューション?
ファイルがアップロードされている間、リクエストを維持します (heroku が H12 を起動するのを防ぐために、いくつかの応答データを返します - https://devcenter.heroku.com/articles/http-routing#timeouts )。- 出来ますか?Rubyでこれを達成する方法は?
Unicorn + Nginx に変更し、アップロード モジュールを有効にします (この方法では、dyno はアップロードが完了した後にのみリクエストを受け取ります - Unicorn + Rails + Large Uploads )。それは本当に可能ですか?
rack-timeout gem を使用します。これにより、多くのパススルー アップロードが失敗するため、写真が Facebook に投稿されることはありませんよね?
アーキテクチャを変更します。アップロードを S3 に直接行い、ワーカーをスピンして S3 バケットにアップロードされた新しい写真を確認し、それらをダウンロードして Facebook に送信します。-これが一番いいかもしれませんが、かなりの時間と労力がかかります。長期的にはそうするかもしれませんが、今は迅速な解決策を探しています。
他の...