Microservizi: eventi ovunque

4

La mia nuova squadra in cui lavoro sta discutendo di come modifichiamo le nostre attuali vecchie applicazioni monolitiche per percorrere la strada dei microservizi. Siamo ancora nella fase iniziale di discussione e prova di concetti.

La prima dimostrazione del concetto che stiamo provando, ad alto livello, è quella di mimik un cliente aggiungendo qualcosa al loro paniere, e cosa ciò comporterebbe nella nuova architettura.

Attualmente abbiamo il seguente:

Quellochestaaccadendoquièilseguente:

  1. Ilclientefaclicsulpulsante"Aggiungi al carrello" nel browser che invia la richiesta POST al gateway API
  2. Il gateway API funge da pass-through, inviando una richiesta "Aggiungi al carrello" a Rabbit MQ
  3. Basket Saga prende questa richiesta, inizia una nuova saga
  4. Basket Saga aggiunge "Aggiungi elemento al carrello" e "Prenota elemento" richieste a Rabbit MQ
  5. Stock Service preleva la richiesta "Prenota elemento" e la riserva
  6. Stock Service aggiunge un evento "Oggetto riservato" a Rabbit MQ
  7. Il servizio Basket preleva la richiesta "Aggiungi oggetto al carrello" e la aggiunge
  8. Il servizio Basket aggiunge un evento "Articolo aggiunto" a Rabbit MQ
  9. Basket Saga raccoglie gli eventi "Oggetto riservato" e "Oggetto aggiunto"
  10. Basket Saga pubblica un evento "Aggiungi al carrello completo" su Rabbit MQ
  11. Host SignalR raccoglie l'evento "Aggiungi al carrello completo"
  12. SignalR Host consente al browser di sapere che l'azione è stata completata con successo

Questo è un esempio molto semplice, appena usato per testare le acque con questo tipo di architettura.

Questa architettura sembra abbastanza solida? O darà dolore a lungo termine? Ci sono ovviamente altre opzioni, come chiamare i microservizi direttamente dal gateway API, tra gli altri.

Pensieri?

    
posta eyeballpaul 17.11.2017 - 16:02
fonte

2 risposte

7

In teoria è bello avere tutti questi messaggi in giro ma in pratica ognuno richiede un livello di gestione degli errori oltre a una chiamata API sincrona. Non ha senso utilizzarli per le chiamate veloci all'interno dello stesso servizio.

Prima di tutto. se stai davvero facendo un sito di e-commerce dove aggiungere al carrello richiede una chiamata al server. Stop. Non scala. fai tutto il lato client. Controlla i livelli delle scorte quando si arriva a soddisfare l'ordine in magazzino.

È ancora peggio se ogni client ha una connessione websocket aperta. non andare lì.

Se è solo un esempio, puoi perdere alcuni messaggi, basta che il client invii l'add-to-basket, lo elabori in un servizio e rispedisca il messaggio di risposta. Quei messaggi interni potrebbero sembrare interessanti, ma a meno che non ci sia un vero motivo per cui stai solo facendo durare la vita.

    
risposta data 17.11.2017 - 23:59
fonte
2

Non riesco a parlare con gli altri flussi di lavoro, ma quello che hai descritto qui è un insieme di chiamate a procedure remote asincrone, coordinate dal servizio Basket Saga.

Consiglio vivamente di guardarli in questo modo e non, come implicito qui, con messaggi di richiesta e riconoscimento indipendenti.

Il motivo sono errori e timeout. Per mantenere la logica del flusso di lavoro trattabile, per qualcosa di più di un flusso banale, ti consigliamo di racchiudere i percorsi di successo, di errore e di timeout. Sotto le copertine è possibile eseguirli come messaggi che condividono, diciamo, richiedendo identificativi, ma estrapolandoli dalla logica del flusso di lavoro.

Mantenere gli RPC asincroni su una coda che si esegue il polling in un ciclo è un modo comune per implementare il servizio del flusso di lavoro.

Se hai flussi di lavoro che includono il fuoco e dimentichi le notifiche, usa assolutamente i messaggi non elaborati per quelli.

Inoltre, se si combinano i gateway in entrata e in uscita, è possibile eseguire un ciclo simile al servizio Basket Saga che mantiene solo gli RPC asincroni al servizio Basket Saga.

    
risposta data 17.11.2017 - 19:34
fonte

Leggi altre domande sui tag