0

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

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

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

为实现这种场景提供同步或锁定的最佳方式是什么?

4

1 回答 1

1

在 Windows Azure 中锁定多个角色/实例的最简单方法是使用 blob 租约。Steve Marx 为此创建了一个很棒的类,称为 AutoRenewLease(来源NuGet博客文章)。如果您已经有一个计时器或 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....
});
于 2012-12-03T13:39:57.377 回答