Interfaccia utente e processo che implica la comunicazione asincrona tra diversi microservizi

3

Il sistema è composto da diversi micro-servizi e ciascuno di essi è responsabile del proprio contesto, come prenotazioni, pagamenti, prodotti e notifiche.

Immaginiamo di avere un viaggiatore che cerca un alloggio sul sito web. L'alloggio è elencato recuperando le informazioni dai prodotti di micro-servizi. Traveller ha trovato quello che voleva e ha deciso di fare una prenotazione.

Seleziona data, numero di notti, persone ecc. e inoltra una richiesta di prenotazione per il servizio di micro-servizi. La richiesta contiene tutti i dettagli di pagamento e i dettagli della prenotazione. Ecco la parte divertente:

  1. Request crea un record di prenotazione con stato pending e pubblicato evento, reservation_created .
  2. Pool di servizi di pagamento per quell'evento, crea un'autorizzazione sulla carta di credito e pubblica l'evento authorization_successfull con l'ID di prenotazione all'interno del payload dell'evento.
  3. Pool di microservizi di prodotto per authorization_successful evento e verifica se la sistemazione è realmente disponibile per il periodo richiesto. Se tutto è a posto, la sistemazione verrà contrassegnata come occupata per il periodo desiderato e pubblica availability_updated evento.
  4. Il micro-servizio di prenotazione si riunirà per quell'evento e cambierà lo stato della prenotazione in approved , che pubblicherà quindi un nuovo evento, quindi il micro-servizio delle notifiche può accumularlo e inviare le e-mail necessarie.

Ora ho diverse domande:

  1. In teoria sembra bello, ma sto complicando troppo le cose, o questo è un modo per ottenere il disaccoppiamento?

  2. Seguendo questo approccio, non posso informare il viaggiatore "Prenotazione completata" poiché vi è un lungo processo in background. La mia ipotesi è che il messaggio informativo dovrebbe essere più simile a "Prenotazione richiesta, riceverai presto un'email di conferma, o dovrei raggruppare uno degli endpoint di servizio con schermata di caricamento, o persino usare socket Web per inviare notifiche indietro?"

posta Robert 08.09.2016 - 13:23
fonte

2 risposte

2

Primo pensiero: rendere esplicito implicito. Il viaggiatore ti offre un'opportunità per trarne valore; la tua massima priorità assoluta a quel punto è quella di cogliere quell'opportunità - tutto il resto può aspettare. Quindi ti manca un evento ReservationRequested ; scegli quale ortografia è appropriata nella lingua ubiquitaria del tuo dominio.

This looks nice in theory, but am I over-complicating things, or this is a way to go to achieve decoupling?

Mi sembra che tu stia andando giù per la strada giusta. Potresti voler rivedere il tuo design per vedere se l'Inventario (disponibilità) è una questione separata dal Prodotto (marketing, prezzi, ecc.).

By going with this approach, I can't inform traveler "Reservation complete" since there is a long running process involved in the background.

Esatto - tuttavia, dovresti avere abbastanza informazioni nell'evento ReservationRequested per sapere quale processo in background di lunga durata sarà associato a questa prenotazione (esempio: l'id del processo è calcolato da un hash di valori presenti nella richiesta di prenotazione ).

La mia preferenza sarebbe quella di ACK la richiesta reindirizzando il viaggiatore a una visione del processo in volo; se seguono il link prima di fare progressi, utilizza l'evento ReservationRequested per creare una rappresentazione del messaggio "Abbiamo ricevuto la tua richiesta, ci si può aspettare di sentirci da ...", ma è possibile utilizzare lo stesso endpoint per fornire rappresentazioni aggiornate del processo al termine del lavoro.

    
risposta data 08.09.2016 - 17:50
fonte
1

La tua direzione e il design sembrano buoni, un paio di commenti:

Se è possibile ottenere l'interfaccia utente o l'API per eseguire la distribuzione dei messaggi (anziché fare il servizio di richiesta), facendo in modo che ogni componente aziendale lavori e pubblichi un evento, questo introdurrà meno accoppiamenti e migliori opportunità di scalabilità.

Un altro pattern che puoi usare è Saga (macchina a stati) in modo da poter orchestrare meglio il processo di business e sapere quando hai finito ascoltando tutti gli eventi ...

Puoi guardare un esempio di implementazione di Saga qui

Ha senso?

    
risposta data 13.09.2016 - 10:06
fonte