メニュー

2010年10月8日

エンティティの更新スループット

チケットの購入システムのようなものをGoogle App Engineで実装する場合、エンティティの更新スループットが気になります。

在庫数を気にしないのであれば、購入ログを追記していくだけなので、ものすごいスループットが出るのですが、在庫数の管理をするのであれば、あるアイテムの在庫数のデクリメントが必要なので、衝突の可能性が出てきます。

そこで、実際の購入処理に近いように、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')