2012-05-07 11 views
6

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:

  1. 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.

  2. Utilizzare le transazioni Redis e pubsub per ottenere lo stesso effetto. Non sono ancora sicuro di come farlo, ma sembra plausibile.

  3. 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!

+3

+1 solo per l'utilizzo di node.js + MongoDB –

+0

un'occhiata anche a Neo4j se si è alla ricerca di dati più simile a un grafico di un insieme di documenti ... –

+0

Thanks :) io prendo uno sguardo che troppo . – johncch

risposta

0

Se ho capito correttamente e l'elenco viene archiviato come un singolo documento, è possibile che si stia verificando il controllo delle versioni delle righe. Quindi aggiungere un alloggio al documento che gestirà la versione, quando si aggiorna, si aumenta (o modificare) la versione e fate che un aggiornamento condizionale:

// aggiornamento (condizione, valore)

aggiornamento ({version: whatYouReceivedWhenYouDidFind}, newValue)

Spero che sia d'aiuto. Gus

0

Si desidera che il comando findAndModify su mongodb garantisca una modifica atomica durante la restituzione del documento appena modificato. Come i cambiamenti sono di serie e atomiche esempio 1 avrà a-> b-> c e l'istanza 2 avranno a-> b-> c-> d

Acclamazioni

+0

Sfortunatamente avrò bisogno di fare un po 'di elaborazione tra i comandi find e modify così sembra che non sarebbe possibile usare questa API mongo? – johncch

0

Se tutti si stanno facendo è l'aggiunta di nuovi elementi all'elenco, è possibile utilizzare un elenco di Redis e includere il tempo in ogni valore aggiunto. L'elenco può essere non ordinato su redis, ma dovrebbe essere rapidamente ordinabile quando recuperato.

Problemi correlati