【问题标题】:Tasks in SQL Server and multiple worker role instancesSQL Server 中的任务和多个辅助角色实例
【发布时间】:2012-12-03 13:27:33
【问题描述】:

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

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

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

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

【问题讨论】:

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


【解决方案1】:

在 Windows Azure 中锁定多个角色/实例的最简单方法是使用 blob 租约。 Steve Marx 为此创建了一个名为 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....
});

【讨论】:

  • 存储客户端库现在也处理租约,而在史蒂夫创建该库时它还没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 2015-07-31
  • 2013-09-23
  • 1970-01-01
相关资源
最近更新 更多