5

私はRailsアプリを実行しています。このアプリは、C++で開発されたローカルクライアントからのjsonWebサービス呼び出しを持っています(マルチパートjsonフォームを使用したpostコマンド、ストリーミングファイルのアップロード)

ルーティングメッシュについてのHerokuドキュメントをすでに読んでおり、http接続の30年代のHeroku制限について言及し、ワーカーdynoを参照する長いポーリングの代替案について言及しています。

通話中にPDFドキュメントを処理し、署名を挿入します。このPDFドキュメントは、100kbまたは11Mb(またはそれ以上)のいずれかです。

最終的にはバックグラウンドプロセスでこのアクションを実行する必要があることを理解していますが、絶対に実行する前に実行することは避けたいと思います。

このタイムアウトを増やす方法を知っていますか?

以下のコードでわかるように、保存後にドキュメントを処理しています(これは、内で実行していましたafter_saveが、処理前に応答を送信することを期待してコントローラーに変更しました)。

ドキュメント処理の前にクライアントが応答を受け取ることを期待しますが、Heroku側でタイムアウトが発生し、クライアント側でエラーが発生します。

これはすべて小さいドキュメントで正常に機能しますが、400kbしかない121ページのPDFドキュメントの場合は吹き飛ばされます。

最終的に、ファイルがアップロードされるので、必要なのは、タイムアウト応答が送信される前に、その応答がクライアントアプリに進むことだけです...

助言がありますか?

私のエラー:

 at=error code=H12 desc="Request timeout" method=POST path=/documents host=fierce-beach-2720.herokuapp.com fwd="81.193.155.217/bl4-155-217.dsl.telepac.pt" dyno=web.1 queue=0ms wait=0ms connect=1ms service=32272ms status=503 bytes=0

私のコントローラー:

respond_to do |format|
      if @document.save!
        format.html { redirect_to root_path, :flash => { :success =>  'Document was successfully created.'} }
        format.json { render json: @document, status: :created, location: @document}
        @document.document_process
4

2 に答える 2

3

遅延ジョブ+ワークレス の使用を終了し、ワーカーdynoは必要なときにのみ実行されるようになりました。

heroku はアプリあたり 750 時間の無料プランがあるため、使用量が少ない場合は無料で使い続けることができる場合があります。

于 2013-03-16T02:31:25.710 に答える
1

提案は次のとおりです。バックグラウンド プロセスを使用してください。

あなたはそれを避けたいと読みましたが、それを回避する方法はありません! リソースを解放するため、できるだけ早くクライアントに戻ることが Web アプリのベスト プラクティスです。heroku で dyno が 1 つしか実行されておらず、複数のリクエストがある場合、それらはタイムアウトのためにブロックされ、ユーザーはページにアクセスできなくなります。このような長時間実行されるプロセスがある場合、サービス拒否のケースが簡単に発生する可能性があります。

コストのためにバックグラウンド プロセスを実行したくない場合は、フリーミアムをご覧ください: https://github.com/phoet/freemium

于 2013-02-21T19:12:13.210 に答える