Laravel France

Fille d'attentes et performance

Avatar de ismaTsmk
ismaTsmk

Bonjours a tous question que me semble utile a la communauté francaise de ce superbe framework, Comment fonctionne les fille d'attantes Laravel, quels impact ont t'il sur un serveur en géneral qu'ils sois dédiée et ou mutualiser. Difficile de trouver de la documentation a ce sujet et c'est pourtant une grosse force de ce framework.

Merci de ne pas copier coller la documentation haha

Posté il y a 4 mois
Avatar de khalyomede
khalyomede

Bonjour, pour être très simple, les files d'attentes ou "Job Queues" comme mentionné dans la documentation (https://laravel.com/docs/9.x/queues) servent la plupart du temps à déléguer du travail à un moment ultérieur pour libérer le processus principal.

Personnellement je les utilise quand je dois appeler un service tiers (une API la plupart du temps) qui peut potentiellement mettre du temps à répondre. Des exemples en vrac que j'ai mis en place pour mon app :

  • Envoyer un email après qu'un utilisateur s'est inscrit
  • Appeler une API de geolocation par IP après qu'un utilisateur se connecte
  • ...

Donc typiquement, quand tu ne veux pas bloquer ton processus principal, ET que la logique métier ne dépend pas du retour d'un appel à un service tiers, tu peux les utiliser.

En ce qui concerne l'architecture, c'est un processus différent de celui qui traite tes requêtes HTTP qui s'occupe de dépiler ta queue. La solution conseillée dans la documentation (https://laravel.com/docs/9.x/queues#supervisor-configuration) c'est Supervisor. Il va dépiler ta queue à interval régulier, sans que tu aies besoin de le faire toi même dans ton code métier. Tout ce que tu as besoin de faire c'est de "dispatcher" le job, et la queue se dépilera. En développement la plupart du temps tu ne t'embête pas à installer Supervisor sur ta machine, donc pour simuler un dépilement de queue tu peux soit:

  • avec l'environnement QUEUE_CONNECTION=sync, ton app lancera la queue de mannière synchrone (c'est à dire en même temps que ton code principal, plus lent mais super simple pour tester localement)
  • avec l'environnement QUEUE_CONNECTION=database, tes queue seront enregistrée dans une table "jobs" (et les jobs qui échouent dans "failed_jobs"), et tu devra
    • Soit lancer une fois php artisan queue:work avant que tu teste un job qui s'empilera, ça va dépiler les jobs au fur et à mesure
    • Soit lancer php artisan queue:work --stop-when-empty lorsque tu sais qu'un job a été empilé, pour éviter de laisser une queue tourner en tâche de fond (mais elle ne se dépilera que lorsque tu lancera cette commande)

Si en production tu ne peux pas te permettre de lancer les queues avec un autre processus, mais que tu penses que tu le pourra ultérieurement, tu peux commencer avec le mode "sync", et changer plus tard : tu n'auras pas à modifier ton code si tu modifie le driver (c'est la beauté du framework).

Il y a d'autres environnement comme QUEUE_CONNECTION=redis, et tout est documenté ici : https://laravel.com/docs/9.x/queues#driver-prerequisites.

Note : sur d'anciennes version de Laravel (comme la 6), cette environnement s'appelait "QUEUE_DRIVER".

Mettons que tu utilise ce controlleur pour enregistrer un utilisateur

namespace App\Http\Controllers;

use App\Http\Requests\RegisterRequest;
use App\Mails\RegistrationConfirmation;
use Illuminate\Support\Facades\Mail;

class RegisterController
{
  /**
   * Déclenché lorsque l'utilisateur soumet le formulaire d'inscription.
   */
  public function store(RegisterRequest $request)
  {
    // Préparer les variables
    $email = $request->email;

    // Enregistrer l'utilisateur en base de données...

    // Authentifier l'utilisateur ...

    // Envoyer une confirmation par email
    Mail::to($email)->send(new RegistrationConfirmation());

    // Rediriger l'utilisateur
    return redirect()->route("dashboard");
  }
}

Ton email ressemblera à ça, et spécifie qu'il est poussé dans une queue plutôt que d'être envoyé immédiatement :

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class RegistrationConfirmation extends Mailable implements ShouldQueue // spécifie que l'email est poussé dans une queue
{
  use Queueable; // spécifie que l'email est poussée dans une queue
  use SerializesModels;

  public function build()
  {
    return $this->subject("Votre compte a été créé")
      ->view("emails.registration-confirmation");
  }
}

Tout ce que j'ai dis tu le retrouve dans la documentation officielle (https://laravel.com/docs/9.x/queues), donc je conseille vivement de la lire car elle contient pleins d'infos que je n'ai pas mis et qui sont essentielles (comme le fait de lancer php artisan queue:table pour ajouter les tables des jobs si le driver est "database", ...).

Posté il y a 3 mois

Vous ne pouvez pas répondre à ce sujet.