Azure:停止角色而不停止托管服务中的所有其他角色

时间:2012-08-08 05:04:34

标签: azure

作为一个例子,我有一个托管服务,有两个角色,web和worker。我想暂时摆脱工人的角色。有没有一种简单的方法来实现这一目标?这似乎应该是微不足道的。

在azure门户网站中,如果我选择其中一个角色并点击STOP,它将停止托管服务中的所有角色。在Visual Studio中,我可以从“角色”文件夹中删除该角色并重新发布,但是当我想再次启动该角色时,我将不得不经历添加角色的整个过程;和一个看似不必要的出版物。

4 个答案:

答案 0 :(得分:3)

目前,如果不重新发布您的申请,您将无法执行此操作。但是有一种简单的方法可以在Visual Studio中管理它。您可以创建2个Azure项目,一个使用WorkerRole,另一个不使用WorkerRole(请注意,您需要复制为WebRole配置的所有内容,例如证书,服务配置......):

enter image description here

为了使这个部署过程更容易,我建议您编写一个执行以下操作的PowerShell脚本(例如):

  • 上传* .cspkg
  • 部署到暂存
  • VIP交换
  • 删除暂存部署

无论如何,将实例数改为0对你来说是完美的解决方案,但目前还不可能。产品团队的某个人确认此功能即将推出,但它只会在2012年秋季之后发布。请投放功能here

答案 1 :(得分:1)

不,不是没有重新部署,因为角色是在ServinceDefinition中定义的,并且一旦部署了服务就无法更改。您可以更改ServiceConfiguration(例如角色实例的数量,但不能更改为零)。

正如吉姆所说,你可以强制实例重启。你甚至可能会破坏实例,这样他们就不会在重启后成功启动。

答案 2 :(得分:1)

这个帖子现在已经有几年了,但是我写这个答案时仍然遇到同样的问题。

我发现的一种更清洁的方法是在我的工作人员的服务配置中引入一个设置,带有一个布尔字符串。

然后,在我的WorkerRole.OnRun()中,我可以利用设置标志来使用if语句来影响代码执行路径。

请注意,这实际上不会阻止Worker Role实例运行,它只会添加一个"功能标记"在角色的OnRun()的每次循环迭代期间阻止实际工作者代码路径执行的模式。

这样做的好处是,如果我从Azure Mgmt Portal更新设置,它将强制角色重新启动并获取新的设置值。

如果您尝试关闭工作人员角色以最大限度地降低成本,那么这将无法帮助您,因为角色实例将继续运行。

HTH

答案 3 :(得分:0)

另一种解决方案是,您可以在一个部署中运行Web角色,在另一个部署中运行辅助角色。只要您的解决方案不需要角色直接相互通信,那么应该没问题。例如,如果实例与每个队列进行通信,则两个部署都可以使用相同的存储连接字符串(或Service Bus命名空间)。

通过单独部署,您可以使用脚本在不需要时删除辅助角色,并在执行时重新部署。虽然Sandrino提供的答案有效,但它需要进行VIP交换和涉及您不希望受影响的Web角色的完整部署。使用两个单独的部署允许您将这些分开,并仍然获得所需的结果。

如果角色确实需要在没有共享中介(如队列或数据库)的情况下直接相互通信,那么Sandrino的答案看起来是一个不错的选择。此外,请务必投票支持他链接的功能。