Gearman est un service de «pool request». Il reçoit d’un côté les demandes de traitement à faire (jobs) et transmet les ordres d’exécution aux workers qui réaliseront la tâche demandée.

    Les «jobs» demandés à Gearman peuvent être :

  • synchrone : le client attend que Gearman renvoie le résultat de l’exécution de la tâche,
  • asynchrone : le client demande à faire faire un traitement par Gearman en tache de fond et n’attend aucun résultat en retour.


Les clients et les workers peuvent être implémentés dans différents langages (PHP, SHELL…).

      Il est déployé dans plusieurs cas d’usage comme par exemple :

    • automatisation de tâches système sur une plate-forme d’hébergement web mutualisée,
    • calcul d’agrégats ou de métriques statistiques,
    • système d’alerte couplé avec nagios,
    • redimensionner des images et encoder des vidéos et bien d’autres encore.

Architecture Gearman

Gearman vient en complément d’une application. L’application «web» par exemple, va s’appuyer sur ce dernier pour exécuter des routines (tâches de fond). Gearman va s’assurer du bon déroulement des routines afin que l’application puisse être «libérée». Le script PHP peut se finir et le modèle de données reste cohérent.

Dans notre exemple, l’utilisateur en inter-agissant avec l’application web, va déclencher la demande de création d’un compte unix. Le fichier «create_user.php» est un script PHP qui va demander à Gearman de faire exécuter la tâche «create_user» à un worker (script shell) capable de le faire : «create_user.sh» dans notre cas.

Avantages de Gearman

L’avantage principal de Gearman est de proposer une solution simple et scallable de pile de job. Il est possible d’utiliser un SGBD (MySQL entre autre) pour avoir une persistance et une trace des jobs. Ainsi, le script PHP qui est à l’initiative de la demande du travail, n’est pas obligé d’attendre. Le mode asynchrone et la non perte de l’information lors du traitement de la tâche, permet de penser son application web autrement et obtenir un bon retour sur l’expérience utilisateur.

    Quelques exemples où l’utilisateur n’est pas bloqué dans sa tâche :
  • l’augmentation de la fréquentation d’un site peut provoquer des ralentissements. Les demandes de job rentrent dans une queue. L’application web grâce à une IHM adaptée informe l’utilisateur de l’état du système (encodage vidéo en cours),
  • la création d’un domaine en .fr nécessite des vérifications chez un tiers de confiance. L’application va contrôler l’état du job et informe l’utilisateur de cet état.

Mettons en oeuvre un exemple de traitement avec Gearman et PHP.

Installation de Gearman

installation et démarrage du service Gearman


tar xzf gearmand-0.14.tar.gz
cd gearmand-0.14
./configure
make
make install

Afin de savoir si tout est ok rendez-vous dans /usr/local/sbin/ pour lancer Gearman.
Si l’exécutable n’a pas été placé dans /usr/local/sbin/ utilisez la commande «find»


cd /usr/local/sbin/
./gearmand -d

L’option -d permet de faire tourner Gearman en tâche de fond. Utilisez l’option -h afin de prendre connaissance des options de démarrage du serveur Gearman. Vous pourrez, par exemple, spécifier l’adresse et le port d’écoute ainsi que l’emplacement d’un fichier de log.

Installation de la lib PHP Gearman

  • récupérer les sources pour installer la lib PHP


tar xzf gearman-0.6.0.tgz
cd gearman-0.6.0/
phpize
./configure
make
make install

Rajouter dans votre php.ini le lien vers l’extension : extension= »gearman.so ».

Vous devez redémarrer votre server web afin que la librairie Gearman soit prise en compte. Faites un php -i et vérifiez bien que la librairie est correctement chargée. Nous avons un environnement installé et nous pouvons faire notre première implémentation Gearman PHP.

Implémentation de l’exemple

Pour utiliser Gearman, nous avons besoin de créer un worker et un client qui va demander à faire un job.

Le worker Gearman.

Ce worker aura pour tâche dans notre exemple de retourner une chaîne de caractère au client qui l’aura demandée.

Créez le fichier test.php (vi test.php) et adaptez la première ligne de code qui est le chemin vers l’interpréteur PHP


#!/usr/bin/php
$worker= new GearmanWorker();
$worker->addServer();

$worker->addFunction("hello", "makeJob");

while (1) {
print "Worker hello is waiting for a job\n";
$ret= $worker->work();
if ($worker->returnCode() != GEARMAN_SUCCESS) break;
}

function makeJob($job) {
$data = $job->workload();
echo "Received job: " . $job->handle() . "\n";
return 'hello '. $data . ' in the Gearman world :)'. "\n" ;
}
?>

N’oubliez pas de faire en sorte que le fichier soit exécutable.


chmod +x test.php

On va pouvoir exécuter notre worker en veillant au préalable à ce que le serveur Gearman soit bien démarré.

Pour démarrer le worker, tapez la ligne de commande suivante : ./test.php

worker démarré et pret à recevoir des jobs de la part de Gearman

Demander à Gearman de faire un job

Le worker Gearman a été lancé et nous pouvons demander à faire un job par l’intermédiaire du client. Pour cela, il suffit d’invoquer Gearman en ligne de commande et de passer les paramètres adéquates.

gearman -f hello stéphane
résultat d'une exécution d'une commande Gearman

      Le résultat escompté est bien là :

    • le worker a recu un job et l’exécute,
    • le worker dès le job terminé, est de nouveau en attente
    • le worker a bien retourné une chaine de caractères composée avec notre paramètre «stéphane»

Conclusion

Gearman offre une solution de gestion de tâches scallables et parfaitement étanche au sein d’une infrastructure. Il peut être déployé au sein d’un pool de serveurs et gérer un ensemble important de workers. Il devient possible de garantir à une application, la bonne exécution de tâches asynchrone même en cas d’augmentation du trafic ou d’interruption de services. Les applications qui utilisaient Gearman devront prendre en compte cette gestion du parallélisme et du mode asynchrone.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>