1

ユーザーが自分のシステムで検索を行うたびに、外部システムにリクエストを送信する必要があるシステムがあります。

外部システムがダウンしているか、応答に異常に長い時間がかかっている場合は、システムをしばらく「バックオフ」させたいと思います。外部システムにさらにリクエストを送信しようとする代わりに、システムのユーザーに、現時点ではリクエストを処理しないことをすぐに知らせたいだけです。

これにより、ユーザーのエクスペリエンスが向上し (タイムアウトを待つ必要がありません)、システムのリソース使用量が少なくなり (外部システムからの応答やタイムアウトを待機するためにスレッドがビジー状態になることはありません)、外部システム。(おそらくすでに負荷に苦しんでいる状況で)

しばらくして、または外部システムが再び応答していることをシステムが検出したら、通常の動作を再開したいと思います。

この種のことを行うためのパターンや標準的な方法はありますか? 具体的には、タイムアウト/長いリクエストを追跡するためのメカニズムと、再試行を開始するタイミングのためのある種の制御メカニズムです。

4

1 に答える 1

2

これが文献に記載されているのを見たのを覚えていませんが、そのようなタスクで気付いたパターンは、「スケジューリングキュー」に集中しています。以前にキャンセルされていない限り(たとえば、Pythonのsched標準ライブラリモジュール)。(非同期)リクエストをバックエンドに送信するときは、今からX秒間のタイムアウトイベントもスケジュールします。リクエストオブジェクトは、スケジュールされたタイムアウトのIDを知っている(それ以前にリクエストが満たされた場合にキャンセルするため)か、保留中のリクエストのセットも維持されます(したがって、タイムアウトは本当に必要ないときを知っています)-これは良いことですとにかく、「本当に意味のあるタイムアウト」の処理が簡単になるので、以下を参照してください。

タイムアウトが発生すると、将来Y秒間再試行がスケジュールされ、保留中のすべてのリクエストがそのコンテナから将来再試行されるリクエストのコンテナに移動されます(システムがこのように設定されている場合は、他のすべてのタイムアウトがキャンセルされます) 、また、「バックエンドが遅いので、Y秒後に再試行します」という通知をすべての待機中のクライアントに送信します。

再試行イベントが発生した場合など。システムが一時停止されている間に新しい要求が到着した場合、それらは「再試行される」ビンに直接入ります。

このパターンの説明は見つかりませんが、どこかにあるとしたら、おそらくシュミットの優れた本にあります...とにかく読むことを強くお勧めします!-)

于 2009-06-10T05:57:48.040 に答える