Utilizzo di file flat vs database / API come trasporto tra frontend e backend

20

Ho un'applicazione che ha generato una discussione piuttosto accesa tra un paio di sviluppatori.

Fondamentalmente, è diviso in un livello web e un livello backend. Il livello Web raccoglie le informazioni tramite un semplice modulo Web, archivia questi dati come un documento JSON (letteralmente un file .json) in una cartella di controllo utilizzata dal back-end. Il back-end interroga questa cartella ogni pochi secondi, preleva il file e svolge le sue funzioni.

I file stessi sono molto semplici (vale a dire tutti i dati di stringa, nessun nidificazione) e circa 1-2k al loro massimo, con il sistema che impiega la maggior parte del tempo inattivo (ma scoppiando fino a 100 messaggi in qualsiasi momento). Il processo di elaborazione del back-end richiede circa 10 minuti per messaggio.

L'argomento arriva quando uno sviluppatore suggerisce che l'uso del filesystem come livello di messaggistica è una cattiva soluzione, quando qualcosa come un database relazionale (MySQL), un database noSQL (Redis) o anche una semplice chiamata API REST dovrebbe essere usato invece.

Va notato che Redis è utilizzato altrove nell'organizzazione per la gestione dei messaggi in coda.

Gli argomenti che ho sentito analizzano come segue

A favore di file flat:

  • I file flat sono più affidabili di qualsiasi altra soluzione, poiché il file viene spostato solo da una cartella "watch", in una cartella "processing" dopo che è stato raccolto e, infine, in una cartella "done" una volta terminato . Non vi è alcun rischio che i messaggi scompaiano escludendo bug di livello molto basso che comunque potrebbero infrangere altre cose.

  • I file flat richiedono una sofficità tecnica meno comprensibile - solo cat . Nessuna query da scrivere, nessun rischio di far scappare accidentalmente un messaggio dalla coda e averlo perso per sempre.

  • Il codice di gestione dei file è più semplice delle API di 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 introdotto.

  • Il principio di YAGNI afferma che i file piatti funzionano bene in questo momento, non è necessario dimostrare di passare a una soluzione più complicata, quindi lasciala.

In favore di un database:

  • È più semplice scalare un database rispetto a una directory piena di file

  • I file piatti rischiano che qualcuno copi un file "completato" nella directory "guarda". A causa della natura di questa applicazione (gestione della macchina virtuale), ciò potrebbe causare una perdita di dati catastrofica.

  • Richiedere una maggiore sofisticazione tecnica per l'app T / S significa che lo staff non istruito ha meno probabilità di rovinare qualcosa semplicemente spaccando le cose.

  • Il codice di connessione DB, specialmente per qualcosa come Redis, è almeno altrettanto robusto delle funzioni di gestione file della libreria standard.

  • Il codice di connessione DB è visibilmente (se non funzionalmente) più semplice dal punto di vista dello sviluppatore, poiché è più alto della manipolazione dei file.

Da quello che vedo, entrambi gli sviluppatori hanno molti punti validi.

Quindi, tra queste due persone, lo sviluppatore pro-file o lo sviluppatore pro-database, quale è più in linea con le migliori pratiche di ingegneria del software e perché?

    
posta Mikey T.K. 18.03.2016 - 16:56
fonte

4 risposte

16

Passare a una soluzione che coinvolge database o sistemi di accodamento citati da Ewan

  • crea dipendenza da un nuovo sistema complesso sia nel backend che nel frontend
  • introduce complessità non necessaria e uno shload di nuovi punti di errore
  • aumentare i costi (incluso il costo di proprietà)

Lo spostamento / ridenominazione dei file all'interno di un singolo volume è garantito per essere atomico su tutti i sistemi operativi correnti, qualunque siano le loro difficoltà in relazione a cose come il blocco di file / record. La gestione dei diritti a livello di sistema operativo dovrebbe essere sufficiente per bloccare il non lavato e per prevenire manipolazioni errate e sconsiderate da parte di operatori autorizzati (amministratori / sviluppatori). Quindi i database non hanno nulla da offrire, a patto che le prestazioni della soluzione corrente siano all'altezza.

Nella nostra azienda abbiamo utilizzato interfacce basate su file simili per decenni con grande successo. Molte altre cose sono andate e venute, ma queste interfacce sono rimaste a causa della loro assoluta semplicità, affidabilità e accoppiamento / dipendenze minimi.

    
risposta data 19.03.2016 - 07:56
fonte
10

Non penso che entrambe le soluzioni siano fondamentalmente una cattiva pratica, quindi rispondere alle domande che sono le migliori pratiche può essere difficile.

Non credo che il principio YAGNI si applichi qui se hai a che fare con la scala. "Lavorare" è relativo, se si ha un strong potenziale di perdita di dati catastrofici e scarsa capacità di ridimensionamento, non lo considererei davvero funzionante. Non sono esattamente sicuro della scala con cui si ha a che fare, ma se si dispone di una grande quantità di queste voci, diventa sempre più difficile con ognuna passare a un nuovo sistema. Quindi, se questo è il caso, direi che un database è la migliore pratica.

MongoDB o redis (non ho esperienza con i redis, leggi solo cose buone) dovrebbero andare bene dato che i tuoi dati dovrebbero già adattarsi bene (i documenti json sono spesso banalmente modificati in documenti BSON per MongoDB). Ha anche il vantaggio di conservare molti dati in memoria anziché potenziali frequenti letture / scritture sul disco in ogni momento. Inoltre, assicura che le letture / scritture contemporanee non portino a danneggiamenti o blocchi.

Se l'entità YAGNI si applica qui e i file non sono un collo di bottiglia, scalano all'interno dell'ambito e non presentano problemi catastrofici, direi che attenersi ai file è "best practice". Non c'è motivo di cambiare nulla se non ci sono problemi, magari scrivere alcuni test, metterlo in risalto e vedere dove sono i limiti e i colli di bottiglia.

Non sono sicuro che un database sia comunque la soluzione in questo contesto. Se stai comunicando con cose sullo stesso server, potrebbe essere fatto un qualche tipo di IPC, no?

    
risposta data 18.03.2016 - 19:18
fonte
5

Mentre il bello e salvare un file e copiarlo in una dir dirata è un punto fermo di molti livelli di comunicazione esp. con vecchi sistemi di telaio principale e simili. I ragazzi "anti" hanno un punto; in quanto ha molti problemi e casi limite. Che sono difficili da gestire se hai bisogno di essere reliablitiy al 100% e si verificano più spesso mentre aumenti la frequenza e il volume dei file.

Se controlli entrambi i lati della transazione ti suggerirei di guardare alcuni dei tanti sistemi di accodamento disponibili. ZeroMQ, RabbitMQ, MSMQ ecc piuttosto che un database. Ma come intendi, se non si rompe ...

    
risposta data 18.03.2016 - 19:13
fonte
-3

La soluzione di database è quella giusta. Risolve un sacco di dipendenza da un particolare host o condizioni al contorno.

Entrambe sono soluzioni simili, tranne per il fatto che il database non è ospitato in un particolare host. Questo risolve i problemi di firewall / accesso con il sistema unix. Abbiamo avuto casi di eliminazione "accidentale" su filesystem e nessuno da incolpare.

Con il database, puoi anche avere lo stesso problema ma puoi inserire il controllo o inserire solo la logica per eliminare le eliminazioni.

Anche nel file system se è necessario inserire l'applicazione nel nome del file, ad esempio OASIS, sarà necessario creare i file OASIS.john_doe.system1.20160202. Questo diventa noioso e può essere rappresentato più facilmente nel database. Puoi anche avere campi null nel database e nella logica in base a ciò

È anche facile aggiornare i database piuttosto un'intera directory di file in caso di patch o correzioni che potresti voler fare sulle tabelle. Ovviamente puoi farlo su file system ma l'aggiornamento del database è più intuitivo.

Ad esempio, si desidera eseguire nuovamente, ma con un sistema diverso da OASIS, dire DESERTO e john_doe per doe_smith e data da 20160101 a 20151231

Facile generare righe per DESERT / doe_smith / 20151231 dal set originale invece di creare quei file con lo script di shell.

Quindi dalla leggibilità, la soluzione per il database del punto di vista dell'estensione è migliore.

    
risposta data 19.03.2016 - 07:02
fonte