Node.js: punto final sincrónico HTTP

Tenemos una pequeña aplicación que soporta POSTing un mensaje XML a un punto final que valida XML y si son correctos ponerlos en un autobús de evento. El desarrollador que hizo esta aplicación la construyó en Node. JS y aquí es donde nos estamos metiendo en problemas. Algunos mensajes se publican con sólo unos pocos milisegundos separados uno del otro.

Parece que la orden no siempre es correcta cuando se coloca en el autobús del evento. Me preguntaba si hay una solución para garantizar un pedido?

La aplicación está utilizando express.js como servidor http.

app.post("/", async (request, response) => {
        // do some stuff
    });

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


2 Respuestas:

  • El problema que estás experimentando probablemente se deba a que tienes un punto final HTTP POST sincrónico en tu aplicación Node.js. Cuando recibes múltiples solicitudes casi al mismo tiempo, Node.js puede tener dificultades para procesarlas de forma síncrona, lo que puede llevar a que algunas solicitudes se pierdan o se mezclen.

    Para garantizar que las solicitudes se manejen de forma ordenada y sin problemas, puedes utilizar un sistema de colas o procesamiento asíncrono para manejar las solicitudes de forma más eficiente. Una forma común de hacerlo en Node.js es utilizar bibliotecas como async o queue para gestionar las solicitudes de forma asíncrona y ordenada.

    Aquí te muestro un ejemplo utilizando la biblioteca async para manejar las solicitudes de forma asíncrona en tu punto final HTTP POST:

    javascript
    const async = require('async');
    
    const queue = async.queue(async (task, callback) => {
        // Realizar el procesamiento de la tarea
        console.log('Procesando tarea:', task);
        callback();
    }, 1); // Límite de 1 tarea a la vez
    
    app.post("/", (request, response) => {
        const newTask = request.body;
    
        queue.push(newTask, (err) => {
            if (err) {
                console.error(err);
                response.status(500).send('Error en el servidor.');
            } else {
                response.send('Tarea recibida y en proceso.');
            }
        });
    });
    

    En este ejemplo, estamos creando una cola asíncrona utilizando la biblioteca async.queue, que procesa una tarea a la vez. Cada solicitud POST recibida se agrega a la cola, y se procesa de forma ordenada asegurando que no haya problemas al manejar múltiples solicitudes simultáneamente.

    Espero que esta solución te ayude a resolver el problema que estás enfrentando en tu aplicación Node.js.

    Respondida el Dec 19, 2020 a las 10:58 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Usar un Middleware de Bloqueo

    Puedes utilizar un middleware de bloqueo para asegurarte de que solo se procesa una solicitud a la vez. Aquí tienes un ejemplo:

    
    const express = require('express');
    const app = express();
    
    // Middleware de bloqueo
    const lock = require('express-lock');
    app.use(lock());
    
    app.post("/", async (request, response) => {
            // do some stuff
        });
    

    El middleware lock bloqueará todas las demás solicitudes hasta que la solicitud actual se complete.

    Usar una Cola

    También puedes utilizar una cola para almacenar las solicitudes y procesarlas una a la vez. Aquí tienes un ejemplo:

    
    const express = require('express');
    const app = express();
    const queue = require('queue');
    
    // Cola de solicitudes
    const q = queue({
      concurrency: 1
    });
    
    app.post("/", async (request, response) => {
      // Añadir la solicitud a la cola
      q.push(async () => {
        // do some stuff
      });
    });
    

    La cola q solo procesará una solicitud a la vez, garantizando el orden.

    Configurar Express para el Procesamiento en Serie

    También puedes configurar Express para procesar las solicitudes en serie, desactivando el procesamiento paralelo. Aquí tienes un ejemplo:

    
    const express = require('express');
    const app = express();
    
    // Desactivar el procesamiento paralelo
    app.set('trust proxy', true);
    
    app.post("/", async (request, response) => {
            // do some stuff
        });
    

    Esta configuración asegura que las solicitudes se procesen una a la vez en el orden en que se reciben.

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

    Votos positivos: 0 | Votos negativos: 0