【问题标题】:Exclusive Lock - Timeout排他锁 - 超时
【发布时间】:2021-05-29 06:14:16
【问题描述】:

我们有十几个多级 YAML 管道负责部署微服务。它们中的每一个都有一个阶段 A,它以启用了独占锁的 EnvA 环境为目标。

独占锁向我们保证了两件事:

  1. 只能执行来自每个管道的最新运行(批处理行为)
  2. 所有管道中只有一个运行可以同时使用 EnvA 环境,其他正在等待环境空闲时

环境还具有 Azure 功能检查,可验证一天中的时间并允许或禁止部署。这意味着例如,Azure Function 允许在 8.00 - 10.00 和 14:00 - 16:00 之间进行部署。

有关此功能的唯一文档是 排他锁检查只允许管道中的一次运行继续进行。该管道的所有运行中使用该资源的所有阶段都将暂停。当使用锁的阶段完成时,另一个阶段可以继续使用该资源。此外,只允许继续一个阶段。任何其他试图获取锁定的阶段都将被取消。 Exclusive lock

没有关于排他锁超时如何工作的任何信息:

它是阶段可以占用 EnvA 环境的最长时间吗?例如,如果超时设置为 10 分钟,但阶段的作业需要 20 分钟,那么在 10 分钟后,锁被释放,下一个管道可以使用这个环境,即使上一个还在进行中吗?

超时开始时,特定管道的阶段何时锁定环境?或者当管道阶段开始并在队列中等待管道 A、B、C、D 释放 EnvA 环境时?

独占锁、已获取、已获取的状态是什么?如何跟踪等待其他管道释放锁的管道队列?

【问题讨论】:

    标签: azure-devops azure-pipelines


    【解决方案1】:

    它是阶段可以占用 EnvA 环境的最长时间吗?例如,如果超时设置为 10 分钟,但阶段的作业需要 20 分钟,那么在 10 分钟后,锁被释放,下一个管道可以使用这个环境,即使上一个还在进行中?

    如果配置独占锁,设置超时值为10分钟,10分钟后不会释放锁,10分钟后会导致下一个管道失败。

    例如,我们将超时时间设置为 10 分钟,将 env 添加到管道 A 和管道 B,运行包含 power shell script Start-Sleep -Seconds 1000 的管道 A,然后运行管道 B。

    结果:

    管道 B 将在 10 分钟后失效。

    另外,如果我们将超时值设置为 10 天。管道 B 将继续检查。当流水线A使用锁完成后,流水线B会继续运行。

    【讨论】:

    • 感谢您的澄清。如果对环境进行额外检查怎么办。调用返回 true 或 false 的 Azure 函数“部署窗口”取决于一天中的时间。您示例中的管道 A 占据了环境。管道 B 的新运行已被触发并调用失败的 Azure 函数检查,我假设由于 Azure 函数检查失败,排他锁超时尚未开始“滴答”,因此甚至不需要获取锁。我的意思是在所有其他检查都为真之前,不需要“独占锁定”环境?
    • 嗨@fenrir,在同一个环境中配置独占锁和调用Azure函数,对吧?如果是,作为测试结果,它将锁定环境,直到前阶段完成。
    • 是的,相同的环境。 Invoke Azure Function 的测试结果是假的,它会开始测量独占锁的超时吗?假设此 Invoke Azure Function 每 5 分钟重新评估一次,在前 5 次尝试中失败,然后在第 6 次评估的 30 分钟后成功,即使测试结果失败或在 30 次之后从头开始测量独占锁定超时管道准备好占用环境的分钟数?
    • 嗨@fenrir,因为原来的问题已经解决了。为了更好地存档票,请您为最新一期提出新的票吗?我们仍然会帮助您解决新票中的问题。另外,如果这个答案有帮助,你会接受它作为答案吗?祝你今天过得愉快。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多