Google App引擎(python)更新db.StringListProperty争用/并发问题

时间:2010-07-06 07:48:14

标签: python google-app-engine

我一直在研究google IO“构建可扩展的复杂应用程序”中描述的粉丝消息原则

在其中它建议使用list属性来表示接收者列表是一种可扩展的解决方案。

在这种情况下,如何更新list属性以便争用问题不会介入,如果应用程序正在处理许多用户

使用IO示例:

class message(db.model)
    sender=db.stringproperty()
    body=db.textproperty()

class messageindex(db.model)
    receivers=db.stringlistproperty()

为了适应他们的例子我还需要

class followers(db.model)
    user=db.userproperty()
    followers=db.stringlistproperty()

(代码仅用于示例,未正确输入 - 抱歉)

概念是,如果有人关注您,您将其密钥添加到关注者模型中的关注者列表中,如果您发送消息,则将关注者列表存储在消息列表中 - 并使用简单查询所有用户获取消息 - 非常简单的东西。

问题是更新某些关注者列表。假设一些帐户可能有数百万粉丝 - 如果我只是更新实体他们将成为争用问题 - 一个人还需要多个条目,因为我认为他们是每个列表5000个条目的限制。当然,可以发送请求以“添加”或“删除”某人。什么是最好的方法来做到这一点。我在考虑使用task_queue服务。我正在考虑一个存储每个跟随请求的工作模型,并触发一个任务在60秒内运行。该任务将为人员关注者列表完成所有工作 - 并构建新列表。不确定这是如何工作的 - 但它会停止争用问题,因为只有一个线程可以在一分钟内执行。

有没有人有任何代码示例的好建议,帮助我如何以可扩展的方式做到这一点 - 我不认为m cache可以在方法中使用,因为任何丢失都意味着跟随请求可能会丢失。 / p>

1 个答案:

答案 0 :(得分:1)

我现在已经使用fork-join-queue找到了解决方案。他们是谷歌IO 2010上的一篇文章 - 关于如何做到这一点:

link text