Sono curioso di trovare soluzioni a questo problema:
Supponiamo che costruiremo un negozio online. Per scalare meglio parti dell'architettura, è suddiviso in sottosistemi indipendenti. Lo scenario tipico coinvolgerebbe un server delle applicazioni (o qualcosa di simile), in cui arrivano le richieste dei clienti.
Il flusso per un accesso sarebbe simile a questo:
La richiesta arriva
- > Autentica utente
- > Ottieni gli ultimi prodotti acquistati dall'utente
- > calcola gli annunci appropriati
- > consegna pagina generata al client.
Questo è meno efficiente, perché le query dei sottosistemi avvengono in modo seriale / sincrono. Sarebbe meglio, per effettuare chiamate in parallelo.
Ad esempio si potrebbe usare un server Node.JS e chiamare i sottosistemi in modo asincrono. Durante la richiamata viene chiamata una "funzione di riduzione", che aggrega tutti i dati e, una volta raccolti tutti i dati, rimanda la pagina generata al client.
Quindi questo sistema sembra più efficiente.
Un altro passaggio include l'ulteriore disaccoppiamento e introduce le code dei messaggi.
Quindi c'è da un lato il server delle applicazioni, che riceve le richieste e serve le risposte; e d'altra parte, i componenti indipendenti che comunicano sulle code dei messaggi.
Il flusso sarebbe il seguente:
Richiesta in entrata
- > Messaggio: "L'accesso alla chiave di sessione 1234567890 è garantito"
Quindi con la chiave di sessione, l'utente e i relativi messaggi sono identificabili. Questo messaggio viene preso dal servizio utente e produce la risposta "Utente con chiave di sessione 1234567890 è John Doe di New York". Questo messaggio è pubblicato su tutti gli altri servizi dell'applicazione. Così possono reagire e pubblicare i loro risultati.
Il mio problema è, come posso indirizzare il risultato sul server delle applicazioni che deve attendere un tempo imprecisato? Come fa a sapere quando raccogliere tutti i risultati per la sua richiesta?
Una soluzione potrebbe essere, utilizzando un database in memoria (ad esempio Redis). Tutti i servizi possono scrivere i loro risultati in Redis, che viene costantemente interrogato dal server delle applicazioni in attesa di un risultato da consegnare. Ma questa è la soluzione?
Ci sono altre soluzioni?