Implementiamo un'API REST, che avvierà più attività di back-end a esecuzione prolungata. Ho letto il ricettario dei servizi Web RESTful e il consiglio è di restituire l'HTTP 202/Accettato con un'intestazione Content-Location che punta all'attività che si sta elaborando. (ad esempio http://www.example.org/orders/tasks/1234) e chiedere al client di eseguire il polling di questo URI per un aggiornamento dell'attività a esecuzione prolungata.API REST a lunga esecuzione con code
L'idea è di fare in modo che l'API REST invii immediatamente un messaggio a una coda, con un ruolo di background che raccolga il messaggio dalla coda e esegua più attività di back-end, utilizzando anche le code. Il problema che vedo con questo approccio è come assegnare un ID univoco all'attività e successivamente consentire al client di richiedere uno stato dell'attività emettendo un GET all'URI Content-Location.
Se l'API REST viene inserita immediatamente in una coda, può generare un GUID e collegarlo come un attributo al messaggio che viene aggiunto alla coda, ma il recupero dello stato della richiesta diventa difficile.
Un'altra opzione sarebbe quella di avere l'API REST immediatamente aggiungere una voce al database (diciamo un ordine, con un nuovo ID ordine), con uno stato iniziale e successivamente inserire un messaggio in coda per dare il via al attività di back ground, che aggiornerebbero successivamente quel record del database. L'API restituirebbe questo nuovo ID ordine nell'URI dell'intestazione Content-Location, affinché il client possa utilizzare quando controlla lo stato dell'attività.
In qualche modo aggiungendo prima la voce del database, quindi aggiungendo il messaggio alla coda sembra indietro, ma solo aggiungendo la richiesta alla coda rende difficile tenere traccia dei progressi.
Quale sarebbe l'approccio consigliato?
Grazie mille per i vostri approfondimenti.
Grazie mille per i tuoi approfondimenti. Sono tutto per soluzioni pragmatiche, quindi mi sembra sufficiente l'approccio al database singolo. Il modello di attività può essere esteso per includere anche attività secondarie, nel caso in cui l'API supporti la richiesta aggregata. Grazie! – user2079172
Grazie per l'aggiornamento e il suggerimento! :) Questa configurazione sarebbe sicuramente una soluzione praticabile. I nostri integratori potrebbero non essere in grado di mantenere una connessione aperta (sistemi legacy), ma molto probabilmente saranno in grado di fare un sondaggio. Il collegamento di un'API REST e l'approccio 202/Accettato con un bus/coda di servizio è il punto in cui la disconnessione è per me. Idealmente il bus di servizio/coda sarebbe il punto di integrazione per altri sistemi e l'API in questo caso, è solo un altro modo di integrare un altro sistema con il bus di servizio (Channel Adapter). Affinché la tua installazione di suggerimento funzioni, abbiamo bisogno di un altro livello di astrazione che tratti l'aggiornamento update_event – user2079172
così come lo vedo io. Quindi l'API dovrebbe: 1. inserire una nuova riga nella tabella update_event e restituire il nuovo id. 2: inserire immediatamente una nuova richiesta nella coda del bus di servizio. Il cliente può ora eseguire il polling ecc. Ruolo del lavoratore 1: preleva il messaggio di coda e invia il flusso di lavoro di backend. 2: una volta fatto, dovrà aggiornare la tabella update_event con il nuovo URI di risorsa, ecc. Il problema qui è che il ruolo di lavoratore diventerà consapevole di un client con requisiti speciali o? Significa, non è più generico per il sistema di messaggistica? – user2079172