我使用Azure Cloud Worker Role来处理队列中的传入任务 . 每个任务的处理可能需要几个小时,每个工作者角色可以同时处理多达N个任务 . 基本上,它正在发挥作用 .
现在,您可以阅读documentation,有时可以关闭辅助角色(用于软件更新,操作系统升级,...) . 基本上,这很好 . 但是, this planned shutdown cannot forcedly stop the worker-role already running tasks .
预期:
在环境中调用OnStop()方法时:
-
worker角色将停止获取要处理的新任务 .
-
等待运行任务完成 .
-
继续计划关机 .
实际:
OnStop()方法可以阻止最多 5 minutes . 我无法保证我将在5分钟内完成任务 - 所以,这是问题...我的任务是在处理过程中被杀死,这对我的软件来说变得不稳定 .
我怎么能避免这5分钟的限制?任何小费都将受到欢迎 .
2 回答
不幸的是,你做不到 . 这是Azure方面施加的硬限制 . 你需要解决这个问题 .
我能想到两种可能的解决方案,它们都需要您重新考虑当前的架构:
将您的一项大任务分解为许多较小的任务并创建某种工作流程 .
使您的任务具有幂等性,以便即使它在两者之间被终止(由于工作者角色关闭或任务本身中的错误)以及当它被另一个实例接收时,它也会以这样的方式再次启动,即您的任务输出是没有腐败 .
不,你不能绕过这个限制 . 通常,您不应该依赖任何长时间连续运行的实例 . 实例可能会突然停止或突然消失(因为基础服务器故障) . 您的软件应设计为当重新启动实例(可能已重新部署)或某个其他实例找到容量以获取先前释放的工作项时,将重新处理工作项而不会产生任何不利影响 .