我正在尝试创建一个带有PHP守护进程的分布式系统(通过Upstart),运行SWF决策者和活动,以替换我们的许多cron作业和一些可以在后台异步运行的进程。
然而,有些事情我不确定:
在这些脚本运行时,可能在多台服务器上升级这些脚本的好方法是什么?
如何在升级脚本并重新启动守护程序之前确保所有正在运行的活动完成
由于代码库,我必须坚持使用PHP,但如果需要,这并不排除其他一些“包装”脚本。
答案 0 :(得分:1)
在最糟糕的情况下,您永远无法保证活动工作人员在您杀死活动之前不会接受活动。
你应该解决问题 - SWF活动应该是幂等的,即即使为同一输入多次运行也会给出相同的结果。如果您有长时间的活动(我假设您这样做),请使用心跳让SWF定期知道您的活动是否活跃(如果您有短活动,那么活动超时本身就足够了)。现在,当部署到来并在一台计算机上杀死活动工作程序时,SWF将计划被杀死的活动以便在另一台计算机上进行处理(因为心跳超时或活动超时已到期!)
如果使用心跳构建活动(对于长时间运行的活动和快速活动的小超时),您永远不必担心部署或机器故障,因为任何时候活动工作人员因任何原因而停机,SWF将安排任务给另一个工人。
沿着这些方向,部署的最佳方式是进行交错部署 - 在给定时间点部署到主机的某个部分,并根据其运行状况,继续执行更多部分,直到升级所有主机。这将为SWF提供空间来安排被调度的部署所杀死的活动,并帮助您防止由于部署导致的快速检测到的错误扩散到系统的其他部分。