5

我想知道同步运行相同角色的多个 azure 实例的最佳实践。更准确地说,我想防止多个工人角色在同一个工作单元上工作。

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

有任何想法吗?

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

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

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

问题:

  • worker1开始在unit1上工作(这是关于target1) - 这需要很长时间,比如 10 分钟
  • 30秒过去
  • 调度程序为target1放置另一个工作单元,例如unit13
  • worker2开始在unit13上工作,针对相同的target1 -不好

我有一些想法,但它们似乎不够多云,所以我很想看看你会为这个问题应用什么解决方案。

4

3 回答 3

4

我刚刚写了几篇关于使用 blob 租约来做这类事情的博客文章。请参阅http://blog.smarx.com/posts/managing-concurrency-in-windows-azure-with-leaseshttp://blog.smarx.com/posts/building-a-task-scheduler-in-windows -天蓝色

于 2011-09-07T06:17:41.297 回答
2

dunnry 很准确:队列非常适合防止多个实例处理同一个工作项。当您调用GetMessage时,您检索的消息现在在您指定的时间跨度内不可见(默认值:30 秒)。在那个时间跨度内,没有其他阅读器可以检索此队列消息。

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

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

于 2011-08-31T19:39:52.123 回答
0

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

于 2013-02-28T12:29:47.183 回答