我有一个 MongoDB 数据库,用作排队系统。它跨多个服务器使用,每个服务器运行多个代码实例。
到目前为止,我一直在使用 find_one_and_delete
来获取下一个待处理的项目,但最近我不幸的是,这个函数非常耗费资源,当集合达到 100k 条目时,MongoDB 速度会变慢很多并且需要几秒钟才能响应。
我不想尝试获取一个条目,而是想通过确保不存在并发冲突来检索该集合上的 X 项。
不幸的是,据我所知,update_many 不包含限制
。
到目前为止,这是我的想法:
- 使用唯一 ID (uuid) 更新所有待处理项目
- 查找具有该 uuid 的下 X 个项目,将它们保存在本地并从队列中删除它们
- 将 uuid 的所有其他项目更新为 None(释放它们)。
这不太很好,但在我的情况下,它解决了问题并且看起来工作正常。
我在这里问的是,是否有一种方法可以通过 MongoDB 以更快的速度(在 update_many 上使用 limit
)和面向并发的方式做到这一点?
最佳答案
值得尝试 Mongodb 事务作为并发安全机制。
- 使用事务创建 session
- 检索 X 条记录,
collection.find().limit(X)
- 删除 X 条记录,
collection.deleteMany({ _id: { $in: [IDs] } })
- 提交事务并关闭 session
有关交易的更多信息请参见此处
关于mongodb - 如何在考虑并发性的情况下更新多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59855580/