Backpressure

Architecture 🔴 Senior

Définition

Mécanisme par lequel un consommateur lent signale au producteur de ralentir, pour éviter que les données s'accumulent en mémoire jusqu'au plantage. Dans les streams Node.js, write() renvoie false quand le tampon interne dépasse highWaterMark et l'événement drain indique quand reprendre ; pipeline() gère cela automatiquement. Le même principe existe en Kafka (consommation par lot), en RxJS et dans les files de messages (limites de préfetch).

Analogie

Un serveur qui apporte les plats au rythme où le convive les mange, au lieu d'empiler quinze assiettes sur la table jusqu'à ce qu'elle cède.

Exemple de code

import { pipeline } from 'node:stream/promises';
import { createReadStream, createWriteStream } from 'node:fs';
import { createGzip } from 'node:zlib';

// pipeline() propage la backpressure et les erreurs :
// si le disque écrit lentement, la lecture ralentit d'elle-même.
await pipeline(
  createReadStream('export-10go.csv'),
  createGzip(),
  createWriteStream('export-10go.csv.gz'),
);

// À la main, ce serait :
// if (!dest.write(chunk)) await once(dest, 'drain');

Cas d'usage

Export de fichiers volumineux, relais de flux HTTP, ingestion de messages : partout où un producteur rapide alimente un consommateur plus lent.

Anti-pattern

Enchaîner src.on('data', chunk => dest.write(chunk)) en ignorant la valeur de retour de write() : la mémoire du processus gonfle jusqu'au crash.
#architecture#resilience#streams

Fiche mise à jour le 2026-09-27

← → au clavier pour passer d'une fiche à l'autre