Control de concurrencia asíncrona en Node.js: semáforos, throttling y backpressure

Promise.all(items.map(fn)) es una de las líneas más peligrosas en un codebase de Node.js. Parece razonable: procesar todo en paralelo y esperar el resultado. Lo que realmente hace es disparar cada promesa simultáneamente sin ninguna consideración por la memoria, los rate limits de APIs externas o los pools de conexiones a la base de datos. Con 50 elementos funciona bien. Con 50.000 es un incidente.

Controlar la concurrencia es una preocupación de primer orden en los servicios Node.js en producción, no una ocurrencia tardía. Los patrones son sencillos de implementar y la recompensa es enorme.