tl;dr - 同じユーザーからの別の同時要求が入ったときに、特定の Rails コントローラー アクションの実行を確実に停止する方法はありますか?
私の Rails/Angular アプリでは、クライアント側から Foursquare API にリクエストを送信します。それらは認証される必要があり、認証情報は安全なままにしておく必要があるため、これらの要求を自分のアプリで Rails コントローラーを介して渡します。
このアーキテクチャの詳細な説明については、この半関連の質問を確認してください。
そこで詳しく説明されているように、私の懸念は、この内部コントローラーへの各要求がサーバー時間を消費することです (そして、Heroku では dyno を結び付けます)。アクションをできるだけ速くしようとしましたが、サーバーが拘束される量を減らしたいと思います。
サーバーが拘束される量は、私が行っている検索のリアルタイム性によって悪化します。自動提案を許可したかったので、入力などではなく、ユーザーの入力時にリクエストがサーバーに送信されます。
ユーザー入力をデバウンス (0.4 秒) しているため、ユーザーが入力を一時的に停止するまでリクエストは行われません。ただし、ユーザーが入力中に数回一時停止し、そのたびにリクエストが送信されると、すぐに複数の dyno が使用される可能性があります。
より具体的には、Foursquare からの API 応答時間が約 1.3 秒であると仮定して、次のシナリオを想像してください。クエリ。これにより、3 つの個別のリクエストが送信されますが、次のリクエストが来る前に返される可能性のあるリクエストがないため、これらのすべてを異なる dyno で処理する必要があります。
これは、大量の費用がかかるか (多数のユーザーがいる場合、同時実行タイムアウトから保護するために多数の dyno が必要になることを意味します)、ユーザーの前で非常に面倒な待機が発生する可能性があります。
したがって、新しいリクエストを送信する前に、そのユーザーからの Foursquare への実行中のリクエストを終了することにより、本質的にサーバー側で遡及的デバウンスを行うことができれば素晴らしいと思います. つまり、上記の具体的な例では、3 つの要求が開始されたときに、最後の要求のみが返されることを意味します。これは、新しい要求が入ったときに最初の 2 つが途中で破棄されるためです。
sessionリクエストが実行されたときに true になる変数を for each に格納することを考えていました。その後、トリガーされた場合、次のリクエストは送信されません。しかし、それは実際には私が望んでいることとは正反対です。なぜなら、新しいリクエストが来たときに元のリクエストをキャンセルしたいからです。後者からそのリクエストにアクセスする方法がわかりません。
これは複雑に感じるので、不可能かもしれないと推測しています (特に、各コントローラーアクションが新しいコントローラーインスタンスによって応答されるため) が、同じアクションが同じユーザーによって再度ヒットされた場合にコントローラーアクションをキャンセルする方法を知っている人はいますか?最初のリクエストが解決されている間?
ありがとう!