我有多个服务器共享一个共同的mongodb。在DB中有一个作业列表,服务器必须完成。由于我想在所有服务器上划分负载并希望避免多个服务器执行相同的工作,我想" Lock"那份工作。
我的想法是:
如果尚未拍摄,则将元素设置为已采用:
db.collection.update({done: false, taken: false},{$set: {taken: true, takenBy: myIp}});
检查服务器是否获得此元素的互斥锁:db.collection.findOne({taken: true, takenBy: myIp})
这是"同步"的最佳方法吗? mongodb上的多个工作服务器(服务器是否在像mysql这样的单个事务中进行更新),还是服务器可以同时执行多个第一个命令?
答案 0 :(得分:3)
此区域中的关键MongoDB功能是对单个文档的更新是原子的。来自the docs:
在MongoDB中,写操作在单个级别上是原子的 文档,即使操作修改了多个嵌入文档 在一份文件中。
当单个写操作修改多个文档时, 每个文件的修改都是原子的,但操作整体 不是原子的,其他操作可能是交错的。但是,你可以 隔离影响多个文档的单个写操作
$isolated
运算符。
所以你的更新:
db.collection.update({done: false, taken: false},{$set: {taken: true, takenBy: myIp}});
这意味着它会自动查找符合条件的文档然后更新它。所以是的,这可以很好地将任务分配给给定的服务器。
有关在MongoDB中实现共享工作队列的更多详细信息,请参阅this other post。提到的一个关键点是使用findAndModify
来执行更新和返回更新的文档。