Rendre les choses plus rapides avec Gearman et superviseur

Parfois, nos services doivent effectuer d’énormes tâches après l’interaction de l’utilisateur. Par exemple, nous devons envoyer une lettre, générer un fichier de rapport ou appeler des API externes. Ces types de tâches peuvent être lents à cause de tiers et peuvent consommer les ressources de votre serveur..

Dans ce cas, une application peut devenir un serpent mangeant un éléphant, comme dans le livre Le petit Prince. Vous prenez certaines données d'un utilisateur et le faites attendre car le serpent a besoin de temps pour digérer un éléphant (ou quelque chose d'autre que votre application doit faire):

Pour traiter cette fonctionnalité plus rapidement, vous devez rendre les parties de votre application asynchrone. Vous pouvez y parvenir en déléguant cette tâche à un serveur plus puissant ou en l'exécutant en arrière-plan..

Et Gearman est un outil approprié qui peut être utilisé pour cela..

Qu'allons nous faire?

Dans ce didacticiel, nous allons créer une application simple qui déléguera une tâche d’un client au travailleur Gearman. Notre application calculera une séquence de Fibonacci en trois processus. Pour exécuter les processus de travail, nous allons installer et configurer Supervisor..

Veuillez noter que les exemples de ce tutoriel nécessitent PHP7 pour fonctionner.

Alors, qu'est-ce que Gearman??

Tout d'abord, découvrons ce que Gearman est depuis sa page d'accueil:

Gearman fournit un cadre d’application générique permettant d’impartir le travail à d’autres machines ou processus mieux adaptés. Il vous permet de travailler en parallèle, d’effectuer un traitement d’équilibrage de la charge et d’appeler des fonctions entre les langues. Il peut être utilisé dans diverses applications, des sites Web à haute disponibilité au transport d'événements de réplication de bases de données. En d’autres termes, c’est le système nerveux qui communique le traitement distribué.

En d'autres termes, Gearman est un système de mise en file d'attente qui est facile à faire évoluer sur de nombreux serveurs et à utiliser grâce à la prise en charge multilingue..

Installer Gearman

Si vous utilisez Debian / Ubuntu, exécutez la commande suivante pour installer Gearman avec les outils et l'extension PHP nécessaires:

sudo apt-get installer gearman php-gearman gearman-tools

Ensuite, lancez le serveur Gearman et vérifiez l’état:

sudo gearmand -d gearadmin --status

Mais vous ne verrez rien d’utile après la commande status car nous n’avons encore lancé aucun programme de travail. Rappelez-vous simplement jusqu'à ce que nous en ayons besoin.

Créer un client

Et nous sommes prêts à lancer un script appelé client.php. Ce script va créer un client Gearman et envoyer des informations à un serveur sur le même ordinateur:

addServer ('127.0.0.1'); // config $ numbers = [1, 2]; // effectue une tâche avec gearman worker $ res = $ client-> doNormal ('get_sequence', json_encode ($ numbers)); 

Vous avez peut-être remarqué que nous avons envoyé des nombres au format JSON. Les clients et les travailleurs de Gearman se parlent sous forme de chaîne. L’un des moyens de sérialiser un tableau consiste à utiliser le json_encode () fonction ou quelque chose de similaire.

Après avoir reçu une réponse du travailleur, nous la désérialiserons avec json_decode () et sortie en tant que lignes CSV:

Nous venons de terminer notre script client, alors exécutons-le depuis le terminal:

php /vagrant/tuts-gearman-supervisor/code/client.php 

Mais ce sera bloqué sans aucune sortie. Pourquoi? Il attend qu'un travailleur se connecte.

Créer un ouvrier

Il est temps de créer un travailleur pour effectuer le travail commandé par le client. Nous aurons besoin d’un fichier avec le fibonacci () fonction et créer un nouvel ouvrier Gearman sur le serveur actuel:

addServer ('127.0.0.1');

Après cela, nous allons ajouter une nouvelle fonction appelée la même chose que nous l’avons appelée dans le code client:

addFunction ('get_sequence', function ($ job) // décode l'entrée $ content = $ job-> workload (); $ data = json_decode ($ content, true); // calcule la séquence et renvoie le résultat $ rows = fibonacci ( $ data); return json_encode ($ rows););

Et bien sûr, n'oubliez pas de mettre votre réponse au format JSON. La dernière chose à faire est de boucler le script de travail pour l'utiliser plusieurs fois sans redémarrer:

travail(); 

Nous pouvons exécuter le script de travail en arrière-plan:

php /vagrant/tuts-gearman-supervisor/code/worker.php &

À ce moment, vous avez peut-être déjà remarqué que le script client a terminé son travail et écrit quelque chose comme ceci:

vagrant @ localserver: ~ $ /vagrant/tuts-gearman-supervisor/code/client.php 1, 2, 3 2, 3, 5 3, 5, 8 5, 8, 13 8, 13, 21

Vérifier l'état de Gearman

Enfin, notre ouvrier est en cours d'exécution afin de pouvoir vérifier à nouveau le statut:

vagrant @ localserver: ~ $ gearadmin --status get_sequence 0 1 2 vagrant @ localserver: ~ $ ps -aux | grep worker.php root 4595 0,0 1,5 98928 7764? S 21:52 0:00 php /vagrant/tuts-gearman-supervisor/code/worker.php root 4596 0.0 1.5 98928 7764? S 21:52 0:00 php /vagrant/tuts-gearman-supervisor/code/worker.php 

Dans chaque ligne, il y a un nom de fonction et trois chiffres: le nombre de tâches dans la file d'attente (0), le nombre de travaux en cours d'exécution (1) et le nombre de travailleurs capables (2)..

Bien sûr, pour ajouter plus de travailleurs, vous pouvez exécuter plus de scripts de travail. Pour arrêter chacun d'eux, vous pouvez utiliser tuer tous.  Mais il existe un excellent outil pour gérer les travailleurs, appelé Superviseur..

Quelques mots sur le superviseur

Comme le dit le manuel:

Supervisor est un système client / serveur qui permet à ses utilisateurs de surveiller et de contrôler un certain nombre de processus sur des systèmes d'exploitation de type UNIX..

Installons-le et créons le fichier de configuration de base:

sudo apt-get install supervisor sudo nano /etc/supervisor/conf.d/supervisor.conf 

Dans l'éditeur qui s'ouvre, nous allons créer une configuration de base pour un ouvrier Gearman:

[programme: gearman-worker] command = php /vagrant/tuts-gearman-supervisor/code/worker.php autostart = true autorestart = true numprocs = 3 process_name = gearman-worker -% (process_num) s 

Cela indiquera au superviseur que le travailleur doit s'exécuter dans trois processus et redémarrer une fois terminé. Enregistrez maintenant le fichier de configuration, rechargez Supervisor et vérifiez l’état des processus en cours:

vagrant @ localserver: ~ $ sudo supervisorctl reload Relancé superviseur vagrant @ localserver: ~ $ sudo supervisorctl statut gearman-worker: gearman-worker-0 RUNNING pid 4596, disponibilité 0:01:03 gearman-worker: gearman-worker-1 RUNNING pid 4595, disponibilité 0:01:03 engrenage-travailleur: gearman-worker-2 EN COURS DE TRAVAIL pid 4597, en disponibilité 0:01:03 

Nous pouvons voir trois travailleurs prêts à prendre des tâches à partir de scripts client..

Conclusion

Nous avons terminé les tâches de base pour installer et configurer Gearman. Maintenant, vous êtes libre de jouer avec l'exemple de code, essayez donc d'apporter les modifications suivantes au code:

  • Ajouter des processus de travail en arrière-plan, comme l'envoi d'un courrier électronique.
  • Jouez avec les tâches prioritaires en utilisant GearmanClient :: doHigh.
  • Données de bloc utilisant GearmanJob :: sendData, ce qui peut être utile dans le cas de tâches longues pouvant être observées par la barre d'état.

En outre, vous pouvez augmenter la puissance de vos employés en augmentant le nombre de processus ou en les exécutant sur un serveur plus rapide. Et n'oubliez pas d'utiliser Supervisor pour faire fonctionner vos travailleurs.

Si vous avez des questions, n'hésitez pas à poser des questions dans les commentaires de l'article. 

Lectures complémentaires et liens connexes

  • Gearman Job Server
  • Gearman Service sur php.net
  • Interface utilisateur de Gearman pour surveiller les tâches de Gearman
  • Superviseur: Un système de contrôle de processus