本文介绍了如何设计带有MySQL DB连接的守护进程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设您正在写一个服务作业队列的守护进程。各种其他软件将守护进程的作业写入队列。守护程序每隔几秒轮询队列以查看挂起作业。假设队列被实现为MySQL数据库中的表,并且守护程序是一个简单的循环:


  1. 从队列中获取所有到期作业

  2. 执行作业

  3. 睡眠N秒

  4. goto 1

守护程序必须在MySQL DB服务器中断服务并且数据库连接中断后才能生效。



守护进程每个周期连接到DB服务器一次?即在1.之前连接,并在2之间断开连接3?



或者你有守护进程保持连接打开吗?在这种情况下,它还需要a)检测服务器或连接何时不工作,b)断开并重新连接,以及c)这样做而不累积DB连接,dud连接描述符或其他死资源。



如果您有偏好,为什么?



利弊?



进入设计的因素?



任何其他方法?



这里的答案:没有说明为什么最好保持连接打开。我在别的地方看到MySQL的每个连接开销非常轻。所以不明显为什么永久消费一个服务器连接比每几秒钟连接/断开更好。



在我的例子中,守护进程是用PHP编写的。

解决方案

我实际上在非常接近你所描述的,但在我的情况下,守护进程不轮询事件,它通过XMPP异步地(但除了这一点)。



剪下中间人



我认为不是将事件存储在数据库中,您可以使用异步从客户端发送()。



垃圾收集 b
$ b

PHP并非真正设计为作为守护程序运行,而是直到PHP 5.3,它才有,它成为一个可行的选择。



另外要注意的一点是,如果你想要长期运行时没有内存泄漏,那么非常 GC是,内存只有免费,如果它不再被引用(任何地方)。因此,如果你为全局作用域分配一个变量,它将一直存在,直到守护进程退出。重要的是,您创建或使用的任何代码不会在地方构建变量(即静态日志,不删除旧数据等)。


$ b

Stat Cache



另一件事是, $ c> clearstatcache 。由于您的PHP进程未重新启动,因此手动执行此调用以防止获取旧的统计数据(这可能会影响或可能不会影响)非常重要。根据这些功能被缓存。

Resource management

If your going to be using thing like MySQL during the lifetime of your process, I'd suggest making one connection at startup and keeping it alive. Even though it might use more ram on the MySQL side, you'll cut out some latency and CPU overhead by not having to connect every 1 second.

No URL request

This may seem obvious, but with CLI PHP there is no URL request info. Some libraries aren't written with this in mind, and this can cause some problems.

LooPHP

I'm going to pop a shameless plug in here for a framework I wrote to help with the management of PHP daemons. LooPHP is a run loop framework that lets you schedule event to happen or create listens for abstract sources (socket, stream, etc). In my case, I have the daemon doing more than 1 thing, so it's very helpful to have system keep track of all the timers for me so that I can effectively poll stream_select for the XMPP connection.

这篇关于如何设计带有MySQL DB连接的守护进程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-05 01:32