Advertisement
  1. Code
  2. PHP
Code

Haciendo Las Cosas Más Fáciles con Gearman y Supervisor

by
Difficulty:IntermediateLength:ShortLanguages:

Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)

Algunas veces, nuestros servicios necesitan desempeñar algunas tareas enormes después de la interacción con el usuario. Por ejemplo, necesitamos enviar una carta, generar un archivo de reporte, o llamar APIs externas. Este tipo de tareas pueden ser lentas debido a terceros y pueden consumir los recursos de tu servidor.

En este caso, una aplicación puede convertirse en una serpiente devorando a un elefante, como en el libro El Pequeño Príncipe. Tomas algunos datos de un usuario y lo haces esperar porque la serpiente necesita algún tiempo para digerir un elefante (o algo más que tu app necesite hacer):

A snake eating an elephant

Para procesar esta funcionalidad más rápidamente, necesitas hacer partes de tu aplicación asíncronas. Puedes lograr esto delegando esta tarea a un servidor más poderoso o ejecutándola en un proceso en el fondo.

Y Gearman es una herramienta apropiada que puede ser usada para hacer esto.

¿Qué Vamos a Hacer?

En este tutorial, crearemos una aplicación simple que delegará una tarea desde un cliente al trabajador Gearman. Nuestra aplicación calculará una secuencia Fibonacci en tres procesos. Para ejecutar procesos trabajadores, instalaremos y configuraremos Supervisor.

Por favor nota que los ejemplos en este tutorial necesitan PHP7 para ejecutarse.

¿Así Que Qué Es Gearman De Cualquier Modo?

Primero, descubramos qué es Gearman desde su página:

Gearman proporciona un marco de trabajo de aplicación genérica para arrendar trabajo a otras máquinas o procesos que son más capaces de hacer el trabajo. Esto te permite trabajar en paralelo, para procesamiento de balance de carga, y llamar funciones entre lenguajes. Puede ser usado en una variedad de aplicaciones, desde sitios web de alta disponibilidad al transporte de eventos de replicación de base de datos. En otras palabras, es el sistema nervioso previo para cómo se comunica el procesamiento distribuido.

En otras palabras, Gearman es un sistema de cola de espera que es sencillo de escalar en muchos servidores y flexible de usar debido a soporte multi-lenguaje.

Instala Gearman

Si estás ejecutando Debian/Ubuntu, ejecuta el siguiente comando para instalar Gearman con las herramientas necesarias y extensión PHP:

Después de eso, ejecuta el servidor Gearman y revisa el estado:

Pero no verás nada útil después del comando de estado porque no hemos iniciado ningún trabajador aún. solo recuerda esto hasta que lo necesitemos.

Crea un Cliente

Y estamos listos para comenzar un script llamado client.php. Este script creará un cliente Gearman y enviará información a un servidor en la misma máquina:

Podrías haber notado que enviamos números en formato JSON. Los clientes y trabajadores Gearman se hablan entre sí en un formato de cadena, así que una de las maneras de serializar un arreglo es usar la función json_encode() o algo similar.

Después de recibir una respuesta del trabajador, lo deserializaremos con json_decode() y lo mostraremos como filas CSV:

Hemos terminado nuestro script de cliente, así que ejecutemoslo desde la terminal:

Pero se quedará atorado sin ninguna salida. ¿Por qué? Está esperando a que un trabajador se conecte.

Crea un Trabajador

Es tiempo de crear un trabajador para hacer el trabajo que fue ordenado por el cliente. Requeriremos un archivo con la función fibonacci() y crearemos un nuevo trabajador Gearman en el servidor actual:

Después de esto, agregaremos una nueva función llamada igual que como la llamamos en el código cliente:

Y, por supuesto, no olvides envolver tu respuesta en formato JSON. La última cosa que hacer es ciclar el script del trabajador para usarlo varias veces sin reiniciar:

Podemos ejecutar el script del trabajador en el fondo:

En este momento, podrías ya haber observado que el script cliente ha terminado su trabajo y escrito algo como esto:

Revisa el Estado de Gearman

Finalmente, tenemos nuestro trabajador ejecutándose, así que podemos revisar el estado otra vez:

En cada fila, hay un nombre de función y tres números: el número de tareas en la cola (0), el número de trabajos ejecutándose (1), y el número de trabajadores capaces (2).

Por supuesto, para agregar más trabajadores, puedes ejecutar más scripts de trabajador. Para detener cada uno de ellos, puedes usar killall. Pero hay una gran herramienta para administrar trabajadores, y se llama Supervisor.

Unas Cuántas Palabras Sobre Supervisor

Como dice el manual:

Supervisor es un sistema cliente/servidor que permite a sus usuarios monitorear y controlar un número de procesos en sistemas operativos basados en UNIX.

Vamos a instalarlo y crear el archivo básico de configuración:

En el editor que se abre, crearemos una configuración básica para un trabajador Gearman:

Esto dirá a Supervisor que el trabajador debe ejecutar tres procesos y reiniciar cuando termine. Ahora guarda el archivo de configuración, recarga Supervisor, y revisa el estado de los procesos en ejecución:

Podemos ver tres trabajadores que están listos para tomar trabajos desde scripts de cliente.

Conclusión

Hemos completado las tareas básicas para instalar y configurar Gearman. Ahora eres libre de jugar con el código de ejemplo, así que intenta hacer los siguiente cambios al código:

  • Agrega algunos procesos de trabajador en el fondo, como enviar un correo.
  • Juega con prioridades de tarea usando GearmanClient::doHigh.
  • Separa datos usando GearmanJob::sendData, que puede ser útil en el caso de tareas largas que pueden ser observadas por la barra de estado.

También, puedes escalar el poder de tus trabajadores incrementando el número de procesos o ejecutándolos en un servidor más rápido. Y no olvides usar Supervisor para hacer que tus trabajadores se ejecuten.

Si tienes alguna pregunta, no dudes en hacerla en los comentarios del artículo.

Lecturas Posteriores y Enlaces Relacionados

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.