我一直在使用supervisord一段时间 - 杰出的工具。我无法弄清楚的一个用例是,如何配置要重新启动的作业,直到满足条件,然后停止重新启动。
示例:让我们说你有很多工作要做,比如扩展成千上万的图像,或者为队列中的数百万个请求提供服务。一个有用的模式是并行运行许多工作人员来处理积压工作。您可以设置一个监督工作,确保100名工人正在运行,如果其中任何一个工作人员崩溃,supervisord将启动更换,以便工作人员不会缩小。
在工作完成之前,这很棒。也许当积压工作消失时,工人的数量应该缩小到1或0.即使每个新流程检查是否有工作要做,Supervisord仍会将总数调整为100个流程。没有看到,并且很快就关闭了。
流程实例或流程系列是否有办法与supervisord通信说,不再需要autoretsart行为?更好的是,有没有办法根据某些条件(如目录中的文件数量或??)来上下调整工作进程的数量。
我知道可以通过更新supervisord.conf
文件并运行supervisorctl reload
来完成,但如果存在这样的事情,我更喜欢更具说明性和自我管理的内容
答案 0 :(得分:1)
流程实例或流程系列是否有办法与supervisord通信说,不再需要autoretsart行为?
您可以通过确保您的流程在没有工作时退出不同的exitcode,并在配置中使用exitcodes
进行预设autorestart=unexpected
,来关闭活动。
更好的是,有没有办法根据某些条件(如目录中的文件数量或??)来上下调整工作进程数。
问题是自动state transitions不允许从预期的EXITED
状态再次运行进程。 AFAIK执行此操作的唯一方法是使用XML-RPC API的startProcess
,因此您需要编写或查找适当的事件侦听器来监视您的开始条件,然后使用API。
另一种设计是将您的工作进程包装在一个事件处理程序中,观察PROCESS COMMUNICATION Events并让一个正常的子进程将新任务传递给事件侦听器池。但是,当没有工作时,该模型目前不会消除等待进程池,它只是以一种可以更容易地分离任务相关逻辑和资源使用的方式组织控制任务。