Azure角色间同步

时间:2011-08-31 14:43:18

标签: azure synchronization azure-worker-roles instances

我想知道同步多个运行相同角色的azure实例的最佳实践。 更确切地说,我想阻止几个工作者角色在同一个工作单位上工作。

Azure队列似乎对此事没有帮助。 一种选择是使用带锁和存储过程的sql表;但在Azure中使用sql同步似乎有点尴尬。

有什么想法吗?

编辑,我的详细(但简化问题)如下:

  • n 目标。
  • 必须按指定的时间间隔(例如30秒 - 对每个目标进行一个工作单元 - 但每个目标的工作单位不同。)
  • 我有 m 工作人员(托管在 h 实例中)。
  • 处理工作单位可能需要10秒到1小时。

我的想法是,我有一个调度程序,它将工作单元放在Azure队列中,每个 m 工作人员都会读取这些并处理它们。

问题:

  • worker1 开始处理 unit1 (关于 target1 ) - 这个需要很长时间,比如10分钟
  • 30秒后通过
  • 调度程序为 target1 设置了另一个工作单元,例如 unit13
  • worker2 开始使用 unit13 ,针对相同的 target1 - 不好

我有一些想法,但它们看起来不够多云,所以我很有兴趣看看你会解决这个问题的解决方案。

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

dunnry是spot-on:队列非常适合阻止多个实例处理同一个工作项。当您调用GetMessage时,您检索的消息现在在您指定的时间范围内不可见(默认值:30秒)。在该时间跨度内,没有其他读者可以检索此队列消息。

话虽如此:您需要确保您的处理是幂等的。如果您的处理时间超过隐身时间跨度,则消息将再次可见。此时,原始阅读器无法删除该消息,而其他阅读器可以阅读该消息(使其再次不可见)。在这种情况下,您可能会重新处理相同的消息。您需要仔细设置超时窗口以避免这种情况作为一般规则。

注意:每个CloudQueueMessage都有一个DequeueCount属性,因此您可以确定该邮件是否被多次查看(因此您还可以处理有害邮件)。

答案 2 :(得分:0)

CloudFX有一个PrimaryInstanceManager类,可用于其中一些场景。