Il nostro software ha due servizi, uno che fornisce un'ape di riposo utilizzata dal client e una per i calcoli. Il calcolo è abbastanza esteso e in alcuni casi può richiedere alcune ore o giorni. Esiste solo un'istanza del servizio rest-api e un'istanza del servizio di calcolo. Il servizio Rest-api comunica direttamente con il servizio di calcolo e c'è sempre solo un calcolo in esecuzione.
Ciò di cui abbiamo bisogno ora è di supportare più istanze di entrambi i servizi per poter eseguire più calcoli contemporaneamente. L'idea era di usare il broker dei messaggi (RabbitMQ o altro) e le code. Il flusso sarebbe
- rest-api pubblica la richiesta di calcolo sulla coda A
- richiesta del broker di messaggi per il calcolo a un'istanza del servizio di calcolo che avvia il calcolo I servizi di calcolo
- pubblicano periodicamente aggiornamenti di stato sulla coda B
- una volta terminato il calcolo, il risultato viene pubblicato nella coda B Il broker di messaggi
- passa i risultati dalla coda B a un'istanza di rest-api che memorizza i risultati
Macisonoduecaratteristichechenonsiadattanoaquestaarchitettura:cancellazionedelcalcoloepossibilitàdiottenererisultatiparzialiduranteilcalcolo.
Perlacancellazioneènecessario-inviarelarichiestadicancellazioneaun'istanzaparticolaredelserviziodicalcoloericeverlaimmediatamenteseilcalcoloègiàincorso-per"rimuovere" la richiesta di calcolo se è ancora in coda
Una possibile soluzione potrebbe essere che il servizio di calcolo crea la propria coda e invia la sua "identità" (stringa casuale) usata come chiave di instradamento con gli aggiornamenti di stato.
- l'utente annulla il calcolo X
- istanza rest-api contrassegna la richiesta di calcolo X nel database come annullata Il servizio di calcolo
- che riceve la richiesta X invierà l'aggiornamento di stato con la sua "identità" L'istanza
- rest-api che ottiene l'aggiornamento dello stato (può essere un'istanza diversa rispetto al passaggio 2) controllerà se la richiesta X è stata annullata e in tal caso prende l'identità dei servizi di calcolo e la utilizza come chiave di instradamento per la consegna del messaggio di annullamento Il servizio di calcolo
- annulla il calcolo
Questa soluzione probabilmente non è adatta per ottenere risultati parziali perché l'utente può chiedere risultati parziali più volte. Qualche idea su come implementarla all'interno dell'architettura suggerita?
L'architettura è adatta per l'attività?