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?

È stato utile?

Soluzione

La chiave è fare la giocoleria iniziale alla fine invio . Tutto ciò che il mittente deve fare è:

  1. Archivia il file con un nome file univoco.
  2. 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 è:

  1. Scansiona periodicamente la directory completata per individuare eventuali file.
  2. Non appena un file appare in completato , spostalo in una sottodirectory chiamata ad es. elaborato e inizia a lavorarci da lì.
  3. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top