Beanstalk est une file d'attente de travail rapide et simple. Il vous permet d'exécuter des tâches chronophages de manière asynchrone, telles que l'envoi d'e-mails, la connexion à des API externes ou le traitement d'images. Ce faisant, vous réduirez la latence de votre application Web. Laravel fournit un support prêt à l'emploi pour beanstalkd
.
Dans ce didacticiel, nous allons installer beanstalkd
, configurer une application Laravel de démonstration et gérer les travailleurs de file d'attente via Supervisor . L'application de démonstration obtiendra une liste des systèmes d'exploitation disponibles à partir de l' API Vultr et en choisira un au hasard.
Il est supposé que Supervisor est déjà installé sur votre système. Si vous ne le faites pas, vous devriez lire le tutoriel suivant sur la façon de configurer Supervisor: Installation et configuration de Supervisor sur Ubuntu 16.04
Il est également supposé que vous avez un accès SSH à votre instance Vultr.
Installer Beanstalk
La première étape à suivre consiste à installer beanstalkd
.
sudo apt-get update
sudo apt-get install beanstalkd
Démarrez le service.
sudo systemctl start beanstalkd
Vous pouvez également activer le service pour démarrer lors de l'initialisation du système.
sudo systemctl enable beanstalkd
Vérifiez l'état du service en exécutant la commande suivante.
sudo systemctl status beanstalkd
Par défaut, beanstalkd
écoute sur le port 11300
. Beanstalk utilise un simple protocole textuel décrit dans son référentiel github . Vous pouvez tester son protocole en exécutant telnet
.
telnet localhost 11300
Écrivez ce qui suit et appuyez sur ENTER.
list-tubes
Vous devriez voir une liste de tubes disponibles sur le serveur:
OK 14
---
- default
Pour fermer la connexion, tapez simplement quit
et appuyez sur ENTER.
Les tubes dans Beanstalk représentent les files d'attente de travail. Beanstalk est composé essentiellement de producteurs , de consommateurs , d' emplois et de tubes . Les producteurs mettent les emplois dans un tube pour être consommés (traités) par un nombre illimité de consommateurs. Notez que les producteurs et les consommateurs sont simplement des clients du serveur Beanstalk et sont totalement indépendants les uns des autres. Concrètement, cela signifie qu'en utilisant Beanstalk, vous pouvez produire vos travaux dans votre application PHP et les faire traiter dans une application NodeJS par exemple. Heureusement, Laravel résume tout cela et nous fournit une API très simple pour répartir et gérer les travaux, comme nous le verrons ensuite.
Exemple de projet
Pour construire notre exemple de projet, nous devons d'abord installer ses dépendances. Nous allons installer PHP et Composer.
sudo apt-get install php php-mbstring php-xml php-common php-zip composer
Maintenant, créez le projet basé sur Laravel 5.5.
composer create-project --prefer-dist laravel/laravel vultr "5.5.*"
Ensuite cd
dans le dossier récemment créé. Nous travaillerons désormais dans ce répertoire. Ce dossier peut être référencé ultérieurement comme PROJECT_ROOT
.
cd vultr/
Pour utiliser Beanstalk dans Laravel, nous devons installer une autre dépendance, le client PHP Beanstalk.
composer require pda/pheanstalk ~3.0
Nous devons également créer une représentation d'emploi. Dans Laravel, il s'agit d'une classe à l'intérieur du app/Jobs
dossier. Laravel possède une commande de console pour nous aider à créer une classe d'emplois. Créons notre exemple de Job.
php artisan make:job FindFavoriteOS
Mettez à jour le app/Jobs/FindFavoriteOS.php
fichier comme suit.
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Log;
class FindFavoriteOS implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$rawData = file_get_contents('https://api.vultr.com/v1/os/list');
$list = json_decode($rawData, true);
shuffle($list);
$key = array_rand($list);
$favorite = $list[$key];
Log::info('My Favorite OS is: ' . $favorite['name']);
}
}
La méthode du handle est ce qui sera effectivement exécuté lorsque le travail sera consommé. Ici, nous récupérons les données de l'API Vultr, choisissons au hasard un système d'exploitation et écrivons le système d'exploitation choisi dans le fichier journal. Le fichier journal se trouve à storage/logs/laravel.log
.
Nous avons déjà installé Beanstalk et défini le Job à exécuter par celui-ci. Il est maintenant temps de dire à Laravel d'utiliser Beanstalk comme file d'attente de travail par défaut. Copiez le .env
fichier par défaut fourni par l'installation de Laravel.
cp .env.example .env
Ouvrez maintenant le .env
fichier et mettez à jour la ligne où le pilote de file d'attente est spécifié.
QUEUE_DRIVER=beanstalkd
Enfin, générez une clé d'application.
php artisan key:generate
Nous sommes maintenant prêts à envoyer des travaux à la file d'attente de travail Beanstalk.
Répartition et exécution des travaux
Envoyer un emploi à Laravel est assez simple. Mettez à jour le routes/web.php
fichier.
<?php
Route::get('/', function () {
for ($i = 0; $i < 50; $i++) {
\App\Jobs\FindFavoriteOS::dispatch();
}
return '50 Jobs dispatched!';
});
Bien qu'il ne soit pas recommandé d'exécuter le serveur intégré fourni en production, nous allons l'utiliser ici par souci de concision.
php artisan serve --host 0.0.0.0 --port 8000
Maintenant, dans un navigateur Web, accédez à http://[vultr-instance-ip]:8000
. Vous verrez le message suivant.
50 Jobs dispatched!
Ouvrez une nouvelle connexion SSH à votre serveur et à l'intérieur de notre racine de projet, exécutez ce qui suit.
php artisan queue:work --once
C'est la sortie attendue:
[2018-02-14 00:03:52] Processing: App\Jobs\FindFavoriteOS
[2018-02-14 00:03:53] Processed: App\Jobs\FindFavoriteOS
Confirmez que le journal a été généré.
cat storage/logs/laravel.log
Configuration du superviseur
Pour éviter d'avoir à traiter manuellement la file d'attente, nous utiliserons supervisord
. Créez la configuration de programme suivante dans /etc/supervisor/conf.d/vultr.conf
.
[program:vultr]
process_name=%(program_name)s_%(process_num)02d
command=php [PROJECT_ROOT]/artisan queue:work
autostart=true
autorestart=true
numprocs=8
redirect_stderr=true
stdout_logfile=/var/log/worker.log
Notez que le bon chemin pour placer le fichier de configuration du superviseur dépendra de votre configuration. N'oubliez pas non plus de remplacer [PROJECT_ROOT]
par le chemin complet vers le PROJECT_ROOT
sur votre système.
Ici, nous configurons Supervisor pour démarrer automatiquement le traitement de la file d'attente et, en cas de rupture du script, pour la redémarrer. Notez également que nous n'instancions pas un seul travailleur, mais 8 processus. Vous êtes libre d'instancier le nombre de processus que vous jugez nécessaires en fonction de votre application.
Pour permettre au superviseur de gérer notre travailleur, forcez-le à relire sa configuration.
sudo supervisorctl reread
sudo supervisorctl update
Si le service Superviseur n'a pas été démarré, vous devez le démarrer.
sudo systemctl start supervisord
Voyons maintenant si les travaux sont en cours de traitement.
tail -f storage/logs/laravel.log
Sur un navigateur Web, accédez à http://[vultr-instance-ip]:8000
. Vous verrez les journaux générés sur votre console.
Conclusion
Nous avons réussi à configurer une application Laravel pour utiliser Beanstalk comme file d'attente de travail. Nous avons également montré comment utiliser Supervisor pour gérer les employés.