3

ユーザーが報酬を受け取るためのボタンが Web ゲームに用意されています。これは 1 回だけクリックしてください。リクエストを受信すると、DB で収集済みとしてマークされます。

クライアントのボタンが繰り返しクリックされるのを既にブロックしています。しかし、短期間にパッケージを何度もサーバーに再送信する場合は役に立ちません。

私が欲しいのは、サーバー側からこれをブロックする方法です。

私たちはサーバー側に Playframework 2 (2.0.3-RC2) を使用していますが、これまでのところステートレスです。次のように Set を使用して保護したいと思っています:

if processingSet has userId then BadRequest
else put userId in processingSet and handle request
     after that remove userId from that Set

しかし、その後、 Scalaコレクションをスレッドセーフに更新するなどの問題に直面しなければならず、負荷分散の背後に複数のサーバーがあると、ユーザーをブロックできません。

私が考えている1つの可能性は、上記の処理セットの代わりにDBにテーブルを持つことですが、それはリクエストごとに1回以上のDB操作が発生します.何か良い解決策はありますか~?

ありがとう〜

4

2 に答える 2

3

その場合、追加の DB 操作は比較的「安価な」ソリューションです。ボタンの状態を永続的に保存する予定がある場合は、これを使用する必要があります。

ボタンが一定期間のみ無効になっている場合 (たとえば、ゲームが終了するまで)、キャッシュ APIの使用を検討することもできますが、これは長期間保存する必要があるソリューション専用ではないことに注意してください ( DB の代替と見なされます)。

于 2012-08-08T12:26:45.020 に答える
3

Mongo を使用していて、別のコレクションにまたがるトランザクションがないことを考えると、アトミック操作、つまり「最新の場合は更新」、つまり実質的な CompareAndSwap を使用して、このガードを実装できると思います。

「収集された」属性を持つ「報酬」のようなコレクションがあると仮定すると、収集されたフラグが現在 false である場合にのみ true に更新でき、その操作が失敗しない場合は、そのことを認識して報酬の適用に進むことができます。他のリクエストの場合、同じ操作は失敗します。

于 2012-08-08T15:50:22.110 に答える