2010-04-08 16 views
7

Sto leggendo un articolo sul framework di sharing Gizzard recentemente pubblicato da twitter (http://engineering.twitter.com/2010/04/introducing-gizzard-framework-for.html). Indica che tutte le operazioni di scrittura devono essere idempotenti per garantire un'elevata affidabilità.Come rendere idempotente l'operazione di scrittura?

Secondo wikipedia, "Le operazioni di idempotenza sono operazioni che possono essere applicate più volte senza modificare il risultato." Ma, IMHO, nel caso Gizzard, le operazioni di scrittura idempotenti dovrebbero essere quelle in cui la sequenza non ha importanza.

Ora, la mia domanda è: Come posso rendere le operazioni di scrittura idempotenti?

L'unica cosa che posso immaginare è avere un numero di versione allegato a ogni scrittura. Ad esempio, in un sistema di blog, ogni blog deve avere un articolo $ blog_id e $. A livello di applicazione, scriviamo sempre contenuti di blog come questo write ($ blog_id, $ content, $ version). La versione $ è determinata per essere unica a livello di applicazione. Quindi, se un'applicazione tenta prima di impostare un blog su "Hello world" e secondo vuole che sia "Goodbye", quindi scrivere è idempotente. Abbiamo due operazioni di scrittura di questo tipo:

write($blog_id, "Hello world", 1); 
write($blog_id, "Goodbye", 2); 

Queste due operazioni dovrebbero cambiare due diversi record nel DB. Quindi, non importa quante volte e in quale sequenza vengono eseguite queste due operazioni, i risultati sono gli stessi.

Questa è solo la mia comprensione. Per favore correggimi se sbaglio.

risposta

3

Hai assolutamente ragione. Le operazioni idempotenti da sole possono fornire solo un modello di risoluzione dei conflitti - "L'ultima scrittura vince". È una possibile soluzione se le tue scritture non possono essere riordinate in tempo. Se è possibile, è necessario fornire ulteriori informazioni per rendere automatica la risoluzione dei conflitti. E la tua idea non è nuova. Nel caso generale si chiama vector clocks.

Utilizziamo la risoluzione dei conflitti basata sulla versione in uno dei nostri sistemi che raccolgono la cronologia delle modifiche degli oggetti nel nostro sistema. I client inviano lo stato dell'oggetto completo e le informazioni sulla versione a un modulo di cronologia (in modo asincrono). Il modulo cronologia può quindi riordinare gli stati dell'oggetto nel modo corretto e salvare solo il delta nella memoria persistente. L'unica limitazione è che il client deve utilizzare una sorta di controllo della concorrenza quando apporta modifiche all'oggetto (optimistic locking è un metodo molto valido se si tiene traccia della versione dello stato dell'oggetto).

2

Hai l'idea giusta. L'impostazione di un valore particolare è idempotente, perché se esegui quell'operazione più di una volta, ottieni lo stesso risultato. La classica scrittura non idempotente è un'append, perché la ripetizione porterebbe a più copie aggiunte.

Vedere anche questo previous stackoverflow question.