0

リクエストをキャンセルすることは可能ですか (私はそれが通常のことだと思います) (このリクエストの後にサーバー上で既に開始されているメソッドも)?

たとえば、Rails アプリから youtube または vimeo でのビデオ検索をリクエストしたとします (これはサーバーに実装されており、vimeo または youtube に直接リクエストを送信します)。しかし、この検索をキャンセルすることにしたので、新しい検索を開始できます。すでに役に立たない検索結果のためにリソースを浪費することはありません。したがって、すべてのリクエストは AJAX 経由で行われます。

私はすべきだと思います:

  • グローバル変数を定義します(たとえばcancel_req = 4939498348953、キャンセルするたびに、キャンセルしたいメソッドに知られている特定の ID に設定し、その間は に設定しcancel = nilます。したがって、コードのいくつかのポイントで、この変数をチェックするだけです(ただし、非常に多くのデータが返されるため、サードパーティの API 呼び出しが非常に長い時間ブロックされている場合は?)

  • またはredisサブスクライブを導入します(このタスクには少し過剰に設計されていると思います)

しかし、どちらの方法も単なる回避策のように思えます。cancel独自のソリューションでサードパーティの API を要求するなど、これらの長時間実行されるメソッドに到達するためのより良い方法はありますか?

アップデート:

でレールで何とか可能callbacksですか?たぶんyieldsと?

アップデート2:

ワークフローは次のとおりです。

client -> webserver -> rails-app-server (controller/helper) --->
                                                                |
                                                           foreignAPI  // <-- break execution somewhere here (but of course still handle all other client requests, so - not exiting the application) 
                                                                |  
 client <- webserver <- rails-app-server (controller/helper) <--
4

1 に答える 1

0

あなたの問題は単に通話をブロックしているようです。非同期タスクを実行するには、 delayed_jobを検討してください。あなたの場合、これらの長い API 呼び出しです。待機する制限として構成Delayed::Worker.max_run_time = 10.seconds(または任意の時間) を設定でき、考えられるほとんどすべてのイベントに対してコールバックがあります。

于 2013-10-19T06:49:32.193 に答える