Google App Engine(Python)更新 db.StringListProperty 的竞争/并发问题

1 投票
1 回答
688 浏览
提问于 2025-04-16 00:52

我一直在研究谷歌IO大会上提到的消息分发原则,特别是在“构建可扩展的复杂应用”这部分。

里面提到,使用一个列表属性来存储接收者的列表是一种可扩展的解决方案。

在这种情况下,如何更新这个列表属性,以避免在处理很多用户时出现竞争问题呢?

以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个。此外,当然也会有请求来“添加”或“移除”某个人。那么,最好的解决办法是什么呢?我在考虑使用任务队列服务。我想到了一个工作模型,存储每个关注请求,并在大约60秒后触发一个任务。这个任务会处理某个人的关注者列表,并构建新的列表。我不太确定这样做是否可行,但这样可以避免竞争问题,因为在一分钟内只有一个线程可以执行。

有没有人能提供一些代码示例、好的建议或帮助,告诉我如何以可扩展的方式做到这一点——我觉得缓存可能不适合这种方法,因为任何丢失都可能导致关注请求丢失。

1 个回答

1

我现在找到了一个解决方案,使用了一个叫做“分叉-合并-队列”的方法。在2010年的Google IO大会上,有一篇文章讲解了这个是怎么做的:

链接文本

撰写回答