sql >> Base de Datos >  >> NoSQL >> MongoDB

Lidiar con las condiciones de carrera y el hambre al generar identificaciones únicas usando MongoDB + NodeJS

Está utilizando MongoDB para almacenar la ID. es un estado La generación del ID es una función. Utiliza Mongodb para generar la ID cuando el proceso mongodb toma argumentos de la función y devuelve la ID generada. No es lo que estás haciendo. Está utilizando nodejs para generar la ID.

La cantidad de subprocesos, o más bien los bucles de eventos, es fundamental ya que define la arquitectura, pero de cualquier manera no necesita transacciones. Las transacciones en mongodb se denominan "transacciones de documentos múltiples" exactamente para resaltar que están destinadas a la actualización constante de varios documentos a la vez. El primer párrafo de https://docs.mongodb.com/manual/core/transactions //a> te advierte que si actualizas un solo documento no hay espacio para transacciones.

Una aplicación de un solo subproceso no requiere ninguna sincronización. Puede leer de manera confiable la última ID generada al inicio y garantizar que la ID sea única dentro del proceso de nodejs. Si excluye mongodb y otras E/S de la función de generación, la hará sincrónica para que pueda mantener el estado de la ID dentro del proceso de nodejs y garantizar su singularidad. Una vez generado, puede persistir en la base de datos de forma asíncrona. En el peor de los casos, es posible que haya una brecha en los números secuenciales, pero no duplicados.

Si existe la más mínima posibilidad de que necesite escalar a más de 1 proceso nodejs para manejar más solicitudes simultáneas o agregar otro host para la redundancia en el futuro, deberá sincronizar la generación de la ID y puede emplear índices únicos de Mongodb para que. La función en sí no cambia mucho, aún genera la ID como en una arquitectura de un solo subproceso, pero agrega un paso adicional para guardar la ID en mongo. El documento debe tener un índice único en el campo de ID, por lo que, en caso de actualizaciones simultáneas, una de las consultas agregará correctamente el documento y otra fallará con "E11000 error de clave duplicada". Captura tales errores en el lado de nodejs y repite la función nuevamente eligiendo el siguiente número: