Tous les articles

Pourquoi votre API semble lente : toute l'idée en deux croquis

Backend · 3 min de lecture ·

Un client m'a dit un jour : "le bouton d'inscription met 4 secondes, il faut réparer la base de données." La base de données n'y était pour rien. L'API envoyait un e-mail de bienvenue avant de répondre à l'utilisateur. Voici tout le problème en un croquis :

Navigateur Votre API Service e-mail 3 secondes entières l'utilisateur fixe une roue de chargement tout ce temps
Tout se passe sur une seule ligne. L'étape la plus lente décide du temps de réponse.

La solution : répondre d'abord, travailler ensuite

L'utilisateur n'a pas besoin que l'e-mail existe déjà pour voir "compte créé". Il a seulement besoin de la promesse qu'il existera. On sépare donc la chronologie : on répond tout de suite, et on pousse le travail lent dans une file qu'un worker traite en arrière-plan.

Navigateur Votre API «terminé !» en 50 ms les tâches s'accumulent ici, personne ne les attend File d'attente Worker l'e-mail part quelques secondes plus tard
Deux chronologies au lieu d'une. L'utilisateur ne voit jamais que la courte.

En Laravel, ça tient en trois lignes

On pousse le travail vers une tâche mise en file, et on répond tout de suite :

SendWelcomeEmail::dispatch($user); dans le contrôleur, php artisan queue:work sur le serveur, et QUEUE_CONNECTION=redis dans l'environnement. C'est tout le principe.

Ma règle sur chaque projet : si l'utilisateur n'a pas besoin du résultat d'une tâche pour continuer, cette tâche n'a rien à faire dans la requête. E-mails, PDF, redimensionnement d'image, webhooks, analytics : tout ça part dans une file.

Chez Tamkeen, j'ai passé une bonne partie de six mois à sortir du travail des requêtes pour le mettre en file. Mêmes serveurs, même base de données, et des endpoints qui prenaient des secondes se sont mis à répondre en quelques dizaines de millisecondes.

Ce que disent les lecteurs

  1. Pas encore de mot. Le premier est toujours le plus courageux.
Vous construisez quelque chose du genre ? Je peux vous aider. Contact