Sto scrivendo un'applicazione web con Python e Flask. Ad un livello elevato, il servizio Web accetta un ID, scarica un file da un'API di terze parti sulla base di tale ID, legge e analizza i dati all'interno del file e infine restituisce tale analisi al client.
Poiché questo processo richiede un bel po 'di tempo, mi piacerebbe avere notifiche al client quando (1) il file viene scaricato, (2) il file viene analizzato, e (3) il valore analizzato ha stato restituito Poiché HTTP è basato su un'unica architettura del ciclo richiesta-risposta, ho deciso di suddividere ogni passaggio in un endpoint API. Il lato client JavaScript gestirà il concatenamento delle richieste AJAX e l'aggiornamento del client dello stato di avanzamento.
Ecco il flusso di lavoro di richiesta-risposta che ho in mente:
- 1 bis. Il front-end effettua una richiesta con un ID a un endpoint "download" e notifica al client che il file è in fase di download.
- 1 ter. Il server scarica il file e risponde al front-end con il nome file scaricato. Quando ha successo ...
- 2 bis. Il front-end effettua una richiesta con il nome file dal passaggio 1 e alcuni valori di configurazione aggiuntivi, impostati quando l'utente fa inizialmente clic su "invia" - a un endpoint "Analizza" e quindi notifica al client che il file è in fase di analisi. / li>
- 2b. Il server analizza il file in base alla configurazione del client e genera un file di output con l'analisi. Il server risponde quindi con il nome file di output.
- 3 bis. Il front-end inoltra quindi una richiesta all'endpoint "output" con il nome file di output del passaggio 2 e notifica al client che il file di output viene scaricato localmente.
- 3b. Il server restituisce semplicemente il file statico su richiesta. Il server elimina quindi il file di output.
In generale, la mia domanda è: questa architettura funziona? Più in particolare:
- C'è un modo migliore per mostrare progressi al cliente? Questo sembra un sovraccarico per quella funzionalità - d'altra parte, è bello avere endpoint API più puliti.
- Cosa succede quando il client A e il client B richiedono gli stessi dati back-to-back? La procedura lato server del client B potrebbe rispondere che il file di output è pronto subito prima che il processo del client A cancelli il file. C'è un modo per evitare questo scenario?
Mi rendo conto che è un po 'complicato, ma sono abbastanza nuovo per lo sviluppo back-end e sono molto aperto a qualsiasi suggerimento.
Grazie in anticipo.