设置: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次写操作。因此,您必须查看您的需求/使用模式,以确定是否可以使用实体组。