Vous lancez une requête pour récupérer une liste, puis vous bouclez sur les lignes et vous émettez une autre requête par ligne, donc 200 posts deviennent 201 allers-retours. Corrigez-le en chargeant les lignes liées en une seule passe : une jointure, une requête IN indexée par identifiant parent, ou un loader qui regroupe les identifiants dans le même tick de requête. Le symptôme, c'est une latence qui croît linéairement avec le nombre de résultats alors que chaque requête individuelle paraît rapide.
Pourquoi les recruteurs posent cette question
C'est le bug de performance le plus courant dans les applications adossées à un ORM, donc le recruteur vérifie que vous le reconnaîtriez sur le terrain et pas seulement que vous savez le définir. Il veut vous entendre expliquer comment vous le détecteriez, parce que les requêtes ont l'air saines individuellement et que seul leur nombre cloche. Mentionner l'outillage que vous utiliseriez pour le repérer sépare ceux qui l'ont débogué de ceux qui en ont lu la définition.
Comment structurer votre réponse
- Définissez le motif avec un décompte concret.
- Décrivez comment vous le détecteriez dans une application qui tourne.
- Donnez au moins deux correctifs et quand chacun s'applique.
- Notez l'inconvénient du chargement anticipé systématique.
Exemple de réponse
Ça apparaît en général dès que quelqu'un affiche une liste. Vous récupérez des commandes, puis dans le template vous touchez order.customer.name, et l'ORM émet discrètement une requête par ligne. Individuellement elles font une demi-milliseconde, donc rien ne semble cassé jusqu'à ce que la liste grossisse et que l'endpoint mette quatre secondes. Je le détecte en regardant le nombre de requêtes par requête HTTP plutôt que leur durée ; la plupart des outils d'APM le montrent directement, et en local j'active la journalisation des requêtes et je compte. Le correctif dépend de la forme. Pour une relation belongs to simple, un chargement anticipé ou une jointure suffit. Pour un un-à-plusieurs où une jointure multiplierait les lignes, je préfère une deuxième requête avec une clause IN et un assemblage en mémoire. Dans une API GraphQL, il faut un dataloader, parce que les resolvers n'ont aucune idée qu'ils sont appelés en lot. Ce que j'évite, c'est le chargement anticipé de tout par défaut, puisque ça échange un problème contre le fait de tirer la moitié de la base en mémoire.
Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.
Voir comment ça marcheQuestions de relance à prévoir
- Comment attraperiez-vous ça en CI avant que ça parte ?
- Quand une jointure est-elle pire que deux requêtes séparées ?
- Comment le batching fonctionne-t-il à travers un arbre de resolvers GraphQL ?
Autres questions pour Développeur full stack
Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.
Prédire mes questions