【问题标题】:Wait/Sleep inside Azure WebRole OnStart method在 Azure WebRole OnStart 方法中等待/睡眠
【发布时间】:2012-02-14 22:43:11
【问题描述】:

在 webrole 的 RoleEntryPoint.OnStart 方法中等待/睡眠是一个好习惯吗?在告诉 Azure 我们已准备好服务请求之前,我们希望确保我们的服务已完全准备就绪。

【问题讨论】:

    标签: azure azure-web-roles onstart


    【解决方案1】:

    是的,您可以在 OnStart 方法中等待一段时间来初始化服务。

    OnStart 执行系统的初始化。如果您有一个服务需要在您进入角色的运行状态之前设置和初始化,您需要在退出该方法之前在 OnStart 中对其进行初始化。

    在您退出 OnStart 后,角色环境将继续调用 RoleEntryPoint 的 Run 方法。调用下一个方法所需的确切时间是未知的。这也会将您的服务从 RoleInstanceStatus.Busy 移动到 RoleInstanceStatus.Ready,此时角色实例将开始接收流量。

    据我所知,角色实例没有初始化超时。 (另一方面,OnStop 方法,当您的实例出于某种原因关闭时,出于实际原因,完成执行的时间有限。不确定,但有一次我听到了 5 或 15 秒。)

    【讨论】:

    • 有初始化超时。 Microsoft 服务告诉我,角色有 15 分钟的时间进入就绪状态,否则其他更新域将被关闭以进行更新。这意味着您的所有角色都可以立即被取消。我们的 Azure 应用程序刚刚陷入困境 - 在自动 Azure OS 升级期间,工作角色花费了 15 多分钟来完成其启动任务(我们的问题),然后 Azure 开始升级另一个更新域中的角色。这意味着更新域和我们的应用程序中的角色同时关闭。
    • 操作系统升级的超时记录在这里msdn.microsoft.com/en-us/library/windowsazure/hh543978.aspx
    【解决方案2】:

    据我所知,当在 OnStart 内部时,角色状态为 Busy,这意味着它向 Fabric Controller 报告它仍处于初始化阶段。我不认为在 OnStart 中睡觉是好是坏,但您可能需要考虑角色启动超时。

    我认为更好的办法是将等待逻辑放入带有一些标志的 Run 中,以便在你准备好之前它无法接受请求。

    【讨论】:

    • 不知道为什么建议在Run() 中加入人工等待语句。您可以在 OnStart() 中完成所有设置,并且在您准备好添加到负载均衡器之前永远不要离开该方法。
    • 据我所知,将应用程序保持在 OnStart 将使部署状态保持在忙碌状态。我记得角色初始化有一个超时。如果完成 OnStart 的时间太长,我猜 Fabric 控制器可能会报告部署失败。
    【解决方案3】:

    OnStart 方法的目的是执行内部的所有初始化。所以,在这个函数退出后,你的实例应该是完全正常的。在您的情况下,我认为在 OnStart 中稍等片刻是件好事。在此期间,该角色将处于“忙碌”状态,不会接收任何传入的 Web 请求,但仍可以与存储和数据库通信。

    在我们的项目中,我们使用 OnStart 从 Blob 存储中下载所有必要的数据,解压并注册它。然后我们检查角色是否健康,然后才离开 OnStart 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 2012-10-29
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      相关资源
      最近更新 更多