2

理論的なシナリオ:GAEデータストアに在庫を保持するeコマースWebサイトがあります。各レコードには、アイテムの名前とカウントが含まれています。このストアはトラフィックが少なく在庫が大きいため、複数の顧客が同じアイテムを同時に購入する可能性は低いです。これは、ここでは、一定の期間、同じレコードを毎秒数回更新するというデータストアの制限に焦点を当てないようにするためです。GAE Datastoreレコードのフィールドを同時に更新する

2人の顧客が同じアイテムを同時に購入した場合、そのアイテムのレコードを正しく更新するにはどうすればよいですか?私たちは各アイテムの正しいカウントを維持することが重要です。

mongoの世界では、$ inc操作のようなものを使用します。 GAE Datastoreのこのシナリオはどのように扱いますか?あなたは、同時に2つのトランザクションを試みることができるように

おかげ

+1

ネイティブな方法はありません。 memcached組み込みインクリメントメソッドをデータストアと組み合わせて使用​​する場合は、googleを使用します。 100%ではありませんが、使用された直後にmemcachedオブジェクトが両方とも削除され、2人のユーザーが同時に増加した場合にのみ失敗します。 –

+0

これは面白いアプローチです。どうもありがとう。 –

答えて

2

Cloud Datastoreの取引は、オプティミスティック同時実行を使用します。エンティティが変更された場合は、失敗します。その時点で、失敗したトランザクションを再試行します。

たとえば、Python NDBでは、トランザクションデコレータで特定の再試行回数を指定できます。

例コード:

from google.appengine.ext import ndb 

... 

@ndb.transactional(retries=5) 
def inc_item_count(item_key, count_purchased): 
     item = item_key.get() 
     item.count_purchased += count_purchased 
     item.put() 

     return True 

ウェブスケール?

このソリューションの動作範囲を超えてスケ​​ールする場合は、タスクキューベースのシステムを探索するか、項目ごとのカウンタをsharding countersに移動する必要があります。

関連する問題