Come gestire in modo affidabile i file caricati periodicamente da un agente esterno?
-
05-07-2019 - |
Domanda
È uno scenario molto comune: alcuni processi vogliono rilasciare un file su un server ogni 30 minuti circa. Semplice vero? Bene, posso pensare a un sacco di modi in cui ciò potrebbe andare storto.
Ad esempio, l'elaborazione di un file può richiedere più o meno di 30 minuti, quindi è possibile che arrivi un nuovo file prima che abbia finito con quello precedente. Non voglio che il sistema di origine sovrascriva un file che sto ancora elaborando.
D'altra parte, i file sono grandi, quindi ci vogliono alcuni minuti per terminare il caricamento. Non voglio iniziare l'elaborazione di un file parziale. I file vengono semplicemente trasferiti con FTP o sftp (la mia preferenza), quindi il blocco a livello di sistema operativo non è un'opzione.
Infine, devo conservare i file per un po ', nel caso in cui ho bisogno di ispezionarne uno manualmente (per il debug) o rielaborarne uno.
Ho visto molti approcci ad-hoc per mescolare i file caricati, scambiare nomi di file, usare datastamp, toccare " indicatore " file per facilitare la sincronizzazione e così via. Quello che non ho ancora visto è un algoritmo "quot" completo per l'elaborazione di file che affrontano concorrenza, coerenza e completezza.
Quindi, vorrei attingere alla saggezza della folla qui. Qualcuno ha visto un modo davvero antiproiettile per destreggiarsi tra i file di dati batch in modo che non vengano mai elaborati troppo presto, mai sovrascritti prima e fatti in modo sicuro dopo l'elaborazione?
Soluzione
La chiave è fare la giocoleria iniziale alla fine invio . Tutto ciò che il mittente deve fare è:
- Archivia il file con un nome file univoco.
- Non appena il file è stato inviato, spostalo in una sottodirectory denominata ad es.
completato
.
Supponendo che vi sia un solo processo di ricezione, tutto ciò che il ricevitore deve fare è:
- Scansiona periodicamente la directory
completata
per individuare eventuali file. - Non appena un file appare in
completato
, spostalo in una sottodirectory chiamata ad es.elaborato
e inizia a lavorarci da lì. - Opzionalmente eliminalo al termine.
Su qualsiasi filesystem sano, gli spostamenti dei file sono atomici a condizione che si verifichino all'interno dello stesso filesystem / volume. Quindi non ci sono condizioni di gara.
Ricevitori multipli
Se l'elaborazione potrebbe richiedere più tempo del periodo tra la consegna dei file, si creerà un backlog a meno che non si disponga di più processi di ricezione. Quindi, come gestire il caso con più ricevitori?
Semplice: ogni processo del ricevitore funziona esattamente come prima. La chiave è che tentiamo di spostare un file in elaborato
prima lavorando su di esso: questo, e il fatto che gli stessi spostamenti del file dello stesso filesystem siano atomici, significa che anche se multipli i ricevitori vedono lo stesso file in completato
e provano a spostarlo, solo uno riuscirà. Tutto quello che devi fare è assicurarti di controllare il valore di ritorno di rename ()
o di qualunque chiamata del sistema operativo che usi per eseguire lo spostamento, e procedi con l'elaborazione solo se ha esito positivo. Se la mossa non è andata a buon fine, qualche altro ricevitore è arrivato prima, quindi torna indietro ed esegui nuovamente la scansione della directory completata
.
Altri suggerimenti
Se il sistema operativo lo supporta, utilizzare gli hook del file system per intercettare le operazioni di apertura e chiusura dei file. Qualcosa come Dazuko . Altri sistemi operativi potrebbero farti conoscere le operazioni sui file in modo anoter, ad esempio Novell Open Enterprise Server ti consente di definire epoche e leggi elenco di file modificati durante un'epoca.
Ho appena capito che in Linux puoi usare il sottosistema inotify o le utility dal pacchetto inotify-tools
Il trasferimento di file è uno dei classici dell'integrazione di sistema. Ti consiglierei di ottenere il Enterprise Integration Patterns per creare la tua risposta a queste domande - a in qualche misura, la risposta dipende dalle tecnologie e dalle piattaforme utilizzate per l'implementazione degli endpoint e per il trasferimento dei file. È una raccolta abbastanza completa di modelli realizzabili e abbastanza ben scritta.