Anti-patterns
L'écoconception ne s'arrête pas à l'architecture.
La manière dont on écrit le code peut avoir un impact massif sur la consommation des ressources (CPU, RAM, Réseau), surtout à grande échelle.
Voici quelques anti-patterns courants:
Le n+1 select
C'est l'erreur classique, souvent masquée par les ORM. Vous récupérez une liste d'objets, puis vous bouclez dessus pour récupérer une information liée.
Le code énergivore
// On récupère 100 utilisateurs
const users = await db.query("SELECT * FROM users LIMIT 100");
// On se retrouvwe avec une requête SQL par utilisateur
for (const user of users) {
user.posts = await db.query("SELECT * FROM posts WHERE user_id = ?", [user.id]);
}Solution possible
Utilisez une jointure (JOIN) pour tout récupérer en une seule requête SQL.
-- une seule requête optimisée
SELECT users.name, posts.title
FROM users
JOIN posts ON users.id = posts.user_id
LIMIT 100;Gain : On passe de 101 allers-retours réseau à 1 seul.
Les requêtes multiples
Le frontend a besoin d'afficher les détails de 10 produits. Il lance 10 requêtes AJAX simultanées.
Le code énergivore
const productIds = [1, 2, 3, 4, 5, ...];
// sature le réseau et le thread du navigateur
const products = await Promise.all(
productIds.map(id => fetch(`/api/products/${id}`))
);Solution possible
Créez des endpoints qui acceptent des lots (batching).
// une seule requête HTTP
const response = await fetch(`/api/products?ids=${productIds.join(',')}`);
const products = await response.json();Gain : moins de consommation batterie sur mobile.
L'Over-fetching (REST vs GraphQL)
Vous avez besoin d'afficher juste le nom et l'avatar d'un utilisateur dans une liste. Mais votre API REST renvoie l'objet utilisateur complet.
Le code énergivore
// GET /api/users/42
// Le serveur renvoie un JSON énorme du style
{
"id": 42,
"name": "Alice",
"avatar": "alice.jpg",
"address": { "street": "...", "city": "..." }, // Inutile
"preferences": { ... }, // Inutile
"history": [ ... ] // Inutile et très lourd !
}Solution possible
Utilisez GraphQL (ou une API REST avec des champs partiels) pour ne demander que le strict nécessaire.
# La réponse ne fera que quelques octets
query {
user(id: 42) {
name
avatar
}
}Gain : Économie de bande passante et de parsing JSON (CPU/batterie).