Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 避免数据存储争用_Python_Google App Engine_Nosql_Google Cloud Datastore - Fatal编程技术网

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)