【问题标题】:Detect when *last* role instance shuts down on Azure检测 *last* 角色实例何时在 Azure 上关闭
【发布时间】:2012-12-15 15:31:40
【问题描述】:

我知道有 RoleEnvironment 事件用于检测 a 角色实例何时关闭或启动,但是,有没有办法检测 last 角色实例何时关闭? (即整个角色正在关闭)

我意识到这在硬件崩溃的情况下不会完全证明,但是当角色被终止以摆脱不再需要的服务总线订阅时,我需要做一些清理工作。

【问题讨论】:

    标签: azure servicebus azure-role-environment


    【解决方案1】:

    一个想法:如果您的角色实例中有一个OnStop() 事件处理程序,您可以枚举该角色的​​实例 (RoleEnvironment.CurrentRoleInstance.Role.Instances) 以查看它是否是列表中唯一的一个。这可能有点问题,因为两个实例可能同时处理OnStop(),但它至少应该让你朝着正确的方向前进。

    【讨论】:

      【解决方案2】:

      注意:这里最初的替代方案只是理论上的:我没有尝试过。

      另一种选择是让代码在启动和关闭时获得一个 BLOB 的租约,该 BLOB 包含所有滚动实例的名称。当一个实例启动时,它会获得一个租约并查看列表是否已经包含它的名称。如果列表中没有它添加到列表中的实例名称,则保存并释放 BLOB 上的租约。

      在运行 OnStop 时关闭每个实例可以获取列表,然后删除它自己的名称,并且它还可以使用 David 提到“清理”的 RoleEnvironment.CurrentRoleInstance.Role.Instances 集合进行快速检查任何可能现在已经死亡但没有机会自行清理的实例名称。如果在您完成时列表为空,那么您就是最后一个实例。

      我仍然认为这不是万无一失的,但至少它解决了 David 提到的问题,因为一次只有一个客户可以在 BLOB 上获得租约。它仍然在很大程度上依赖于 Instances 集合,这些集合有时可能会不断变化。

      在我看来,更好的方法是完全使用角色本身之外的东西,使用服务管理 API 来确定角色是否正在运行,如果没有,则执行清理。当然,在删除订阅之前,您需要做一些额外的检查以 100% 确保角色已关闭,因为有些人不时报告来自 API 的不准确/冲突数据。至少应该使用角色本身之外的某种机制来向您提供警告,表明您的关闭代码可能不起作用。一些为您监控 Azure 服务的第三方提供商甚至可以检测到该角色已关闭并让您运行脚本。

      【讨论】:

        猜你喜欢
        • 2014-10-12
        • 2012-03-03
        • 1970-01-01
        • 2018-03-04
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多