Lo scenario è:
-
Il client
- effettua la richiesta al server A
- Il server A rende potenzialmente multiple richieste al server B. Modifica per chiarire, il server A effettua le richieste contemporaneamente usando Futures.
- Server A blocchi fino al ritorno di tutti i risultati
- Il server A raggruppa le risposte nella singola risposta e ritorna al client
Quindi attualmente l'approccio è il blocco che utilizza java Futures e restituisce i risultati quando entrano. La mia preoccupazione è che è piuttosto impegnativa e sono preoccupato che esauriremo le risorse sul server. Stavo pensando di andare asincrono nel server A usando DeferredResult
ma dal momento che c'è una discussione per ogni richiesta al server B, sembra che non porti molti benefici.
In alternativa, potremmo fare
- Il server A effettua più richieste al server B
- Il server B immediato restituisce un token per ogni richiesta
- Il server A tiene traccia dei token e restituisce
DeferredResult
- Il server B ottiene ogni risultato, lo inserisce in memcache, invia un messaggio JMS al server A. Modifica: ho appena realizzato che potevo inviare il risultato nel messaggio JMS, quindi non c'è bisogno di memcache.
- Il server A può completare il DeferredResult dopo aver raccolto tutte le risposte da JMS.
Questo ha il vantaggio di essere molto più semplice nel codice (nessun complicato lavoro futuro) al costo di essere più complicato dal punto di vista dell'architettura. Introduce anche più livelli (JMS) per il fallimento. Ha anche il vantaggio di essere molto meno dispendioso in termini di risorse.
Questo è un sistema ad alto utilizzo. Le chiamate al sistema B possono richiedere da 1 a diversi secondi.