.net - 分布式锁机制.NET

标签 .net windows locking mutex

我们需要管理任务的并发操作。简而言之,任何时候只能运行此任务的一个版本。

问题是我们将在多服务器环境中运行。

要求:

  • 允许一个方法的实例在任何时候运行一次。 (操作系统互斥体)。
  • 必须在多服务器环境中工作。
  • 如果进程终止,则必须删除 Mutex。
  • 必须是稳健且成熟的解决方案。

环境:

  • Windows Server(本地)
  • .Net
  • 蔚蓝

到目前为止我考虑的事情:

  • OS mutex:适用于内部部署,不确定它是否会释放锁 过程死亡。也不确定 Windows 是否支持强大的互斥量。
  • DB Flag:适用于内部部署,适用于多服务器。不会解锁 过程死亡。
  • AppFabric:尽管需要额外的设置步骤,但可以在内部运行 不受欢迎的。适用于多服务器。虽然不会在进程死亡时解锁 锁可以设置为在获取时超时。 (迄今为止最好的)
  • CIFS 文件锁:在前提下工作,在多服务器上工作,应该解锁 关于进程死亡。未能通过稳健测试,尽管这可能是个人原因 偏见。

我想这是一个相当普遍的问题,我很想知道社区通常是如何解决它的。

我特别想听听有关 CIFS 锁定解决方案或是否可以使用 MSMQ 的想法?

最佳答案

如果您可以使用 Windows Azure 存储,那么您可以使用 Windows Azure Blob 获取该 Blob 的租约,并设置超时(您可以使用的最大值为 1 分钟)。获得租约的服务器可以运行任务,并且可以在租约到期前不断更新租约。

其他服务器将继续尝试获取租约,以防领导进程死亡。

您轮询的频率取决于立即恢复其他进程的重要性,但可能会导致一些额外成本(如果太频繁并且取决于您有多少服务器轮询竞争该租约,这可能不是边际成本).

关于.net - 分布式锁机制.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18376587/

相关文章:

windows - 为 x86 和 x64 编译

c - 在 Windows 上将命令通过管道传输到缓冲区

c# - 加载外部 app.config 会锁定它吗?

c++ - 为什么锁定会减慢顺序文件解析器的速度?

c# - Task.Run() 中的异步/等待操作

c# - 在 .NET C# 中截断整个单词的字符串

windows - WinAPI 调用访问没有盘符的 USB 存储?

.net - 日语、中文和韩语等语言的 KeyUp/KeyDown 替代方案?

c# - 在内存中创建 Zip 存档,并从 web api 返回它

python - portalocker 似乎没有锁定