Python 避免数据存储争用
我有一个设计问题,我的应用程序流量不断增长,我有很多“事务冲突。重试…”。我不知道如何避开他们 导言: 此应用中的每个参与者都可以访问另一个参与者 这是我的实际设计(它可能有错误,这只是一个例子): 这是用例的一个示例:Python 避免数据存储争用,python,google-app-engine,nosql,google-cloud-datastore,Python,Google App Engine,Nosql,Google Cloud Datastore,我有一个设计问题,我的应用程序流量不断增长,我有很多“事务冲突。重试…”。我不知道如何避开他们 导言: 此应用中的每个参与者都可以访问另一个参与者 这是我的实际设计(它可能有错误,这只是一个例子): 这是用例的一个示例: foo = Actor(name="foo") bar = Actor(name="bar") db.put([foo, bar]) def trx(): """Store a new visite from 'bar' to 'foo' """ av = A
foo = Actor(name="foo")
bar = Actor(name="bar")
db.put([foo, bar])
def trx():
"""Store a new visite from 'bar' to 'foo' """
av = ActorVisits.get_bey_keys_name(key_name="v/foo", parent=foo)
if av is None:
av = ActorVisits(key_name="v/foo", parent=foo)
v = Visit.get_bey_keys_name(key_name="v/foo/bar", parent=foo, actor=bar)
if v is None:
v = Visit(key_name="v/foo/bar", parent=foo, actor=bar)
v.visited_at = datetime.datetime.utcnow()
async = db.put_async(v)
if not v.key() in av.visits:
av.visits.append(v.key())
av.put()
async.get_result()
db.run_in_transaction(trx, bar, foo)
如果有人想让我把这个模型做得更好。谢谢通过将访问移出演员的实体组,使访问最终保持一致。如果每次访问都是根实体,则不会遇到任何写入速率问题,并且可以轻松查询它们 如果您不想创建很多访问实体,而只想更新一个,那么可以根据参与者和访问者来确定访问密钥 所以演员的Id是123, Vistor(另一名演员)的Id是888 您创建了一个Id为“123_888”(无父项)的类型为Visit的键,您使用此键放置()访问,并更新了时间,它将覆盖以前的访问。您还可以对键执行get(),它将非常一致(如果您保持计数)
然后,您可以使用最终一致的查询构建ActorVisits 我假设你在搜索ActorVisits和Vists时没有使用硬编码的key\u name字符串?这意味着您总是只修改一个ActorVisits对象。@dragonx:是的,这只是我快速编写的一个示例。
foo = Actor(name="foo")
bar = Actor(name="bar")
db.put([foo, bar])
def trx():
"""Store a new visite from 'bar' to 'foo' """
av = ActorVisits.get_bey_keys_name(key_name="v/foo", parent=foo)
if av is None:
av = ActorVisits(key_name="v/foo", parent=foo)
v = Visit.get_bey_keys_name(key_name="v/foo/bar", parent=foo, actor=bar)
if v is None:
v = Visit(key_name="v/foo/bar", parent=foo, actor=bar)
v.visited_at = datetime.datetime.utcnow()
async = db.put_async(v)
if not v.key() in av.visits:
av.visits.append(v.key())
av.put()
async.get_result()
db.run_in_transaction(trx, bar, foo)