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