1

我有一个 Azure 工作者角色,其工作是定期针对 SQL Azure 数据库运行一些代码。这是我当前的代码:

const int oneHour = 216000000; // milliseconds

while (true)
{
    var numConversions = SaveSeedsToSQL.ConvertRemainingPotentialQueryURLsToSeeds();
    SaveLogEntryToSQL.Save(new LogEntry { Count = numConversions });
    Thread.Sleep(oneHour);
}

Thread.Sleep(216000000) 是对此类定期但不频繁的事件进行编程的最佳方式,还是我应该使用某种针对 Azure 辅助角色的唤醒和再次运行机制?

4

1 回答 1

3

这段代码当然可以,但是有一些问题:

  1. 你可能会在某个地方失败,而这个时间表就会被全部取消。如果您必须在特定时间实际执行此操作,这一点很重要。
  2. 这里没有并发控制。如果您希望某事只完成一次,您需要一种机制,以便单个实例执行该工作而其他实例不执行。

这个问题有几个解决方案:

  • 在角色上运行 Windows 调度程序(内置)。这解决了问题 1,但不是问题 2。
  • 运行 Quartz.NET 并安排事情。这解决了#1,取决于你如何做,还有#2。
  • 在服务总线或 Windows Azure 队列中使用未来计划的队列消息。这两个都解决了。

前两个选项适用于警告,所以我认为最后一个选项值得更多关注。您可以简单地创建您的角色能够理解的消息并将其发布到队列中。一旦时间到了,它就会变得可见,您通常的投票角色会看到它并可以对其进行处理。这里的好处是它既是时间准确的,又是单个实例对其进行操作,因为它是一个队列消息。完成工作后,您可以让实例安排下一个并将其发布到队列中。我们一直在使用这种技术。您只需要小心,如果由于某种原因您的角色在安排下一个角色之前失败,整个系统就会失败。您应该在那里进行一些健全性检查和保护措施。

于 2012-06-25T14:16:19.887 回答