MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Gérer les conditions de concurrence et la famine lors de la génération d'identifiants uniques à l'aide de MongoDB + NodeJS

Vous utilisez MongoDB pour stocker l'ID. C'est un état. La génération de l'ID est une fonction. Vous utilisez Mongodb pour générer l'ID lorsque le processus mongodb prend les arguments de la fonction et renvoie l'ID généré. Ce n'est pas ce que vous faites. Vous utilisez nodejs pour générer l'ID.

Le nombre de threads, ou plutôt de boucles d'événements, est essentiel car il définit l'architecture, mais dans les deux cas, vous n'avez pas besoin de transactions. Les transactions dans mongodb sont appelées "transactions multi-documents" exactement pour souligner qu'elles sont destinées à la mise à jour cohérente de plusieurs documents à la fois. Le tout premier paragraphe de https://docs.mongodb.com/manual/core/transactions / vous avertit que si vous mettez à jour un seul document, il n'y a pas de place pour les transactions.

Une application à thread unique ne nécessite aucune synchronisation. Vous pouvez lire de manière fiable le dernier ID généré au démarrage et garantir que l'ID est unique dans le processus nodejs. Si vous excluez mongodb et d'autres E/S de la fonction de génération, vous la rendrez synchrone afin de pouvoir conserver l'état de l'ID dans le processus nodejs et garantir son unicité. Une fois généré, vous pouvez persister dans la base de données de manière asynchrone. Dans le pire des cas, vous pouvez avoir un écart dans les numéros séquentiels mais pas de doublons.

S'il y a la moindre chance que vous deviez passer à plus d'un processus nodejs pour gérer plus de demandes simultanées ou ajouter un autre hôte pour la redondance à l'avenir, vous devrez synchroniser la génération de l'ID et vous pouvez utiliser des index uniques Mongodb pour ce. La fonction elle-même ne change pas grand-chose, vous générez toujours l'ID comme dans une architecture à un seul thread, mais ajoutez une étape supplémentaire pour enregistrer l'ID dans mongo. Le document doit avoir un index unique sur le champ ID, donc en cas de mises à jour simultanées, l'une des requêtes ajoutera avec succès le document et une autre échouera avec "E11000 erreur de clé en double". Vous attrapez de telles erreurs du côté de nodejs et répétez la fonction en choisissant le numéro suivant :