【发布时间】:2012-02-14 22:43:11
【问题描述】:
在 webrole 的 RoleEntryPoint.OnStart 方法中等待/睡眠是一个好习惯吗?在告诉 Azure 我们已准备好服务请求之前,我们希望确保我们的服务已完全准备就绪。
【问题讨论】:
标签: azure azure-web-roles onstart
在 webrole 的 RoleEntryPoint.OnStart 方法中等待/睡眠是一个好习惯吗?在告诉 Azure 我们已准备好服务请求之前,我们希望确保我们的服务已完全准备就绪。
【问题讨论】:
标签: azure azure-web-roles onstart
是的,您可以在 OnStart 方法中等待一段时间来初始化服务。
OnStart 执行系统的初始化。如果您有一个服务需要在您进入角色的运行状态之前设置和初始化,您需要在退出该方法之前在 OnStart 中对其进行初始化。
在您退出 OnStart 后,角色环境将继续调用 RoleEntryPoint 的 Run 方法。调用下一个方法所需的确切时间是未知的。这也会将您的服务从 RoleInstanceStatus.Busy 移动到 RoleInstanceStatus.Ready,此时角色实例将开始接收流量。
据我所知,角色实例没有初始化超时。 (另一方面,OnStop 方法,当您的实例出于某种原因关闭时,出于实际原因,完成执行的时间有限。不确定,但有一次我听到了 5 或 15 秒。)
【讨论】:
据我所知,当在 OnStart 内部时,角色状态为 Busy,这意味着它向 Fabric Controller 报告它仍处于初始化阶段。我不认为在 OnStart 中睡觉是好是坏,但您可能需要考虑角色启动超时。
我认为更好的办法是将等待逻辑放入带有一些标志的 Run 中,以便在你准备好之前它无法接受请求。
【讨论】:
Run() 中加入人工等待语句。您可以在 OnStart() 中完成所有设置,并且在您准备好添加到负载均衡器之前永远不要离开该方法。
OnStart 方法的目的是执行内部的所有初始化。所以,在这个函数退出后,你的实例应该是完全正常的。在您的情况下,我认为在 OnStart 中稍等片刻是件好事。在此期间,该角色将处于“忙碌”状态,不会接收任何传入的 Web 请求,但仍可以与存储和数据库通信。
在我们的项目中,我们使用 OnStart 从 Blob 存储中下载所有必要的数据,解压并注册它。然后我们检查角色是否健康,然后才离开 OnStart 方法。
【讨论】: