tecnica per elaborare una cartella di file da più macchine

0

C'è una singola cartella di file condivisa in rete che deve essere elaborata da thread in esecuzione su diversi server. Una volta che un thread inizia l'elaborazione di un determinato file, non desidero che nessun altro thread lo elabori. Quali sono alcune tecniche per garantire che solo un thread elabori un determinato file? Ricorda che i thread sono in esecuzione su server diversi.

    
posta JoelFan 23.09.2016 - 07:20
fonte

2 risposte

1

Potrei pensare a due opzioni, adesso:

  1. Come già menzionato nei commenti, crea lock -files che indica che questo file è già in elaborazione . Se non si desidera sincronizzarlo sul file system, una tabella nel database potrebbe essere un'opzione. L'unico lato negativo qui:

    • Se un thread si arresta in modo anomalo prima che possa eliminare il file lock , creato, il file correlato viene contrassegnato per sempre come in processo . Forse, è un problema, a seconda delle tue esigenze.
  2. Seleziona i file in un modo, in modo che i thread non tenteranno mai di accedere agli stessi file. E.g. potresti dire, c'è un thread responsabile del file che inizia con [a-m] e un altro thread è responsabile per i file che iniziano con [n-z] . Un terzo sta gestendo tutti i file da [0-9] .
    Aspetti negativi qui:

    • Il carico potrebbe essere distribuito in modo inefficiente, poiché uno dei thread è occupato tutto il tempo e gli altri due sono inattivi, poiché non ci sono file da gestire. Quindi questa è solo un'opzione se puoi stimare la diversificazione dei file.
    • Inoltre, se uno dei thread è inattivo, i suoi file non vengono elaborati, poiché gli altri non ne sono responsabili.

[EDIT]

Crea un'istanza di monitoraggio. (ad esempio, un servizio web) Questa istanza ha semplicemente due metodi

  • GetNext(requestId : int) : string
  • %codice%.

Il primo metodo fornisce un percorso al file, che dovrebbe essere elaborato dal richiedente. Ogni percorso viene restituito una sola volta, finché non è scaduto. L'ID del richiedente viene memorizzato con il percorso e il timestamp forniti da qualche parte. Questo è necessario, se un processo di elaborazione dei file è scaduto o se l'istanza di monitoraggio è inattiva per un motivo. Il secondo metodo è l'istruzione finale del richiedente, in modo che l'istanza di monitoraggio sappia che il file è stato elaborato.

Qui sotto, sicuramente i problemi di configurazione e accessibilità che potresti incontrare. Se l'istanza di monitoraggio centrale è inattiva, i thread dei consumatori devono attendere che sia nuovamente disponibile, poiché è necessario terminare un file prima di procedere con il successivo.

    
risposta data 23.09.2016 - 10:35
fonte
0

Alcuni filesystem garantiscono che alcune operazioni siano atomiche. Tra i più comuni ci sono quelli che cambiano nome / mossa o non accadono per un chiamante.

Se il tuo filesystem ha una rinomina atomica, puoi tentare di rinominare un file con un nome specifico per il lavoratore ed elaborarlo se la rinomina ha avuto successo. Se fallisce, qualcosa è andato storto o un altro operatore ti ha picchiato.

Quando hai finito con il tuo lavoro, puoi rinominarlo per ulteriori attività da consumare.

Si noti che le copie di solito non sono atomiche, né crea + scrittura in file "lock" ad-hoc. Lo spostamento tra le directory dipende molto dal filesystem in uso.

Utilizziamo la tecnica del processo rename + per l'importazione / esportazione su larga scala di file sullo storage su nastro con più worker. È molto resistente agli arresti anomali ed è essenzialmente immune alla corruzione.

    
risposta data 23.09.2016 - 13:00
fonte

Leggi altre domande sui tag