Quale architettura dovrei scegliere per Microservices che sono sia asincroni che sincronizzati?

4

Ho un microservizio (Microservice A) che si connette a un MQ del client e riceve messaggi e persiste nel database (tipo sincrono MessageA dopo il messaggio B per lo stesso ordine). Internamente ho n microservizi che gestiscono ciascuno un particolare tipo di messaggio basato su alcuni parametri del messaggio. Tutti i microservizi sono indipendenti l'uno dall'altro e possono eseguire l'elaborazione utilizzando i dati del messaggio (che è persistente nell'operazione Database-Rest RestMI).

Tuttavia MessageB from the MQ deve essere elaborato solo quando MessageA ha terminato la sua elaborazione completa. (Synchronous). Ma ogni messaggio può chiamare N microservizi per eseguire i suoi compiti che possono essere asincroni * (Async) in natura.

Come posso determinare la sincronizzazione tra l'elaborazione del messaggio del genitore w.r.t il figlio (attività Async). i.e messaggio A - > 4 attività (microservizio Async) - > chiama 4 microservizi completa il lavoro e elabora le attività del messaggio B -4?

    
posta Akhil 22.11.2017 - 13:00
fonte

2 risposte

4

Al termine di ciascuna attività secondaria A, verificare lo stato di A. Se tutte le attività secondarie sono complete, inviare un messaggio StartB. Se non si aggiorna stato e si fa il prossimo A.

Se i messaggi B vengono generati per primi, devi metterli in attesa mentre aspetti tutti i Come da completare.

È possibile impostare alcuni instradamenti complessi per archiviarli in code, ma potrebbe essere più semplice semplicemente inserirli in un DB e attendere il messaggio StartB.

Modifica ...

Forse dovrei aggiungere che, se possibile, si vuole evitare questa situazione, in quanto senza un processo in corso per tenere traccia di ciò che le attività A sub hanno completato, errato o scaduto; hai un problema di gestione degli errori piuttosto complesso da risolvere.

Potresti aggiungere un processo che esegue lavori incompleti per verificare cosa sta succedendo, ma questo è esattamente il tipo di polling del database che stai cercando di evitare con le code dei messaggi, in primo luogo.

Un'alternativa è mantenere un processo in esecuzione, che async chiama le sotto attività e attende un messaggio di completamento da ciascuna. Se le tue attività sono veloci, questo può funzionare bene, ma rende questa attività principale sincrona.

Un altro è di riportare l'attività B sulla coda FIFO se la condizione di partenza non è soddisfatta. Questo ti dà la possibilità di fare errori sui vecchi lavori, ma ancora una volta significa che potresti avere dei servizi che eseguono il looping dei processi senza fare altro che masterizzare il tempo della cpu.

    
risposta data 22.11.2017 - 13:15
fonte
0

Che dire di qualcosa come un servizio di gestione del flusso di lavoro ?? Abbiamo un analogo problema e disponiamo di un servizio di gestione del flusso di lavoro centrale che tiene traccia di tutto il flusso di lavoro in esecuzione e emette nuovi ordini solo quando le attività precedenti sono terminate. Ciò rende davvero facile tenere traccia di ciò che sta accadendo. Si potrebbe verificare un problema se si desidera evitare un'istanza di gestione centrale, ma questo è principalmente giustificato.

Una nota alle saghe: mi piace molto l'idea. Ma tutte le implementazioni di saga che ho visto sono limitate a una sola lingua (ad esempio tutti i servizi devono essere scritti in c #, come un masstransit.) - che sfata l'idea dei microservizi poliglotta.

    
risposta data 23.11.2017 - 11:40
fonte

Leggi altre domande sui tag