Supongamos que está escribiendo un daemon que sirve una cola de trabajos. Varios otros programas escriben trabajos para el daemon en la cola. El daemon sondea la cola cada pocos segundos para trabajos pendientes. Supongamos que la cola se implementa como una tabla en una base de datos MySQL y que el demonio es un bucle simple:Cómo diseñar un daemon con una conexión de base de datos MySQL
- obtener todos los puestos de trabajo debido de la cola
- hacer los trabajos
- sueño durante N segundos
- Goto 1
el demonio debe sobrevivir servicio interrumpido desde el servidor de base de datos MySQL y la interrupción de las conexiones de base de datos.
¿Diseñarías el daemon para conectarte al servidor de bases de datos una vez por ciclo? es decir, ¿conectar antes de 1. y desconectar entre 2 y 3?
¿O tendrías daemon para mantener una conexión abierta? En ese caso, también necesita a) detectar cuando el servidor o la conexión no funcionan, b) desconectarse y reconectarse, yc) hacerlo sin acumular conexiones de DB, descripciones de conexiones falsas u otros recursos muertos.
Si tiene una preferencia, ¿por qué?
Pros y contras?
¿Factores que entran en el diseño?
¿Algún otro enfoque?
La respuesta aquí: mysql connection from daemon written in php no dice por qué es mejor mantener la conexión abierta. Leí en otro lado que la sobrecarga por conexión en MySQL es muy ligera. Por lo tanto, no es obvio por qué consumir permanentemente una conexión de servidor es mejor que conectar/desconectar cada pocos segundos.
En mi caso, el daemon está escrito en PHP.
¿Qué es lo que estás tratando de hacer? Dependiendo del caso, parece que un archivo FIFO o un socket podría ser mejor para desencadenar el daemon ... (Y lo que haría sería volver a crear la conexión cada intervalo de sondeo, pero de nuevo no estaría sondeo cada pocos segundos) ... – ircmaxell
@ircmaxell: una FIFO no es conveniente en mi caso porque los procesos que colocan trabajos en la cola necesitan poder leerlos y porque el estado de la cola de trabajos necesita sobrevivir al reinicio del servidor. La replicación de MySQL de la cola también es útil. –
No quise pasar todos los datos a través de un FIFO. Solo para activar el daemon para leer desde la cola basada en mysql. Entonces, básicamente, 'INSERT INTO queue VALUES (job) ', luego' file_put_contents (' fifo.file ',' 1 '); '. El daemon dormiría tratando de abrir el fifo. Entonces, si se termina de procesar todo, básicamente se bloqueará en 'fopen ('fifo.file', 'r');'. La próxima vez que un proceso se agrega a la cola, simplemente notifica al daemon, que inmediatamente comienza a procesar el trabajo. Pero mientras duerme, no consume ningún recurso, ya que es una llamada al sistema que bloquea (incluso durante horas). – ircmaxell