Quindi ad un livello elevato il mio caso d'uso è il seguente -
I periodically (every 24 hours) get a very large file (size can vary from MBs to 10s of GBs) which I need to process within 24 hours. The processing involves reading a record, apply some Business Logic and updating a database with the record.
La soluzione corrente è una versione a thread singolo che
- inizialmente legge l'intero file in memoria, cioè legge ogni riga e costruisce un POJO. Quindi in sostanza crea una grande lista
- Quindi itera sull'elenco e applica la logica di business su ciascun Pojo e li salva nel database
Funziona su file di piccole dimensioni con meno di 10 milioni di record. Ma poiché i sistemi si stanno ridimensionando, stiamo diventando più carichi, ad esempio file più grandi (con > 100 milioni di record occasionalmente). In questo scenario vediamo i timeout, ovvero non siamo in grado di elaborare l'intero file entro 24 ore
Quindi ho intenzione di aggiungere un po 'di concorrenza qui.
Una soluzione semplice sarebbe -
- Leggi l'intero file in memoria (crea POJO per ogni record, come facciamo attualmente) o leggi ogni record uno per uno e crea POJO
- Creazione di thread per elaborare simultaneamente questi POJO.
Questa soluzione sembra semplice, l'unico lato negativo che vedo è che l'analisi dei file potrebbe richiedere del tempo poiché è a thread singolo (la RAM non è un problema, io uso un'istanza EC2 piuttosto grande).
Un'altra soluzione potrebbe essere -
- In qualche modo spezza il file in più file secondari
- Elabora ogni file in parallelo
Sembra un po 'complicato dal momento che dovrei suddividere il file in più file più piccoli.
Qualsiasi input sui suggerimenti qui sugli approcci sarebbe ben accetto.