我在Azure上将自定义角色作为云服务(经典)。我已计划在工作时间(5)和其他时间(20)自动缩放实例数量。
有时候,当某些工作人员正在使用命令时会出现问题,但这是营业时间的开始,因此实例被“杀死”(按比例缩小)。结果命令没有完成。命令是来自Azure队列的消息。因此基本上,消息将返回到队列。但是另一个工作人员需要一些时间才能再次获取该消息。
因此,问题-只有在完成使用消息/命令的工作人员之后,才有自动缩放工作人员的方法吗?
答案 0 :(得分:1)
您的角色的 OnStop
将在被拆除时被调用。根据文档:
一旦 OnStop 方法执行完毕,角色将 停了下来。如果其他代码需要时间优雅退出,你应该 保持 OnStop 线程忙碌,直到执行完成。
您可以利用这 5 分钟的宽限期从角色实例中清除活动工作。如果您在整个任务中共享取消令牌,例如,您可以在 OnStop
期间取消正在进行的工作并处理取消以立即使工作再次在队列中可见,而不是等待超时。
答案 1 :(得分:0)
请参见How to Stop single Instance/VM of WebRole/WorkerRole上的答案。
简而言之,您可以使用Delete Role Instances API(https://docs.microsoft.com/en-us/previous-versions/azure/reference/dn469418(v=azure.100))来指定要关闭的角色实例。但是,这不适用于自动缩放,因此您必须编写一些代码来确定要关闭的实例。
通常,更好的解决方案是确保辅助角色实例正在执行的工作是幂等的,并且可以轻松地恢复。听起来您已经设计好了,但所需的时间却有问题,在这种情况下,您可能有机会将每个“命令”分解为较小的工作单元,以便在处理该命令时可以保持进度稍后由新实例拾取。