Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

92
Views
¿Cuál es la forma óptima de realizar una gran cantidad de solicitudes http en Node.js?

Supongamos que hay una tienda con 500 productos, cada uno con una ID que va de 0 a 500, cada uno con sus datos almacenados en un archivo JSON que vive bajo una URL (por ejemplo, myshop.com/1.json , ...2.json , etc.) .

Con un script de Node.js, me gustaría descargar todos estos archivos JSON y almacenarlos localmente. Puedo hacerlo consecutivamente:

 const totalProductsCount = 500; try { let currentItem = 1; while (currentItem < (totalProductsCount + 1)) { const product = await axios.get(`https://myshop.com/${currentItem}.json`); fs.writeFileSync(`./product-${currentItem}.json`, JSON.stringify(product.data, null, 2)); currentItem++; } } catch (e) { return; }

que funciona Sin embargo, me gustaría descargar estos archivos rápido, muy rápido. Así que estoy tratando de dividir todas mis solicitudes en grupos y obtener estos grupos en paralelo. Lo que tengo es lo siguiente:

 const _ = require('lodash'); const fs = require('fs'); const axios = require('axios'); const getChunk = async (chunk, index) => { // The counter here is used for logging purposes only let currentItem = 1; try { // Iterate through the items 1-50 await chunk.reduce(async (promise, productId) => { await promise; const product = await axios.get(`https://myshop.com/${productId}`); if (product && product.data) { console.log('Got product', currentItem, 'from chunk', index); fs.writeFileSync(`./product-${productId}.json`, JSON.stringify(product.data, null, 2)); } currentItem++; }, Promise.resolve()); } catch (e) { throw e; } } const getProducts = async () => { const totalProductsCount = 500; // Create an array of 500 elements => [1, 2, 3, 4, ..., 499, 500] const productIds = Array.from({ length: totalProductsCount }, (_, i) => i + 1); // Using lodash, I am chunking that array into 10 groups of 50 each const chunkBy = Math.ceil(productIds.length / 10); const chunked = _.chunk(productIds, chunkBy); // Run the `getChunkProducts` on each of the chunks in parallel const products = await Promise.all([ ...chunked.map((chunk, index) => getChunk(chunk, index)) ]) // If the items are to be returned here, it should be with a single-level array return _.flatten(products); }; (async () => { const products = await getProducts(); })()

Esto parece estar funcionando la mayor parte del tiempo, especialmente cuando lo uso en una cantidad menor de artículos. Sin embargo, hay un comportamiento que no puedo explicar, donde el script se cuelga cuando pido grandes cantidades de artículos.

¿Cuál sería la mejor manera de lograr esta/mejor práctica y poder capturar cualquier archivo que se cuelgue o que no se haya descargado (ya que pienso que puedo descargar todo lo que pueda con la acción de fragmentación y luego regresar una matriz de todos los ID de productos que no se pudieron descargar, y descárguelos usando el primer método de forma consecutiva).

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

¡Está escribiendo archivos sincrónicamente en medio de una acción asíncrona! Cambie writeFileSync para usar la versión asíncrona. Esto debería ser una mejora inmediata. Como una mejora de rendimiento adicional, idealmente usaría una ruta de código que no analice la respuesta si desea que los resultados se escriban directamente en un archivo. Parece que puede usar responseType: 'stream' en la configuración de su solicitud para lograr esto. Esto evitaría la sobrecarga de analizar la respuesta en un objeto JS antes de escribirlo en el archivo.

También parece que es posible que también desee ajustar el tiempo de espera en sus solicitudes http para que estén en un nivel más bajo para determinar si debe fallar después de unos segundos en lugar de esperar una solicitud que cree que debería fallar. Si consulta los documentos, hay un parámetro en la configuración de solicitud que puede reducir a unos segundos. https://axios-http.com/docs/req_config

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!