Come scalare un processo basato su file

1

Sto cercando un metodo per risolvere il seguente problema:

Supponiamo che ci sia una directory di spool con molti file che devono essere elaborati. Esiste un processo A che scrive costantemente nuovi file in questa cartella e un processo B che elabora quei file. Quindi un classico modello produttore / consumatore.

Sfortunatamente, nelle ore di punta, il processo A scrive nuovi file più velocemente di quanto Process B sia in grado di elaborarli. Quindi vorrei iniziare più istanze del processo B per accelerarlo. Tuttavia, queste istanze del processo B funzionerebbero tutte sulla stessa directory di spool e potrebbero intromettersi.

Ecco uno pseudo codice del processo B:

while (running)
    take the first BATCH_SIZE files from spool
    process files
    sleep
end

C'è un modo per avviare più istanze del processo B senza intralciarlo? Ho già pensato di partizionare la quantità di file, ma dovrei conoscere il numero di istanze dall'inizio. Diciamo che ho già 1 istanza in esecuzione e vedo che non è abbastanza ... Quindi voglio solo avviare temporaneamente un'altra istanza senza terminare il primo o in qualche modo in anticipo.

Spero di essermi espresso comprensibile e sono molto grato per tutte le idee / i commenti utili!

    
posta Steve 20.03.2018 - 15:58
fonte

1 risposta

1

Come suggerito sopra, l'uso di uno strumento come RabbitMQ che già fa questo genere di cose può avere senso. Ma potrebbe anche essere eccessivo (la curva di apprendimento dell'uso dello strumento potrebbe superare il valore che porta al problema).

Un modo semplice e diretto per fare ciò che vuoi è fare il blocco dell'advisory o rinominare il file su cui stai lavorando. Se due processi tentano di rinominare (o bloccare) un file nello stesso momento, uno lo farà e l'altro perderà. Quello che vince continua e procede. Quello che perde sceglie solo un altro file.

Per ridurre la probabilità di collisioni, puoi aggiungere un po 'di casualità alla selezione del prossimo file da elaborare e dovresti ottenere pochissime collisioni.

    
risposta data 18.07.2018 - 00:46
fonte

Leggi altre domande sui tag