例如,我有一个具有两个角色的托管服务,即 web 和 worker。我想暂时摆脱工人角色。有没有简单的方法来实现这一目标?这似乎是一件微不足道的事情。
在 azure 门户中,如果我选择其中一个角色并点击 STOP,它将停止托管服务中的所有角色。在 Visual Studio 中,我可以从“角色”文件夹中删除角色并重新发布,但是当我想重新启动该角色时,我必须完成添加角色的整个过程;以及看似不必要的发布。
例如,我有一个具有两个角色的托管服务,即 web 和 worker。我想暂时摆脱工人角色。有没有简单的方法来实现这一目标?这似乎是一件微不足道的事情。
在 azure 门户中,如果我选择其中一个角色并点击 STOP,它将停止托管服务中的所有角色。在 Visual Studio 中,我可以从“角色”文件夹中删除角色并重新发布,但是当我想重新启动该角色时,我必须完成添加角色的整个过程;以及看似不必要的发布。
目前,如果不重新发布您的应用程序,您将无法执行此操作。但是在 Visual Studio 中有一种简单的方法来管理它。您可以创建 2 个 Azure 项目,一个带有 WorkerRole,一个没有 WorkerRole(请注意,您需要复制为 WebRole 配置的所有内容,例如证书、服务配置……):
为了让这个部署过程更容易一些,我建议你编写一个 PowerShell 脚本来执行以下操作(例如):
无论如何,将实例数更改为 0 对您来说是完美的解决方案,但目前这是不可能的。产品团队的某个人确认该功能将会推出,但它只会在 2012 年秋季之后发布。在此处投票支持该功能。
不,如果不重新部署就不行,因为角色是在 ServinceDefinition 中定义的,一旦部署了服务,就无法更改。您可以更改 ServiceConfiguration(例如角色实例的数量,但不能为零)。
正如 Jim 所说,您可以强制实例重新启动。您甚至可以破坏实例,使它们在重新启动后无法成功启动。
该线程现在已有几年历史了,但是在我写这个答案时我们仍然遇到同样的问题。
我发现的一种更简洁的方法是在我的 worker wole 的服务配置中引入一个设置,带有一个布尔字符串。
然后,在我的 WorkerRole.OnRun() 中,我可以利用设置标志通过 if 语句影响代码执行路径。
请注意,这实际上不会停止工作角色实例的运行,它只会添加一个“功能标志”模式,以防止在角色的 OnRun() 的每次循环迭代期间执行实际工作代码路径。
这样做的好处是,如果我从 Azure Mgmt 门户更新设置,它将强制角色重新启动并获取新的设置值。
缺点是,如果您试图关闭辅助角色以最小化成本,这将无济于事,因为角色实例将继续运行。
高温高压
另一种解决方案是您可以在一个部署中运行 Web 角色,而在另一个部署中运行辅助角色。只要您的解决方案不需要角色直接相互通信,那么应该没问题。例如,如果实例通过队列与每个实例通信,则两个部署都可以使用相同的存储连接字符串(或服务总线命名空间)。
拥有单独的部署允许您拥有脚本来在不需要时拆除辅助角色,并在需要时重新部署它。虽然 Sandrino 提供的答案有效,但它需要有 VIP 交换和涉及您不希望受到影响的 Web 角色的全面部署。使用两个单独的部署可以让您将它们分开并仍然获得您想要的结果。
如果角色确实需要在没有一些共享中介(如队列或数据库)的情况下直接相互通信,那么 Sandrino 的答案看起来是一个不错的选择。另外,请务必为他链接的功能投票。