SQL Server中的任务和多个辅助角色实例

时间:2012-12-03 13:27:34

标签: sql sql-server azure azure-worker-roles

请考虑SQL Server中的以下表: Tasks(Payload nvarchar,DateToExecute datetime,DateExecuted datetime null)

现在我们有两个工作进程(在我们的示例中有两个Azure辅助工作角色实例)。它们都会定期尝试获取 DateExecuted IS NULL和DateToExecute< = GETDATE()的记录。然后他们处理该记录并将(SQL更新) DateExecuted 设置为当前日期。

问题是单个任务应该只由一个工作者实例处理一次。

提供同步或锁定以实现此类方案的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

在Windows Azure中锁定多个角色/实例的最简单方法是使用blob租约。史蒂夫马克思为此创建了一个伟大的类,称为AutoRenewLease(sourceNuGetblog 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....
});