mongodb - 如何在考虑并发性的情况下更新多行?

标签 mongodb concurrency

我有一个 MongoDB 数据库,用作排队系统。它跨多个服务器使用,每个服务器运行多个代码实例。

到目前为止,我一直在使用 find_one_and_delete 来获取下一个待处理的项目,但最近我不幸的是,这个函数非常耗费资源,当集合达到 100k 条目时,MongoDB 速度会变慢很多并且需要几秒钟才能响应。

我不想尝试获取一个条目,而是想通过确保不存在并发冲突来检索该集合上的 X 项。

不幸的是,据我所知,update_many 不包含限制

<小时/>

到目前为止,这是我的想法:

  1. 使用唯一 ID (uuid) 更新所有待处理项目
  2. 查找具有该 uuid 的下 X 个项目,将它们保存在本地并从队列中删除它们
  3. 将 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/

相关文章:

mongodb - 如何在 MongoDB 中更改文档属性

java - 在运行 JUnit/TestNG 测试套件时,是否有任何*真正的*解决方案来利用多核?

java - 可靠地跟踪 Hibernate 所做的更改

javascript - Mongoose "find"返回一个空数组

mongodb - 为 mongo-go-driver 动态创建聚合管道

javascript - Mongoose 的回调()参数无效错误

java - 图像渲染在框架之外?

PostgreSQL - 让两个事务同时运行

php - Apache Benchmark - 并发和请求数

mongodb - mongodb 和 Elasticsearch 的初始同步