2

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

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

要求:

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

环境:

  • Windows 服务器(本地)
  • 。网
  • 天蓝色

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

  • 操作系统互斥锁:适用于本地,不确定它是否会在进程死亡时释放锁定。也不确定 Windows 是否支持强大的互斥锁。
  • DB 标志:适用于本地,适用于多服务器。不会在进程死亡时解锁。
  • AppFabric:虽然不需要额外的设置步骤,但可以在本地工作。多服务器工作。尽管可以将锁设置为在获取时超时,但不会在进程死亡时解锁。(迄今为止最好的)
  • CIFS 文件锁:在前提下工作,在多服务器上工作,应该在进程死亡时解锁。尽管这可能是个人偏见,但未能通过稳健的测试。

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

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

4

1 回答 1

1

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

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

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

于 2013-09-11T17:52:09.123 回答