gpt4 book ai didi

php - MongoDB:解决竞争条件的策略

转载 作者:可可西里 更新时间:2023-11-01 09:24:46 26 4
gpt4 key购买 nike

我们有一个场景,我们需要在一个站点模型下存储多个提要,如下所示:

{
id: site_id
name: site_name
feeds: [
{
url: feed_url_1
date: feed_update_date_1
},
{
url: feed_url_2
date: feed_update_date_2
},
...
]
}

由于 feeds 是一个数组,我们可以用 $set$push$addToSet 更新它.

当我们的并发应用程序(队列)尝试更新相同的站点模型时,可能会出现 2 种不同的竞争条件(写入偏斜)。

如果我们选择 $set,并在客户端保护重复项,那么如果 2 个队列正在写入同一个站点,一个 feed 可能会丢失,顺序如下。

Given a wordpress site, extract 2 feeds (RSS and ATOM), dispatch to Q1 and Q2.
Q1: load existing feed, check RSS feed is new
Q2: load existing feed, check ATOM feed is new
Q1: $set feeds => [RSS]
Q2: $set feeds => [ATOM]

现在 RSS 提要丢失了。

如果我们选择 $push$addToSet,则可能会发生以下情况。

User A added a site, putting RSS feed to Q1
User B added the same site, putting the same RSS feed to Q2
Q1: load existing feed, check RSS feed is new
Q2: load existing feed, check RSS feed is new
Q1: $push RSS
Q2: $push RSS

现在 RSS 提要已被复制

如果我们的数据模型只是{ url },那么$addToSet 将防止重复提要。但不幸的是,情况并非如此,date 属性可能不同。所以 $addToSet 并不比 $push 安全多少。

我们已经想到了一些可能的解决方法来解决这个问题,但鉴于我们的时间紧迫,没有一个是很好的。

  1. 将提要从站点分离到它自己的集合中,单独使用 url 进行保护,并相应地更改我们的模型和存储库。

  2. 首先将部分 { url } 插入站点模型,然后用附加信息更新它们,这应该使 $addToSet 可用,但可能会破坏其他要求 date 始终存在的队列(需要测试)。

  3. 让竞争条件按原样发生,首先$push feed,使用后台队列检测重复项并稍后删除它们。

(如果 upsert 与位置查询一起工作,可能会有第四种解决方案,但据我所知,MongoDB v2.4 还没有)

所以我想知道是否有更好的选择来解决这种竞争条件。或者是否有一些最佳实践。

最佳答案

你可能想看看tokumx , 一个支持 transactions 的 mongodb 分支(除了一些其他有用的东西)

关于php - MongoDB:解决竞争条件的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20918396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com