English 中文(简体)
AppEngine中避免争议
原标题:Avoiding contention in AppEngine

我正试图绕着争论 以及它如何适用于 应用程序引擎堆放。

我有一个模型 建成像那样的模型

class Events(db.Model):
    #Owner Identification Number
    owner_id        = db.StringProperty(required=True)

    #Authentication Token
    auth_token      = db.StringProperty(required=True)

    #generic, b, c, d, ...
    driver          = db.StringProperty(required=True)

    #Start Time and Date
    tStart          = db.DateTimeProperty(auto_now=True)

    #Define whether the event is active or inactive
    active          = db.BooleanProperty(default=False)

    #Payload store, this will store each payload block sent or pulled
    payloads        = db.StringListProperty(indexed=False)

这个模型会举办几次活动,每个活动都有一个业主和一个有效载荷, 活动所有人会写出他活动之间的有效载荷, 许多其他人会从活动中读出, 它就像一个抄录堆。

我的问题是争论,我是否会受此影响,如果是这样,我如何重组以防止这种情况发生。

谢谢

最佳回答

我看不出你的型号有什么问题:

  1. Events entities will not pay any contention tax as they seem, judgding from your words and example , just root entities outside any entity group.
  2. A frequent update on a single entity can cause contention but I hardly doubt that the owner will update any entity more than one time per second (1QPS is the threshold you have to keep in mind, above that you are in the danger zone).
  3. Datastore read operations do not cause contention problem.
问题回答

我也刚加入Google App 引擎。所以基本上避免争论其实是问 如何增加写作量。我可以想到的解决方案是:

  1. Sacrifice Transactions
  2. Batch Writes in memcached
  3. Shard counters
  4. Background Tasks queue

https:// developmenters.google.com/appengine/articles/sharding_counters" rel="nofollows">https://developers.google.com/appengine/articles/sharding_counts

https:// developmenters.google.com/appengine/articles/scaling/constolding" rel=“nol follow'>https:// developers.google.com/appengine/articles/scaling/contolding

还有别的点子吗 我也想知道

在您的情况下,适用的限制是实体的写作/更新限制,即每个实体(或实体集团)每秒写作/更新1次。

文字没有限制。

使用 memcache 进行缓存读取仍是一个好主意, 以便降低成本并改进响应时间 。 如果您使用 Python NDB, 那么 < a href=" https:// developmenters.google.com/ appengine/docs/ python/ndb/cache" rel = “ nofollow” >caching 是默认 启用的 。

< 强力 > 解决方案: IMHO 是增加写作量的一个很好的解决方案, 同时读作 < a href="https:// developmenters.google.com/appengine/docs/java/backends/overview" rel="nofollow"\ rel= "nofollow"\\\ a>。 它们( 大多) 总是在您可以用作共享记忆的案例中。 因此您可以在同时读的同时批量写( 并通过任务 Quue 冲刷) 。

< 坚固 > 注: 实例每天大约重新开始一次, 所以不能将其视为可靠的存储 - 您可以使用它们作为智能缓存, 同时( 通过后端线索或任务队列) 以不同步的方式( 通过后端线索或任务队列) 在数据存储中进行交易更新实体 。

在 App 引擎中,“事件”的每个实例都作为整个对象读/写。您会担心对每个事件实例的争论。如果您必须经常更新“事件”的单一实例,那么您可能需要担心争论。如果您更新了不同的实例,那么没有什么可担心的。

我不确定您在争论中的确切含义。 您可能指的是 (a) 交易完整性或 (b) 有限的写作性能。 您在阅读性能方面应该没有问题, 尽管您确实有最终的一致性问题需要处理 。

a) 如果在事件实例更新后您必须读取正确数据,您需要使用按键获取的数据存储器请求。查询请求可以返回旧数据。

(b) 如果您担心写作性能,需要将实体分成多个实体。你也许可以考虑为每个事件设置多个有效载荷实体,比如:

class Payload(db.Model):
    event = db.ReferenceProperty(Events)
    payload = db.StringProperty()

这样您可以分别写入每个有效载荷, 但费用会略高一点, 因为需要将它们索引化, 您需要根据事件来查询它们才能得到它们。 您可能想要将事件设置为祖先, 这样您就可以使用祖先查询来进行一致查询 。





相关问题
How to make logging.debug work on Appengine?

I m having a tough time getting the logging on Appengine working. the statement import logging is flagged as an unrecognized import in my PyDev Appengine project. I suspected that this was just an ...

gqlQuery returns object, want list of keys

Is there a way to convert the GqlQuery object to an array of keys, or is there a way to force the query to return an array of keys? For example: items = db.GqlQuery("SELECT __key__ FROM Items") ...

Integrating Google AppEngine with a Thick Client

I want to make a multi-user client-server solution with Java Swing thick client as a front-end and Google AppEngine (Java one) as a back-end. The problem is that GAE provides only web-based forms for ...

sorl.thumbnail : thumbnail is not a valid tag library?

I am trying to install sorl.thumbnail but am getting the following error message: thumbnail is not a valid tag library: Could not load template library from django.templatetags.thumbnail, No module ...

热门标签