1

例如,我有一个具有两个角色的托管服务,即 web 和 worker。我想暂时摆脱工人角色。有没有简单的方法来实现这一目标?这似乎是一件微不足道的事情。

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

4

4 回答 4

3

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

在此处输入图像描述

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

  • 上传 *.cspkg
  • 部署到登台
  • VIP兑换
  • 删除暂存部署

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

于 2012-08-08T05:40:22.837 回答
1

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

正如 Jim 所说,您可以强制实例重新启动。您甚至可以破坏实例,使它们在重新启动后无法成功启动。

于 2012-08-08T05:40:46.017 回答
1

该线程现在已有几年历史了,但是在我写这个答案时我们仍然遇到同样的问题。

我发现的一种更简洁的方法是在我的 worker wole 的服务配置中引入一个设置,带有一个布尔字符串。

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

请注意,这实际上不会停止工作角色实例的运行,它只会添加一个“功能标志”模式,以防止在角色的 OnRun() 的每次循环迭代期间执行实际工作代码路径。

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

缺点是,如果您试图关闭辅助角色以最小化成本,这将无济于事,因为角色实例将继续运行。

高温高压

于 2014-07-28T18:00:45.650 回答
0

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

拥有单独的部署允许您拥有脚本来在不需要时拆除辅助角色,并在需要时重新部署它。虽然 Sandrino 提供的答案有效,但它需要有 VIP 交换和涉及您不希望受到影响的 Web 角色的全面部署。使用两个单独的部署可以让您将它们分开并仍然获得您想要的结果。

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

于 2012-08-08T10:24:23.917 回答