Ho un'applicazione che ha generato una discussione piuttosto accesa tra un paio di sviluppatori.
Fondamentalmente, è diviso in un livello Web e un livello back-end. Il livello Web raccoglie informazioni tramite un semplice modulo Web, inserisce questi dati come un documento JSON (letteralmente un file .json) in una cartella di controllo utilizzata dal back-end. Il back-end esegue il polling di questa cartella ogni pochi secondi, preleva il file ed esegue le sue funzioni.
I file stessi sono molto semplici (ovvero tutti i dati delle stringhe, nessun annidamento) e circa 1-2k al massimo, con il sistema che trascorre la maggior parte del suo tempo inattivo (ma fa scoppiare fino a 100 messaggi in un dato momento). La fase di elaborazione del back-end richiede circa 10 minuti per messaggio.
L'argomento emerge quando uno sviluppatore suggerisce che l'uso del filesystem come livello di messaggistica è una cattiva soluzione, quando invece dovrebbe essere usato qualcosa come un database relazionale (MySQL), un database noSQL (Redis) o persino una semplice chiamata API REST.
Va notato che Redis viene utilizzato altrove nell'organizzazione per la gestione dei messaggi in coda.
Gli argomenti che ho ascoltato si dividono come segue
A favore di file flat:
I file flat sono più affidabili di qualsiasi altra soluzione, poiché il file viene spostato da una cartella "watch" a una cartella "processing" dopo che è stata prelevata, e infine a una cartella "done" al termine. Non vi è alcun rischio che i messaggi scompaiano, escludendo bug di livello molto basso che potrebbero comunque interrompere altre cose.
I file flat richiedono meno sofisticazione tecnica per capire - solo
cat
. Nessuna domanda da scrivere, nessun rischio di far cadere accidentalmente un messaggio dalla coda e farlo sparire per sempre.Il codice di gestione dei file è più semplice delle API del database dal punto di vista della programmazione, poiché fa parte della libreria standard di ogni lingua. Ciò riduce la complessità complessiva della base di codice e la quantità di codice di terze parti che deve essere introdotta.
Il principio YAGNI afferma che i file flat funzionano bene ora, non è necessario dimostrare di passare a una soluzione più complicata, quindi lascialo.
A favore di un database:
È più facile ridimensionare un database rispetto a una directory piena di file
I file flat hanno il rischio che qualcuno copi un file "finito" nella directory "watch". A causa della natura di questa applicazione (gestione della macchina virtuale), ciò potrebbe causare una catastrofica perdita di dati.
Richiedere maggiore sofisticazione tecnica a T / S l'app significa che il personale non istruito ha meno probabilità di rovinare qualcosa semplicemente frugando sulle cose.
Il codice di connessione DB, in particolare per qualcosa come Redis, è almeno robusto quanto le funzioni standard di gestione dei file della libreria.
Il codice di connessione DB è visibilmente (se non funzionalmente) più semplice dal punto di vista dello sviluppatore, dal momento che è più alto della manipolazione dei file.
Da quello che posso vedere, entrambi gli sviluppatori hanno molti punti validi.
Quindi, di queste due persone, gli sviluppatori pro-file o gli sviluppatori pro-database, quale è più in linea con le migliori pratiche di ingegneria del software, e perché?