Innanzitutto, avere il meccanismo push / pull ftp separato dall'elaborazione core mi sembra un buon design , poiché consentirà di testare separatamente l'elaborazione del core e di collegare facilmente le parti un modo diverso se necessario. Questo è un buon esempio di separazione delle preoccupazioni .
Every once in a while we will have problems with these processes not finding the file needed
Prima di pensare a una soluzione con la possibilità di causare probabilmente più problemi di quanti ne risolverà, assicurati di sapere quale sia la causa principale del problema . È perché il lavoro A (tirando i dati) mette il file in una cartella sbagliata in cui il lavoro B (spingendo i dati del file) non se lo aspetta? Quindi è necessario un modo migliore per passare il percorso del file dal lavoro A al lavoro B in modo affidabile.
Oppure perché a volte il lavoro B inizia troppo presto, prima che l'output del lavoro A sia arrivato completamente? Bene, allora è necessario un meccanismo migliore per attivare l'inizio del lavoro B. Non è possibile inserire A e B in uno script di comando che assicura che B si avvii solo quando A è completo? Forse è necessario implementare un meccanismo di polling nel lavoro B che si assicura che non inizi l'elaborazione fino a quando l'output del lavoro A non è disponibile. Forse è necessario implementare un ciclo attorno al lavoro A per assicurarsi che proverà a scaricare di nuovo un file quando il primo tentativo non è riuscito. Potrebbe essere una buona idea lasciare che il processo ftp scarichi prima tutti i dati in un file temporaneo, e rinominalo come un passaggio finale quando è completo. La ridenominazione è un'operazione atomica sulla maggior parte dei file system, pertanto rende il file visibile solo ai seguenti processi quando è pronto per un'ulteriore elaborazione. Un'altra possibile tecnica è quella di lavorare con alcuni "lock file", proibendo l'accesso condiviso a un file "X" finché esiste "X.lock".
Quindi, IMHO l'architettura che hai descritto non è fragile di per sé, ma devi fornire una ragionevole quantità di sincronizzazione e tolleranza di errore attorno ai tuoi processi.