【问题标题】:Windows Azure Run Once RoutineWindows Azure 运行一次例程
【发布时间】:2012-02-17 16:06:37
【问题描述】:

我正在尝试在我的 Azure 数据表中初始化我的数据,但我只希望这在启动时在服务器上发生一次(即通过 WebRole Role Entry OnStart 例程)。问题是,如果我有多个实例同时启动,那么这些实例中的任何一个都可能同时将记录添加到同一个表中,从而在运行时复制数据。

是否有适用于所有实例的总体例程?一个应用程序对象,我可以在其中插入一个值并在每个实例中检查它以查看表是否已创建?天蓝色暴露的某种单身人士?

干杯 抢

【问题讨论】:

    标签: windows azure


    【解决方案1】:

    不,但您可以使用 Blob lease 作为互斥体。如果你正在使用,你也可以在 SQL Azure 中使用表锁。

    【讨论】:

    • 谢谢奥利弗。最后,我创建了一个名为 StartUp 的 Azure 表格存储,其中一个变量“CreatedTables”设置为 false。我有一个 thread.sleep 调用,我传入一个 1 到 30 秒之间的随机数,并将表变量设置为 true 第一次。它是一种享受并防止其他实例初始化表等
    • @PazoozaTestPazman:你确定那里不会有比赛条件吗?例如。两个角色实例同时读取 CreatedTables 并发现它是错误的,并且都认为他们正在初始化?
    • 正如奥利弗所说,存在竞争条件的风险。因此,您可能希望将表与 blob 租约结合起来进行锁定。然后,如果您重新部署并且需要重新运行,则只需处理该值的重置。
    • 好的,感谢您指出我将更改它以包含 blob 租约
    • 仅供参考,Steve Marx blob 租赁解决方案是必经之路。
    【解决方案2】:

    您也可以使用队列,将消息放入其中,然后只有一个角色会拾取消息并进行处理。

    【讨论】:

      【解决方案3】:

      您可以创建一个新的单实例角色,在角色启动时执行此工作。

      【讨论】:

        【解决方案4】:

        要对此非常偏执并解决写入数据过程中的失败事件,您可以做一些更复杂的事情。

        只要您所做的工作是幂等的,队列消息就是确保事务能力的好方法。

        • 每个实例都向队列中添加一条消息。
        • 每个实例都会轮询队列并在接收到消息时

          • 从表中读取锁定行。

            • 如果‘create data state’的值为‘unclaimed’

              • 尝试根据创建数据所需的时间量使用“处理中”值和超时过期时间戳更新行。

              • 如果更新成功,实例拥有创建数据的任务

                • 所以创建数据
                • 将“创建数据状态”更新为“已提交”
                • 删除消息
              • 如果更新不成功,则实例不拥有该任务

                • 所以请删除该消息。
            • 否则,如果“创建数据”值是“处理中”,请检查当前时间是否超过过期时间戳。

              • 这意味着“进行中”失败
              • 所以重新尝试将状态设置为“处理中”,删除不完整的写入行
              • 并尝试重新创建数据、更新状态并删除消息
            • 否则,如果“创建数据”值为“已提交”

              • 只要删除队列消息,因为工作已经完成

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-04
          • 1970-01-01
          • 2023-03-05
          相关资源
          最近更新 更多