2011-08-31 74 views
5

我在想同步运行相同角色的多个azure实例的最佳做法。 更准确地说,我想阻止几个工人角色在同一个工作单元上工作。Azure角色间同步

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

任何想法?

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

  • ñ目标。
  • 必须以指定的时间间隔(例如30秒 - 每个目标不同)对每个目标执行一个工作单元。
  • 我有m工人(托管在h实例)。
  • 处理工作单元可能需要10秒到1小时之间的任何时间。

的想法是,我有一个调度是把工作单位在Azure的队列,并且每个工人将这些读取并处理它们。

问题:

  • worker1开始对1单元(这是关于目标1)工作 - 这个人会需要很长时间,说10分钟
  • 经过30秒
  • 的调度程序为目标1提供另一个工作单元,比如说说单元13
  • worker2开始工作unit13,对同一目标1 - 不好

我有一些想法,但他们似乎并不阴天不够,所以我有兴趣看看你会为这个问题申请什么解决方案。

+2

为什么你认为队列在这里不起作用?队列是协调需要一次完成的工作的传统方式。确实有一些细微差别,但90%的情况是与队列。 – dunnry

+0

我同意戴维的回答,排队通常是一个不错的选择。虽然有时候你不能排队。但是,如果是这种情况,请详细描述您的问题,我们会尽力提供更好的答案。 –

+0

与此同时,我已经发布了一个用于Azure UserVoice的创意 - http://entlib.uservoice.com/forums/101257-windows-azure-integration-pack/suggestions/2050987-distributed-synchronization?ref=title在队列不起作用的情况下可能对这些情况有用 –

回答

2

dunnry是spot-on:队列很适合阻止多个实例在同一个工作项上工作。当您拨打GetMessage时,您检索的消息现在对于您指定的时间范围是不可见的(默认值:30秒)。在那个时间段内,没有其他读者可以检索到这个队列消息。

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

注意:每个CloudQueueMessage都有一个DequeueCount属性,因此您可以确定消息是否被多次查看过(因此您也可以处理毒讯息)。

+0

一个小小的说明 - 最后一个弹出式收据的所有者是唯一一个可以删除队列消息的人。因此,即使在邮件再次“可见”的情况下,只要邮件没有在临时邮件中退出(这将生成新邮件收据),它仍然可以被原始阅读器删除。 – dunnry