我们需要管理任务的并发操作。简而言之,任何时候只能运行此任务的一个版本。
问题是我们将在多服务器环境中运行。
要求:
- 允许一个方法的实例在任何时候运行一次。 (操作系统互斥体)。
- 必须在多服务器环境中工作。
- 如果进程终止,则必须删除 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/