Procesamiento asíncrono o colas de mensajes en PHP (CakePHP) [cerrado]


Estoy construyendo un sitio web en CakePHP que procesa los archivos cargados a través de una API XML-RPC y a través de una interfaz web. Los archivos deben ser escaneados por ClamAV, las miniaturas deben ser generadas, etc. Todo el trabajo intensivo de recursos que lleva algún tiempo por el que el usuario no debería tener que esperar. Por lo tanto, estoy investigando el procesamiento asíncrono con PHP en general y CakePHP en particular.

Me encontré con el plugin MultiTask para CakePHP que parece prometedor. También me encontré varias implementaciones de cola de mensajes como dropry beanstalkd. Por supuesto, también necesitaré algún tipo de proceso de fondo, probablemente implementado usando una Cáscara de Pastel de algún tipo. Vi multitarea usando PHP_Fork para implementar un demonio PHP multiproceso.

Necesito algunos consejos sobre cómo encajar todas estas piezas de la mejor manera.

  • ¿Es una buena idea tener un demonio de larga duración escrito en PHP? ¿Qué debo tener cuidado para?
  • ¿Cuál es la ventaja de las implementaciones de colas de mensajes externas? El complemento multitarea no utiliza una cola de mensajes externa. Rueda su propia usando una tabla MySQL para almacenar tareas.
  • ¿Qué cola de mensajes debo usar? ¿dropr? ¿beanstalkd? Algo más?
  • ¿Cómo debo implementar el procesador backend? ¿Es un demonio PHP bifurcado una buena idea o simplemente buscando problemas?

Mi plan actual es usar el plugin multitarea o editarlo para usarlo beanstald en lugar de su propia implementación de tabla MySQL. Los trabajos en la cola pueden consistir simplemente en un nombre de tarea y una matriz de parámetros. El demonio PHP observaría los trabajos entrantes y los pasaría a uno de sus subprocesos hijos. Simplemente ejecutaría la tarea CakePHP con los parámetros dados.

¿Alguna opinión, consejo, comentarios, trampas o llamas sobre esto?

Author: Whymarrh, 2009-05-26

4 answers

He tenido excelentes resultados con BeanstalkD y un back-end escrito en PHP para recuperar trabajos y luego actuar sobre ellos. Envolví el trabajo real en ejecución en un bash-script para seguir ejecutándose si incluso si salía (a menos que haga un 'exit(UNIQNUM);', cuando el script lo comprueba y realmente saldrá). De esa manera, el script PHP reiniciado borra cualquier memoria que pueda haber sido utilizada, y puede comenzar de nuevo cada 25/50/100 trabajos que ejecute.

Un par de ventajas de usarlo es que puede establezca prioridades y retrasos en un trabajo de BeanstalkD: "ejecute esto con una prioridad menor, pero no comience durante 10 segundos". También he puesto en cola una serie de trabajos en algún momento (ejecute esto ahora, en 5 segundos y nuevamente después de 30 segundos).

Con la configuración de red adecuada (y ejecutándola en una dirección IP accesible al resto de su red), también puede ejecutar un deamon beanstalkd en un servidor, y hacer que se sondee desde varias otras máquinas, por lo que si hay un gran número de tareas al ser generado, el trabajo se puede dividir entre servidores. Si un conjunto particular de tareas necesita ejecutarse en una máquina en particular, he creado un 'tube' que es el nombre de host de esa máquina, que debería ser único dentro de nuestro clúster, si no globalmente (útil para cargas de archivos). Descubrí que funcionaba perfectamente para cambiar el tamaño de la imagen, a menudo devolviendo las imágenes más pequeñas terminadas al sistema de archivos antes de que la página web en sí que se referiría a ella se referiría a la URL a la que llegaría.

Estoy en realidad, estoy a punto de comenzar a escribir una serie de artículos sobre este tema para mi blog (incluidas algunas técnicas para el código que ya he enviado varios millones de solicitudes en vivo): Mi URL está vinculada desde mi perfil de usuario aquí, en Stackoverflow.

(He escrito una serie de artículos sobre el tema de Beanstalkd y colas de trabajos)

 25
Author: Alister Bulman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:11

Si utiliza una cola de mensajes como beanstalkd, puede iniciar tantos procesos como desee (incluso en el mismo servidor). Cada proceso de trabajo tomará un trabajo de la cola y lo procesará. Puede agregar más trabajadores y más servidores si necesita más capacidad.

Lo bueno de usar un worker con un solo subproceso es que no tienes que lidiar con la sincronización dentro de un proceso. El jobqueue se asegurará de que ningún trabajo se maneje dos veces.

 4
Author: Peter Stuifzand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-26 10:29:03

También podría valer la pena revisar Amazon SQS para ser utilizado junto con EC2?

 0
Author: neilcrookes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-26 19:48:50

¿Qué hay de Gearman? Buen soporte e integración en php y características como tareas paralelas, escalado, monitoreo, etc...

 0
Author: giuseppe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-12 13:48:25