Mongodb 如何在考虑并发性的情况下使用限制更新多行?
我有一个MongoDB数据库,用作排队系统。它跨多个服务器使用accross,每个服务器运行多个代码实例 到目前为止,我一直在使用Mongodb 如何在考虑并发性的情况下使用限制更新多行?,mongodb,concurrency,Mongodb,Concurrency,我有一个MongoDB数据库,用作排队系统。它跨多个服务器使用accross,每个服务器运行多个代码实例 到目前为止,我一直在使用find_one_和_delete来获取下一个待处理的项目,但我最近遇到了一个不幸,即此功能非常占用资源,当收集量达到10万个条目时,MongoDB的速度会减慢很多,并且需要几秒钟才能响应 我不想尝试获取一个条目,而是想通过确保不存在并发冲突来检索该集合上的X项 不幸的是,据我所知,许多更新不包括限制 到目前为止,我想到的是: 使用唯一ID(uuid)更新所有待定项
find_one_和_delete
来获取下一个待处理的项目,但我最近遇到了一个不幸,即此功能非常占用资源,当收集量达到10万个条目时,MongoDB的速度会减慢很多,并且需要几秒钟才能响应
我不想尝试获取一个条目,而是想通过确保不存在并发冲突来检索该集合上的X项
不幸的是,据我所知,许多更新不包括限制
到目前为止,我想到的是:
我在这里要问的是,是否有一种方法可以更快地(在更新时使用
limit
)和面向并发的方式来实现这一点?值得尝试将MongoDB事务作为并发安全机制
- 使用事务创建会话
- 检索X条记录,
collection.find().limit(X)
- 删除X条记录,
collection.deleteMany({u id:{$in:[id]}})
- 提交事务并关闭会话
这将很快,因为现在您不必迭代文档来获取Mongoid或确定要删除的记录,Mongo将为您完成这些操作。另一个方向-使用多个数据库。为此,请使用经过良好调优的专用Maria Db实例?用过。只要开发和运营团队是开放的,并且可以使用一些自动化和工具来完成他们的工作,这样就可以轻松处理2倍的数据库。我已经实现了你想要的。你感兴趣吗?谢谢,我已经给了你赏金。哇,这是我第一次赏金:)谢谢,希望答案对你有帮助:)谢谢!需要考虑的一个关键点是,这仅在MongoDB位于sharded或replicat集合上时有效!否则,事务就不起作用了:有趣的是,它们似乎有这样的限制。谢谢你指出这一点