2009-02-28 2 views
2

私は外部Webサービスを扱うシステムを設計しています。このサービスは、特定の期間(T)にわたって実行できる要求の数を制限します。このシステムは、ある数の要求(R)のバッチ処理を可能にする。サービスがサポートしているオペレーションは一定数あります(O)。マルチレベルキューデザイン

私のコードでは、ユーザーからの未知数のリクエストが処理されます(この時点では実際には分かりませんが、1日に1回のリクエスト、1秒間に数千回のリクエスト、数千秒という仮定で構築する必要があります)しかし)。これらの結果は一定期間データベースにキャッシュされます。データベースレコードが古くなった場合、システムは再度Webサービスからデータを要求する必要があります。

私は1つのアカウントを持つ1つのIPアドレスを使用してWebサービスにアクセスすることができます(操作の種類ごとに不正行為やアカウントを取得することはできません)。システムは(うまくいけば)すべて1台のサーバー上で動作します。

  • 重複要求がマージされている(重複:システムを考え出すされて私は(私が好きな結果なしで数週間のカップルのためのオンとオフ、それについて考えて)やろうとしています

    それらが同じ要求データを持っていることを意味)

  • ユーザ要求がシステム優先システム要求は、ユーザ要求(データベースの更新がキューにあり、ユーザが同じデータを要求している)
  • に変更することができる
  • を要求有しますpに対する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の操作タイプがあると思います。一部の操作タイプは、他の操作タイプより多くの要求を持ちます。システム要求は、ユーザー要求よりも多くなる可能性があります。

この種の問題に対処する共通の方法はありますか?パターンや技術?私はそれを思って過ごしています(不幸にして、稼働後に使用統計を得ることはできません。でも、私はそれらがどんなものになるのか合理的に推測できません)。

私は避けるようにしようとしている主なものは以下のとおりです。ユーザーの要求(システム要求は数週間待つことができ、ユーザの要求は、すぐにそれができるようプロセスでなければなりません)上で取り扱わシステム要求を持つ

  • ユーザー用とシステム要求のための1:
  • は、データが、私は2つのキューを持つことによってそれを解決したいデータベース

答えて

1

にキャッシュされている期間中に二回同じ要求をしていません。各キューは、(操作の種類、データ、到着時間)のタプルを含む辞書順に並べたセットになるように設計します。これは、あなたがあなたのデータピースを注文することを定義できると仮定しています。順序付きセットは部分キーによる検索を可能にするので、両方のキューで重複した要求があるかどうかを確認し、システムからユーザーへの要求を促進することができます。しかし、私はT変数の役割をあまり理解していません。

+0

お返事ありがとうございます。 Tは要求間の時間(私は要求を2番目に言うことができます)ですから、できるだけ多くのバッチを行う必要があります。 1秒間に10秒間要求するか、1秒間に10要求することは大きな違いです。それは設計上重要なことではない - ちょうど動機。 – TofuBeer