【问题标题】:Azure inter-role synchronizationAzure 角色间同步
【发布时间】:2013-02-28 20:29:47
【问题描述】:

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

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

有什么想法吗?

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

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

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

问题:

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

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

【问题讨论】:

  • 为什么你认为队列在这里不起作用?队列是协调需要完成一次的工作的传统方式。肯定有一些细微差别,但 90% 的情况是排队。
  • 我同意大卫的回答,队列通常是一个不错的选择。虽然有时你不能排队。但如果是这种情况,请详细描述您的问题,我们会尽力提供更好的答案。
  • 同时,我已经向 Azure 的 UserVoice 发布了一个想法 - entlib.uservoice.com/forums/… 在队列无法工作的情况下可能有用

标签: azure synchronization azure-worker-roles instances


【解决方案1】:

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

【讨论】:

  • 非常感谢您的回答。实际上,我最初的想法是使用队列进行任务分发和使用 Blob 进行同步,但我使用的是不同的库。我也会拿你的来测试一下。
【解决方案2】:

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

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

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

【讨论】:

  • 一个小的澄清 - 最后一个弹出回执的所有者是唯一可以删除队列消息的人。因此,即使在消息再次“可见”的情况下,它仍然可以被原始阅读器删除,只要它在此期间没有随后出队(这将生成新的弹出收据)。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多