请考虑SQL Server中的以下表: Tasks(Payload nvarchar,DateToExecute datetime,DateExecuted datetime null)。
现在我们有两个工作进程(在我们的示例中有两个Azure辅助工作角色实例)。它们都会定期尝试获取 DateExecuted IS NULL和DateToExecute< = GETDATE()的记录。然后他们处理该记录并将(SQL更新) DateExecuted 设置为当前日期。
问题是单个任务应该只由一个工作者实例处理一次。
提供同步或锁定以实现此类方案的最佳方式是什么?
答案 0 :(得分:1)
在Windows Azure中锁定多个角色/实例的最简单方法是使用blob租约。史蒂夫马克思为此创建了一个伟大的类,称为AutoRenewLease(source,NuGet,blog post)。如果您已经有一个计时器或while循环,您可以编写如下代码:
using (var arl = new AutoRenewLease(leaseBlob))
{
if (arl.HasLease)
{
// Query Tasks table and do work....
}
else
{
// Other worker is busy....
}
}
或者您可以使用DoEvery方法,该方法允许您每隔X分钟安排一次代码:
AutoRenewLease.DoEvery(leaseBlob, TimeSpan.FromMinutes(15), () => {
// Query Tasks table and do work....
});