如何在Google App Engine / NDB上测试一致性模型和竞争条件?

时间:2014-06-05 01:20:44

标签: python google-app-engine app-engine-ndb

设置:Python,NDB,GAE数据存储区。我试图确保理解我的数据模型的一些约束以及它的一致性和最大写入速率的权衡。有没有办法在staging或我的开发盒上测试/基准测试,或者我应该咬紧牙关,推动在各种阴影网站上做什么,并编写一堆脚本?

4 个答案:

答案 0 :(得分:2)

您确实需要在真实环境中进行测试。最好的开发环境是生产的近似值。通过使用SDK,您当然无法得出有关性能的任何结论。在许多情况下,SDK更快(启动时间)和更慢(对大型数据集的查询。模拟最终一致性,而不是100%与生产相同。

答案 1 :(得分:2)

您可以使用PseudoRandomHRConsistencyPolicy来控制测试中的一致性。但是,正如我所知,没有办法测试最大写入速率。

import unittest
from google.appengine.ext import testbed, ndb
from google.appengine.datastore import datastore_stub_util


class Foo(ndb.Model):
  pass


class TestConsistency(unittest.TestCase):

  def setUp(self):
    self.testbed = testbed.Testbed()
    self.testbed.activate()

  def tearDown(self):
    self.testbed.deactivate()

  def test_consistency(self):
    self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
      probability=1)
    self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)
    foo = Foo()
    foo.put()
    self.assertEqual(Foo.query().count(), 1)

  def test_consistency_failed(self):
    self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
      probability=0)
    self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)

    foo = Foo()
    foo.put()
    self.assertEqual(Foo.query().count(), 0)

答案 2 :(得分:1)

我不确定它是否可以测试。不一致是不一致的。我想你只需要知道数据存储区操作有不一致性,并围绕它们编写代码。您不希望计划未来可靠的测试结果。

答案 3 :(得分:1)

我被问到这一年后,我正在回答这个问题。 测试这些类型的唯一方法是在GAE上部署应用程序。当我遇到这些挑战时,我有时会做的只是“掀起”一个快速的应用程序,该应用程序是为了测试所考虑的场景而量身定制的。然后,正如你所说的那样,你只需要使用某些任务组合,cron和客户端卷曲类型操作来“编写”脚本。

原始问题中的特定权衡是写吞吐量与一致性。一旦掌握了它,这实际上非常简单。强一致性查询要求实体位于同一实体组中。并且,同时存在约束,即给定实体组每秒可能仅具有大约1次写入。 因此,您必须查看您的需求/使用模式,以确定您是否可以使用实体组。