在庫数を気にしないのであれば、購入ログを追記していくだけなので、ものすごいスループットが出るのですが、在庫数の管理をするのであれば、あるアイテムの在庫数のデクリメントが必要なので、衝突の可能性が出てきます。
そこで、実際の購入処理に近いように、Web経由で負荷テストしてみました。
abを使って、以下のようなコマンドを実行しました。
ab.exe -n 100 -c 10 example.jp/test_datastore_throughputハンドラは、グローバルなカウンタをインクリメントするだけ。
ある程度abで暖めておいてから、テストを実施しました。
3回実施したところ、
- 成功76、失敗24、約9.0秒
- 成功79、失敗21、約7.7秒
- 成功68、失敗32、約8.3秒
となりました。
それなりに衝突が発生していることが分かります。
秒間あたりの成功数は8.4、10.2、8.1回です。
Google App Engineに関する記事によると
http://code.google.com/intl/ja/appengine/articles/sharding_counters.html
1 つのエンティティまたはエンティティグループの更新は毎秒 5 回ほどとあるので、記事とは大きな差はないようです。
モデル:
class TestCounter(db.Model):
count = db.IntegerProperty(required=True, default=0)
@classmethod
def incr(cls, key_name):
def txn():
obj = cls.get_by_key_name(key_name)
if not obj:
obj = cls(key_name=key_name)
obj.count += 1
obj.put()
return obj
return db.run_in_transaction(txn)
ハンドラ内:
TestCounter.incr('test_datastore_throughput')
0 件のコメント:
コメントを投稿