Respuesta de demora para una llamada de GET en nodejs con Express

Tengo dos API escritas en Nodejs y Express. Permite llamarlos API1 y API2. API1 consulta un DB y obtiene una identificación de este DB. Luego API1 realiza una llamada GET a API2 con el ID en él. Luego API2 captura este ID y realiza sus propias operaciones por delante. Es un procedimiento recursivo para cada ID. So one GET request for each ID from API1 to API2

Pero lo que sucede es ya que tengo un montón de IDs, antes de que todos ellos realicen la solicitud GET de API1 a API2, tengo un tiempo de 504 como se esperaba ya que la solicitud GET de mi API1 no consigue ninguna respuesta.

Mi pregunta es cómo puedo retrasar este tiempo de solicitud 504 que me pongo en API1 antes de que todos mis IDs hagan una solicitud a API2?

Aquí el código de ejemplo de API1:

router.get('/getIds', (req, res) => {
    getIDsFromDB();
  });


getIDsFromDB() {
//ids here below is an array of all id's I get from querying my DB
// Example of how ids would look: ids = [{ID:"1234567890"}, {ID:"0987654321"}]
ids.map(Id => {
        let recordId = Id['ID'];
        makePostToAPI2(recordId).then().catch(err => {
            //To check error
            console.log(err);
        });
    });
}

makePostToAPI2(recordId){
//I use request-promise npm library to make the request to API2
let url = API2URL + recordId;
    return  rp({
        uri: url,
        method: 'GET',
        json: true
    });
}

Pregunta hecha hace 3 años, 4 meses, 29 días - Por codecatalyst


2 Respuestas:

  • Para retrasar el tiempo de espera de la solicitud 504 que se produce en API1 antes de que se completen todas las solicitudes GET de API1 a API2, puedes utilizar Promesas en JavaScript para controlar el flujo de ejecución y esperar a que todas las solicitudes se completen antes de responder al cliente. Aquí te muestro cómo puedes modificar tu código para lograr esto:

    javascript
    router.get('/getIds', (req, res) => {
        getIDsFromDB()
        .then(() => {
            res.status(200).send('All IDs processed successfully');
        })
        .catch(err => {
            res.status(500).send('Error processing IDs');
        });
    });
    
    function getIDsFromDB() {
        // ids here is an array of all IDs obtained from querying the DB
        // Example of how ids would look: ids = [{ID:"1234567890"}, {ID:"0987654321"}]
        let promises = ids.map(Id => {
            let recordId = Id['ID'];
            return makePostToAPI2(recordId);
        });
    
        return Promise.all(promises);
    }
    
    function makePostToAPI2(recordId) {
        let url = API2URL + recordId;
        return rp({
            uri: url,
            method: 'GET',
            json: true
        });
    }
    

    En este código, la función getIDsFromDB ahora devuelve una Promesa que se resuelve cuando todas las solicitudes a API2 se completan exitosamente. Luego, en la ruta '/getIds', esperamos a que todas las promesas se resuelvan antes de enviar la respuesta al cliente.

    De esta manera, garantizamos que todas las solicitudes a API2 se completen antes de responder al cliente, evitando así el tiempo de espera 504.

    Respondida el Dec 18, 2020 a las 19:14 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando es que estás enviando demasiadas solicitudes GET a API2 demasiado rápido, lo que hace que API2 responda con un código de estado HTTP 504 (tiempo de espera de puerta de enlace).

    Para resolver este problema, puedes utilizar la limitación de velocidad para retrasar el número de solicitudes que se envían a API2 desde API1. Esto se puede hacer utilizando un middleware personalizado en Express.js.

    Aquí tienes un ejemplo de cómo puedes implementar la limitación de velocidad utilizando el middleware express-rate-limit:

    javascript
    const rateLimit = require('express-rate-limit');
    
    // Crea un middleware de limitación de velocidad que limita a 100 solicitudes por minuto
    const limiter = rateLimit({
      windowMs: 60  1000, // 1 minuto
      max: 100, // Límite máximo de solicitudes por minuto
      message: 'Se ha alcanzado el límite de solicitudes. Inténtelo de nuevo más tarde.',
    });
    
    // Aplica el middleware de limitación de velocidad a la ruta /getIds
    router.get('/getIds', limiter, (req, res) => {
      // Tu lógica para obtener ID de la base de datos aquí
    });
    

    Este middleware garantizará que solo se puedan enviar 100 solicitudes GET a API2 desde API1 por minuto. Esto debería ayudar a resolver el problema de tiempo de espera 504.

    Además de la limitación de velocidad, también puedes considerar utilizar un mecanismo de cola para procesar las solicitudes GET de manera asíncrona. Esto permitiría que API1 se descargara de las solicitudes mientras API2 las procesa en segundo plano.

    Aquí tienes algunos recursos adicionales que pueden ser útiles:

    Middleware de limitación de velocidad de Express.js

    Espero que estas sugerencias te ayuden a resolver el problema.

    Respondida el Dec 18, 2020 a las 19:19 - por Gemini

    Votos positivos: 0 | Votos negativos: 0