Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

252
Vistas
Express JS: ¿cómo maneja las solicitudes simultáneas y evita la colisión?

Soy nuevo en el desarrollo de nodejs/Express.js.

He creado mi servicio de back-end con Express.js/Typescript y tengo varias rutas/puntos finales de api definidos. Uno es así:

 app.post('/api/issues/new', createNewIssue);

donde el navegador enviará una solicitud de publicación cuando un usuario envíe una nueva foto (también llamado problema en mi aplicación).

El usuario puede enviar un problema a otro usuario, y el backend primero consultará la base de datos para encontrar la cantidad de problemas que coincidan con las condiciones de "usuario de origen" y "usuario de destino", y luego le dará al nuevo problema una ID de identificación en el form srcUser-dstUser-[number] , donde number es el conteo incrementado automáticamente.

La función createNewIssue es así:

 export const createNewIssue = catchErrors(async (req, res) => { const srcUser = req.header('src_username'); const dstUser = req.header('dst_username'); // query database for number of issues matching "srcUser" and "dstUser" ... const lastIssues = await Issue.find( {where: {"srcUser": srcUser, "dstUser": dstUser}, order: { id: 'DESC'}}); const count = lastIssues.length; // create a new issue Entity with the ID `srcUser-dstUser-[count+1]` const newIssue = await createEntity(Issue, { ... id: `srcUser-dstUser-${count+1}`, ... }); res.respond({ newIssue: newIssue}); })

Digamos que el backend recibe múltiples solicitudes con los mismos atributos srcUser y dstUser al mismo tiempo, ¿habrá colisiones donde se crean múltiples problemas nuevos con la misma identificación?

He leído alguna documentación sobre nodejs con un solo subproceso, pero no estoy seguro de qué significa eso definitivamente para este escenario específico.


Además de la lógica empresarial en este escenario, tengo algunas confusiones en general sobre Express JS/Node JS:

Cuando solo hay un núcleo de CPU, Express JS procesa varias solicitudes simultáneas de forma asíncrona: comienza a procesar una y no espera a que termine, sino que continúa procesando la siguiente. ¿Es este entendimiento exacto?

Cuando hay varios núcleos de CPU, ¿Express JS/Node Js los utiliza todos de la misma manera?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Node.js no resolverá este problema automáticamente.

Si bien solo se ocupará de una cosa a la vez, es muy posible que la Solicitud 2 solicite la última identificación en la base de datos mientras que la Solicitud 1 ha presionado la declaración de await en el mismo punto y se ha ido a dormir. Esto significaría que obtienen la misma respuesta y cada uno intentaría crear una nueva entrada con la misma ID.

Debe escribir su JavaScript para asegurarse de que esto no suceda.

Las formas habituales de manejar esto serían:

  • Deje que la base de datos (y no su JavaScript) maneje la generación de ID (generalmente mediante el uso de una secuencia .
  • Use transacciones para que la base de datos trate la solicitud de la última ID y la inserción de la nueva fila como una sola operación (por lo que no comenzará la misma operación para la Solicitud 2 hasta que se hayan realizado la selección y la inserción para la Solicitud 1) .
  • Pruebe para asegurarse de que createEntity tenga éxito (y no arroje un error de 'identificación duplicada') e intente nuevamente si falla (con un límite en caso de que siga fallando, en cuyo caso debería devolver un mensaje de error al cliente).

Los detalles dependen de la base de datos que utilice. Me vinculé a la documentación de Postgresql por el bien del ejemplo.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda