0

コンテンツを 1 回だけ提供したい Web サービスがあるとします。それが提供された後、その URL への他のアクセスはエラー メッセージを生成するはずです。

どうすればこのようなことをすることができますか?2 つのクライアントがまったく同じ瞬間に URL にアクセスするとどうなりますか?

4

2 に答える 2

1

データベースを使用してコンテンツの提供を管理します。トランザクションを使用してコンテンツを取得し、1 つのステップで取得済みとして設定することができます。これにより、2 つのクライアントが同時にサービスにアクセスするという問題を防ぐことができます。

于 2010-04-21T00:14:19.543 に答える
1

あなたの要件は、動的レポートをキャッシュするサーバーの場合と非常に似ていますが、反対です。生成に時間がかかるオンデマンドの統計レポートを持っていたので、誰かがそのページを既に要求していた場合、キャッシュされたページは再生成されずに提供されました。

あなたのケースは、ページが提供されると、再度提供しないことです。

いずれにせよ、各ページに永続的なフラグまたは署名が必要です。そのフラグまたは署名は、永続的なデータストアに存在する必要があります。

無数の可能なページを管理する

私がしなければならなかったように無数のページを管理しなければならない場合、オンデマンドの http パラメータ駆動の動的ページの数は可能なページ数が無限であるため、単純な単一の永続フラグを持つことはできません。http post/get リクエスト パラメータを一意の署名に圧縮するルーチンがありました。その署名は保持されます。そのため、リクエストが着信すると、http パラメータがこの署名ジェネレーターを介して実行され、結果の署名が永続データストアと比較され、署名が既に存在するかどうかが検索されます。

私の場合、署名が存在する場合は、キャッシュされたページを提供します。あなたの場合、署名が存在する場合、エラーページが表示されます。

時間帯により先着順

ただし、どちらの場合も、「初めて提供されるページ」は時間イベントの影響を受ける可能性があります。私の場合、新しいデータがアップロードされると、その署名は古くなっています。したがって、統計情報スキーマが時間ベースであることを確認する必要があります。データロードの時間またはイベントの時間です。そのため、署名には、http パラメトリック署名と、要求されたエンティティのイベント/読み込み時間の 2 つのコンポーネントがあります。署名が一致しても、データベースに保存されている要求されたエンティティの最新時刻が署名に保持されているものよりも大きい場合、それは要求が「新しいページ」と見なされることを意味します。

できるだけ短い署名を生成するのに役立つ http パラメータをどのように設計するかを自分で決定し、どのパラメータがページを一意にするかを決定する必要があります。

永続的なストアに関しては、統計情報を格納するためにすでに Oracle を使用していたので、同じ Oracle データベースを使用して署名を永続化しました。それ以外の場合は、hsqldb が良い解決策になると思います。

署名戦略

署名テーブルは、イベント日時、所有者マフォ、一意のキー paramsig の 3 つのフィールドで構成されます。

テーブルが現在の署名を超えて大きくならないようにするために、署名の比較中に古い署名が上書きされます。古い署名を削除する仕事もありました。

マルチユーザー アクセスは、paramsig に null の datetime を配置するだけで簡単に管理できます。私の場合、リクエストの日時が一意であることを確認できたので、実際にリクエストの日時を所有者のマフォとして使用しました。最初の幸運な人 (ただし、私の場合は、キャッシュされていないレポートを待つ必要があった不運な最初のユーザー) がテーブルに競合し、その一意の paramsig を作成すると、データベース システムによって後続の試行が破棄されます。null 日時は、paramsig が予約されており、後で入力されることを通知します。あなたの場合、そのステップをスキップして、paramsig、ownersemaphore だけを使用できる場合があります。

ただし、マルチサーバー環境にいる場合は、サーバー ID + 要求時間のように、ownersemaphore の複合キーを考案する必要があります。

hsqldb が並行性を管理できるかどうかはわかりません。この戦略は、oracle と sqlserver でのみ実行しました。

于 2010-04-21T00:33:57.860 に答える