Come inviare un file e registrare che è stato inviato in modo atomico?

4

Non sono sicuro di come affrontare al meglio questo problema. Ho un oggetto nel mio database locale, per esempio questo:

{ title: "my-object", uploaded: false }

Lo converto in un file, diciamo my-object.txt e lo carico su un server. Una volta caricato, ho impostato, localmente, il campo uploaded in true , quindi diventerà:

{ title: "my-object", uploaded: true }

Il mio problema è come gestire l'errore? Ad esempio, se l'applicazione viene arrestata o si blocca tra il momento in cui il file viene caricato e il database locale viene aggiornato, l'elemento rimarrà con uploaded: false e non avrò modo di scoprire se il file è stato caricato o meno.

Quindi quale tecnica posso utilizzare per rendere questo processo più affidabile?

    
posta this.lau_ 30.06.2017 - 00:18
fonte

2 risposte

5

Non penso che si tratti di operazioni atomiche, sincronizzazione, programmazione asincrona o transazioni.

Penso che si tratti di uno stato significativo.

In questo momento hai tre stati possibili. Il campo caricato dell'oggetto è vero, è falso o il record degli oggetti non esiste.

La domanda allora è che cosa significano questi tre stati? Come arriviamo a loro? Come li lasciamo?

Mi piacerebbe pensare che iniziamo con il record non esistente. Quindi qualcosa decide che abbiamo bisogno di memorizzare un oggetto my nel DB e ora siamo caricati: false. Per quanto ne so, passa un decennio e poi qualcosa decide che è il momento di caricare. Dal momento che siamo ancora caricati: falso qualcosa prova a caricare il nostro oggetto. Una volta che il server ci dice che ha il file, possiamo impostare il caricamento su true.

Ora è certo che tutto può accadere durante tutto questo, ma qui non c'è nulla di transazionale. Lasciamo caricato come falso finché non lo sappiamo caricato. Se il cavo di alimentazione viene strappato via prima che riusciamo a capovolgere il bit, allora pensiamo che dobbiamo caricare di nuovo. Non c'è modo di fermarlo.

Quello che potremmo fare è controllare con il server prima di caricare e confermare che ha bisogno del file. O possiamo ciecamente sovrascrivere cosa c'è e salvare la seccatura.

Quello che sarebbe sciocco sarebbe "ripristinare" il caricamento del file in modo che possiamo inviarlo di nuovo. Tutto ciò che si traduce è la possibilità di sovrascrivere il file.

Quindi se quegli stati esprimono tutto ciò che devi sapere, allora stai bene. Ora se hai bisogno di fare qualcosa di speciale o sapere se si è verificato un errore per una buona ragione come il disco rigido del server è pieno, allora forse vuoi registrare più informazioni di quelle vere e false da qualche parte.

Una volta che hai deciso di farlo, pensa a cosa vuoi fare al riguardo.

    
risposta data 30.06.2017 - 02:21
fonte
3

Modifica il tuo punto di vista: interpreta la modifica del campo uploaded a true come parte dell'operazione di caricamento. Se si verifica un errore perché

  • il caricamento fallito
  • o l'applicazione si è bloccata nel momento in cui il file viene caricato e il database locale viene aggiornato

non ha importanza . Immagino che nella maggior parte dei casi reali si verificherà la seconda situazione, quindi raramente non importa se in questa situazione un file è stato caricato due volte. La situazione non è molto diversa dal caso in cui il file è stato caricato al 99% prima che un'interruzione di rete faccia fallire il caricamento.

Naturalmente, se il server non consente il caricamento di un file già caricato di nuovo, quindi la tua premessa di "non è un modo per scoprire se il file è stato caricato o meno" diventa sbagliato, in in questo caso hai un modo per scoprire se il file è già presente sul server e potresti utilizzarlo.

    
risposta data 30.06.2017 - 07:56
fonte

Leggi altre domande sui tag