Attualmente sto scrivendo un'app Node e sto pensando al futuro nel ridimensionamento. Come ho capito, il ridimensionamento orizzontale è uno dei modi più semplici per scalare un'applicazione per gestire più richieste simultanee. La mia copia di lavoro utilizza attualmente MongoDb sul backend.Istanze di nodo multiple con un singolo database
La mia domanda è quindi questa: ho una struttura dati che assomiglia a una lista collegata che richiede che l'ordine sia mantenuto rigorosamente. La mia preoccupazione (immaginaria) è che quando c'è una condizione di competizione nel database attraverso più istanze di nodi, è possibile che la risoluzione dell'elenco collegato sia errata.
Per fare un esempio: Immagina che il server abbia questa lista a-> b. L'istanza 1 entra con l'oggetto c e l'istanza 2 entra con l'oggetto d. È possibile che ci sia una condizione di competizione in cui entrambe le istanze leggono a-> b e decide di aggiungere i propri oggetti alla lista. L'istanza 1 immaginerà quindi che l'inserimento sia a-> b-> c mentre l'istanza 2 pensa che sia a-> b-> d quando il database contiene effettivamente a-> b-> c-> d.
In generale, questo sembra un lavoro per il blocco ottimistico, tuttavia, come ho capito, né MongoDB né Redis (l'altro database che sto considerando) eseguono le transazioni in modo SQL.
pertanto immagino la soluzione per essere uno dei seguenti:
realizzare il mio propria transazione in MongoDB usando bandiere. Il client esegue un findAndModify sulla variabile lock e, se ha esito positivo, esegue le operazioni. In caso di insuccesso, il cliente riproverà dopo un determinato timeout.
Utilizzare le transazioni Redis e pubsub per ottenere lo stesso effetto. Non sono ancora sicuro di come farlo, ma sembra plausibile.
Implementare una sorta di bilanciamento del carico intelligente. Se più client operano sullo stesso articolo, indirizzarli alla stessa istanza. Poiché JS è a thread singolo, il problema sarebbe risolto. Sfortunatamente, non ho trovato una soluzione semplice a questo.
Sono sicuro che esiste un modo migliore, più elegante per ottenere quanto sopra, e mi piacerebbe sentire qualsiasi soluzione o suggerimento. Grazie!
+1 solo per l'utilizzo di node.js + MongoDB –
un'occhiata anche a Neo4j se si è alla ricerca di dati più simile a un grafico di un insieme di documenti ... –
Thanks :) io prendo uno sguardo che troppo . – johncch