外部 Web サービスを扱うシステムを設計しています。このサービスは、一定期間 (T) に実行できるリクエストの数を制限します。システムでは、一定数のリクエスト (R) のバッチ処理が可能です。サービスがサポートする特定の数の操作があります (O)。
私のコードは、ユーザーからの不明な数のリクエストを処理します (この時点ではまったくわかりません。1 日に 1 つのリクエスト、1 秒に数千のリクエストになる可能性があります。ただし、1 秒に数千のリクエストを想定してビルドする必要があります)。これらの結果は、一定期間データベースにキャッシュされます。データベース レコードが古くなっている場合、システムは Web サービスからデータを再度要求する必要があります。
1 つのアカウントで 1 つの IP アドレスを介してのみ Web サービスにアクセスできます (操作の種類ごとに不正行為やアカウントの取得、または操作の種類ごとに 1 つのマシンを取得することはありません)。システムは (願わくば) 単一のサーバー上ですべて実行されます。
私がやろうとしていること (私が好きな結果が得られずに数週間オンとオフについて考えていた) は、次のようなシステムを考え出すことです:
- 重複したリクエストはマージされます (重複とは、同じリクエスト データがあることを意味します)
- ユーザー要求はシステム要求よりも優先されます
- システム要求をユーザー要求に変更できます (データベースの更新がキューにあり、ユーザーが同じデータを要求している)
- 特定の操作に対する R ユーザー要求がない場合、残りはシステム要求から取得されます。
- ユーザー要求は、入ってきたのと同じ順序で処理されます (ただし、ユーザー要求が処理されると、同じタイプの R 要求が処理されます)。
たとえば、T は 1 秒、R は 3 秒、O は 2 秒です。次の要求がシステムに入ります。
Request 1, user, operation A, data 1
Request 2, user, operation A, data 2
Request 3, user, operation A, data 1 <- duplicate of request 1
Request 4, system, operation B, data 3
Request 5, system, operation A, data 1 <- duplicate of request 3
Request 6, user, operation B, data 3 <- duplicate of Request 4
Request 7, system, operation A, data 4
Request 8, user, operation A, data 5
Request 9, user, operation A, data 6
Request 10, user, operation A, data 7
Request 11, user, operation B, data 8
重複を処理すると、次のようになります。
Request 1, user, operation A, data 1
Request 2, user, operation A, data 2
Request 4, user, operation B, data 3 <- promoted to user from system (msg 6)
Request 7, system, operation A, data 4
Request 8, user, operation A, data 5
Request 9, user, operation A, data 6
Request 10, user, operation A, data 7
Request 11, user, operation B, data 8
リクエストは次の順序で処理する必要があります。
T1 Request 1, Request 2, Request 8
T2 Request 4, Request 11
T3 Request 9, Request 10, Request 7
操作の種類は3~7種類になると思います。一部の操作タイプでは、他の操作タイプよりも多くのリクエストが発生します。システム要求は、ユーザー要求よりも多くなる可能性があります。
この種の問題に対処する一般的な方法はありますか? パターンかテクノロジーか?私はそれを考えすぎていますか (残念ながら、稼働状態になるまで使用統計を取得することはできません。それらがどうなるかを合理的に推測することさえできません)。
私が避けようとしている主なものは次のとおりです。
- システム リクエストがユーザー リクエストに対して処理される (システム リクエストは数週間待つことができます。ユーザー リクエストはできるだけ早く処理する必要があります)。
- データがデータベースにキャッシュされている期間に同じリクエストを 2 回行わない