mongodb - 复用mongo内部分布式锁

标签 mongodb locking distributed

我的应用程序需要一个分布式锁实现。我有许多独立的工作进程,我需要强制执行一项限制,即它们一次只能在一个帐户上工作。

该应用程序是用 c# 编写的,带有一个 mongo 数据库层。我注意到 mongo 的 cluster balancer使用分布式锁机制来控制哪个 mongos 正在做平衡,我想知道我是否可以在我的应用程序中重用相同的机制?

我宁愿没有实现自己的分布式锁机制的开销,因为所有工作进程都已经与 mongo 接口(interface),所以如果我可以重用它们的实现就太好了。

最佳答案

MongoDB 中没有固有的文档级锁定或分布式锁定驱动程序 API。

MongoDB 用于分片拆分和迁移的内部锁针对分片集群的配置服务器使用两阶段提交模式。您可以自己实现类似的模式,MongoDB 文档中有一个示例:Perform Two Phase Commits .

如果您只需要一个信号量来防止工作人员同时更新同一帐户文档,那么这可能有点矫枉过正。一种更直接的方法是向您的帐户文档添加一个咨询性 lock 字段(或嵌入式文档)以指示当前正在使用该文档的工作进程。锁可以在 worker 启动时设置,并在它完成时移除。您可能希望锁信息包括工作进程 ID 和时间戳,以便可以找到并删除陈旧的锁。

请注意,任何方法都需要在您的工作进程之间进行协调,以检查并尊重您的锁定实现。

关于mongodb - 复用mongo内部分布式锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14174255/

相关文章:

java - 管理分布在多台机器上的大量日志文件

meteor - 设置一台 meteor 服务器订阅另一台 meteor 服务器?

java - 使用 Java 连接到 Azure 中的 MongoDB

node.js - insertMany处理重复错误

mongodb - 用 Mongoose 保存在 mongoDb 中,保存了意外的元素

c++ - 在一个函数中创建多个lock_guards

jdbc - Spring Integration JDBC 锁失败

javascript - 如何在 mongodb (mongoose) 中覆盖子文档的数组属性

linux - 在 Linux 中锁定串行端口和其他设备的最佳做法是什么?

python - Kafka 检查队列大小