2

GAE で特定のデータ更新にタスク キューを使用しています。

私の queue.xml ファイルは以下のようになります

  <queue> 
    <name>data-processing</name> 
    <rate>20/s</rate> 
  </queue> 

私のキュー処理サーブレットは、タスクごとにクレジットを 1 減らします。処理中に、クレジットの利用可能性を確認し、クレジットが利用可能な場合にのみ先に進む必要があります。

クレジットはテーブルに保存され、タスクが完了すると更新されます。

タスクをスレッドと見なし、同期の問題が心配です。

2 つ以上のタスクが同時にクレジット テーブルを照会/更新するとどうなりますか? ロック機構を作成する必要がありますか? はいの場合、どのように?

4

2 に答える 2

5

はい、同期が必要です。通常、リードモディファイライトスキームでクレジットを更新します。最初に使用可能なクレジットを読み取り、1を減算し、残りのクレジットを書き戻します。2つのタスクが同時にこれを行うと、一方が他方の結果を上書きして、誤ったクレジットカウントが保存される可能性があります。(これに対するアトミックな命令がない限り、これはMemcacheには存在しますが、私が信じるデータストアには存在しません)。

トランザクションを使用してこれを解決できます。http://code.google.com/appengine/docs/java/datastore/transactions.htmlを参照してください

于 2010-06-21T10:03:29.127 に答える
0

App Engine のタスク キューは、実行率そのものを考慮します。既に行っているように、queue.xml を構成する以外に何もする必要はありません。

于 2010-06-21T11:31:09.513 に答える