我的应用程序需要一个分布式锁实现。我有许多独立的工作流程,我需要强制执行限制,他们一次只能在一个帐户上工作。
应用程序在c#中使用mongo db层编写。我注意到mongo的cluster balancer使用分布式锁定机制来控制哪些mongos正在进行平衡,我想知道我是否可以在我的应用程序中重用相同的机制?
我宁愿没有实现自己的分布式锁机制的开销,因为所有的工作进程都使用mongo进行接口处理,所以如果我可以重用它们的实现那就太棒了。
答案 0 :(得分:5)
MongoDB中没有固有的文档级锁定或分布式锁驱动程序API。
MongoDB用于分割分割的内部锁定&迁移对分片群集的配置服务器使用两阶段提交模式。您可以自己实现类似的模式,MongoDB文档中有一个示例:Perform Two Phase Commits。
如果您只需要一个信号量来防止工作人员同时更新同一个帐户文档,那么这可能有点过分。更直接的方法是在您的帐户文档中添加一个咨询lock
字段(或嵌入式文档),以指示当前正在使用该文档的工作进程。工作人员启动时可以设置锁定,完成时可以移除锁定。您可能希望锁定信息包含工作进程ID和时间戳,因此可以找到过时的锁定。除去。
请注意,任何方法都需要在您的工作进程之间进行协调,以检查并尊重您的锁定实现。