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?
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:
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.