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



设置:Python、NDB、GAE数据存储。我试图确保我理解我的数据模型周围的一些约束,以及它在一致性和最大写率方面的权衡。是否有任何方法可以在登台或我的开发设备上测试/基准,或者我是否应该咬紧牙关,在各种影子站点上进行测试,并编写一堆脚本?

您可以使用pseudoorandomhrconsistencypolicy来控制测试中的一致性。但是,据我所知,没有办法测试max-write-rate。

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)

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

我不确定它是否可以测试。矛盾是不一致的。我认为您只需要知道数据存储操作有不一致性,以及围绕它们的代码。您不希望计划将来测试的观察结果是可靠的。

我回答这个问题已经一年多了。测试这类东西的唯一方法是在GAE上部署一个应用程序。当我遇到这些挑战时,我有时会做的是"匆匆"创建一个快速的应用程序,该应用程序专为测试所考虑的场景而定制。然后,就像你说的,你只需要使用一些任务、cron和客户端curl类型操作的组合来编写脚本。

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

最新更新