我有一个用PHP编写的网站(CakePHP),其中某些资源密集型任务由后台进程处理。这是通过Beanstalkd消息队列完成的。我需要一些方法来检索该后台进程的状态,以便我可以使用Monit监视它。

后台进程是与Beanstalkd通信的CakePHP Shell(只是一个PHP CLI脚本)。它只是在Benastalkd上做一个reserve()并等待一条新消息。当它收到消息时,它会处理它。我希望用 Monit 监控此过程,以便在出现问题时重新启动后台进程

到目前为止,我一直在考虑的是编写一个PHP CLI脚本来删除Beanstalkd中的消息。后台进程选择消息并以某种方式将其内部状态传回CLI脚本。但是怎么样?套接字?共享内存?其他一些IPC方法?

或者我可能在这里过于复杂,是否有一种更简单的方法来监控Monit这样的过程?

提前致谢!

有帮助吗?

解决方案

这就是我最终做的事情。

CLI脚本连接到beanstalkd,创建一个新队列(管)并开始观察它。然后,它会在后台守护程序正在监视的队列中删除最高优先级的消息。该消息包含CLI脚本正在监视的新队列的名称。

后台进程几乎立即收到此消息(因为它具有最高优先级),生成状态消息并将其放入CLI脚本正在监视的队列中。 CLI脚本接收它然后关闭队列。

如果CLI脚本在30秒内没有收到响应,它将退出并显示一个错误,指示后台守护程序(很可能)已挂起。

我把所有这些都绑成了Monit。 Monit现在可以检查后台守护程序是否正在运行(通过pidfile和进程列表)并验证它是否仍在处理消息(通过使用CLI工具测试它是否响应状态请求)

其他提示

Monit或Nagios可能有一个插件可以连接,运行统计数据并返回“如果有太多”。没有为此编写的“协议”,但似乎并不难以修改现有的基于文本的协议(如nntp或smtp)来执行您想要的操作。它确实意味着用它的外观在C中写它。

从CLI-PHP脚本,我会通过两种不同的方法中的一种(或两种)来实现它。

1 /将(低优先级)优先级消息放入队列,并确保它在几秒钟内返回。将它放入专用队列并确保在将其放入之前没有任何内容也将是一个很好的补充。 2 /执行'统计',看看有多少人在等待:'当前就业准备'。

要将信息返回到网站(无论哪种方式),您都可以写入文件,或写入读取和操作的Memcached等内容。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top