sql >> Databáze >  >> NoSQL >> MongoDB

Řešení závodních podmínek a hladovění při generování jedinečných ID pomocí MongoDB + NodeJS

K uložení ID používáte MongoDB. Je to stát. Generování ID je funkce. Mongodb použijete ke generování ID, když proces mongodb převezme argumenty funkce a vrátí vygenerované ID. To není to, co děláš. Ke generování ID používáte nodejs.

Počet vláken nebo spíše smyček událostí je kritický, protože definuje architekturu, ale v žádném případě nepotřebujete transakce. Transakce v mongodb se nazývají "multi-dokumentové transakce" přesně pro zvýraznění, že jsou určeny pro konzistentní aktualizaci několika dokumentů najednou. Úplně první odstavec https://docs.mongodb.com/manual/core/transactions / vás upozorní, že pokud aktualizujete jeden dokument, není prostor pro transakce.

Jednovláknová aplikace nevyžaduje žádnou synchronizaci. Můžete spolehlivě přečíst poslední vygenerované ID na začátku a zaručit, že ID je jedinečné v procesu nodejs. Pokud vyloučíte mongodb a další I/O z funkce generování, uděláte to synchronní, takže můžete udržovat stav ID v procesu nodejs a zaručit jeho jedinečnost. Po vygenerování můžete setrvat v databázi asynchronně. V nejhorším případě můžete mít mezeru v sekvenčních číslech, ale žádné duplikáty.

Pokud existuje sebemenší šance, že budete možná muset škálovat na více než 1 proces nodejs pro zpracování více současných požadavků nebo přidat dalšího hostitele pro redundanci v budoucnu, budete muset synchronizovat generování ID a můžete použít jedinečné indexy Mongodb pro že. Samotná funkce se příliš nemění, stále generujete ID jako v architektuře s jedním vláknem, ale přidejte další krok k uložení ID do mongo. Dokument by měl mít jedinečný index v poli ID, takže v případě souběžných aktualizací jeden z dotazů dokument úspěšně přidá a další selže s „chybou duplicitního klíče E11000“. Takové chyby zachytíte na straně nodejs a zopakujete funkci znovu s výběrem dalšího čísla:



  1. Jak spustit redis-server na jiném portu, než je výchozí port 6379 v ubuntu

  2. Nodejs / Express – Spouštění mé aplikace:express.createServer() je zastaralé

  3. Komprimujte (zkraťte) PHP řetězec z 24 znaků na 20

  4. Použití _id generovaných MongoDB jako tajných dat (např. tokenů OAuth)