我想知道同步多个运行相同角色的azure实例的最佳实践。 更确切地说,我想阻止几个工作者角色在同一个工作单位上工作。
Azure队列似乎对此事没有帮助。 一种选择是使用带锁和存储过程的sql表;但在Azure中使用sql同步似乎有点尴尬。
有什么想法吗?
编辑,我的详细(但简化问题)如下:
我的想法是,我有一个调度程序,它将工作单元放在Azure队列中,每个 m 工作人员都会读取这些并处理它们。
问题:
我有一些想法,但它们看起来不够多云,所以我很有兴趣看看你会解决这个问题的解决方案。
答案 0 :(得分:4)
我刚刚写了几篇关于使用blob leases来做这类事情的博客文章。请参阅http://blog.smarx.com/posts/managing-concurrency-in-windows-azure-with-leases和http://blog.smarx.com/posts/building-a-task-scheduler-in-windows-azure。
答案 1 :(得分:2)
dunnry是spot-on:队列非常适合阻止多个实例处理同一个工作项。当您调用GetMessage
时,您检索的消息现在在您指定的时间范围内不可见(默认值:30秒)。在该时间跨度内,没有其他读者可以检索此队列消息。
话虽如此:您需要确保您的处理是幂等的。如果您的处理时间超过隐身时间跨度,则消息将再次可见。此时,原始阅读器无法删除该消息,而其他阅读器可以阅读该消息(使其再次不可见)。在这种情况下,您可能会重新处理相同的消息。您需要仔细设置超时窗口以避免这种情况作为一般规则。
注意:每个CloudQueueMessage
都有一个DequeueCount
属性,因此您可以确定该邮件是否被多次查看(因此您还可以处理有害邮件)。
答案 2 :(得分:0)
CloudFX有一个PrimaryInstanceManager类,可用于其中一些场景。