Blocchi
Il problema a cui ti riferisci per lo scenario 1 è la coerenza, ovvero avere 2 negozi con le stesse informazioni e che richiedono che siano coerenti.
In un ambiente distribuito come questo, la concorrenza ottimistica può prevalere, il che significa che, invece di bloccare, consentire qualsiasi modifica in qualsiasi momento e creare un meccanismo per tracciare le sovrapposizioni.
Primo passo, ci sono dati che si sono veramente sovrapposti? O il tuo set di dati è veramente solo un insieme di elementi? In quest'ultimo caso, se ti trovi in una situazione in cui gli articoli possono essere aggiunti da qualsiasi cliente e si replicano, è sufficiente che ciascun cliente tenga traccia di quali articoli non sono stati ancora inseriti.
Se possono esserci sovrapposizioni, ad esempio, si gestiscono documenti (sembra improbabile), si ha il blocco o si concedono aggiornamenti simultanei e sovrapposizioni di flag come problema da risolvere da parte dell'utente. Esempi di questo modello:
- Sistemi di controllo della versione del software come git, mercurial, subversion, ecc.
- Evernote
- Google Documenti
Se hai mai lavorato con il controllo della versione del software, riconoscerai l'idea di un conflitto di fusione e / o sovrapposizione. Questo è lo stesso problema che hai. I sistemi di controllo del codice sorgente come Vault evitano questo problema da parte di ciascun client che tratta ogni file come di sola lettura fino a quando un file non viene "estratto", il che crea un blocco reciprocamente esclusivo su tutti i client. Git, d'altra parte, identificherà i conflitti, li unirà se può farlo, e in caso contrario, costringerà l'utente finale (sviluppatore) a unirsi manualmente.
Evernote consente a mia moglie ed io di modificare la nostra lista della spesa. Per minimizzare i conflitti, ci sincronizziamo il più spesso possibile, ma ci sarà sempre la possibilità di avere cambiamenti in conflitto, cosa che è accaduta. Evernote aggiunge semplicemente versioni di documenti in conflitto l'una sopra l'altra con marcatori che indicano che c'era un conflitto.
In un caso in cui i cambiamenti simultanei sono rari, di solito questo tipo di concorrenza ottimistica è l'ideale. In un sistema di transazioni altamente concorrente, il blocco potrebbe essere un approccio migliore.
Dimensioni
Per quanto riguarda la dimensione dei dati, hai due opzioni a cui posso pensare:
- Impaginazione
- Streaming
L'impaginazione è probabilmente il modo in cui andrei perché è più semplice codificare, di solito, e più facilmente tracciare i tuoi progressi, e in un certo senso, ti dà più controllo. Con i miei consigli per la gestione della coerenza sopra, si spera che l'impaginazione diventi un non-problema.
Lo streaming potrebbe essere un'alternativa anche per te e ridurrebbe il rischio in termini di coerenza dato che avresti un singolo round trip. Lo streaming fondamentalmente significa cambiare questo flusso di dati:
results = getResultsFromServer();
for (result in results) {
doSomething(result)
}
a:
getResultsFromServer((result) => {
doSomething(result)
})
Nel primo caso, l'intero set di risultati deve essere memorizzato nel buffer in modo da poterlo scorrere sopra, anche se si consumano solo i dati uno alla volta in modo forward-only. In quest'ultimo, hai solo bisogno di un articolo alla volta. Ho implementato questo approccio una sola volta per un ampio report che avrebbe sommerso i nostri server di produzione quando un cliente lo eseguiva per un intervallo di date molto ampio.