Come sostituire le chiamate asincrone parallele tra micro servizi con comunicazione basata su eventi

2

Un servizio A deve accedere ai servizi B, C e D per elaborare una richiesta. Attualmente questo è implementato come chiamate asincrone parallele da A a B, C e D. Una volta che tutti hanno risposto, il servizio A segue alcune logiche di business per creare un risultato finale dai risultati parziali ricevuti da B, C e D. Il risultato finale è quindi scritto in un DB.

Voglio utilizzare un broker di messaggi (ad esempio Kafka) e implementare la comunicazione basata sugli eventi tra i micro servizi. All'arrivo di una richiesta, A dovrebbe pubblicare un evento con carico utile appropriato. B, C e D essendo abbonati, riceveranno l'evento e inizieranno a lavorarci in parallelo. Ciascuno di essi pubblicherà i rispettivi risultati con i codici evento appropriati. La mia domanda è, come combinare i risultati parziali degli eventi pubblicati da B, C e D?

Nell'approccio precedente, A aveva il lusso di accumulare risultati parziali da ciascuna delle chiamate asincrone. Ma nell'approccio basato sugli eventi, A pubblica solo l'evento request_arrived. Quindi l'accumulo locale all'interno del servizio non è un'opzione.

Edit1: Questi micro servizi vengono implementati come AWS Lambdas. A rimane attivo (e ci costa più) mentre B, C, D sono occupati. Il ritardo di andata e ritorno in B, C, D può essere fino a 20 secondi. Nella comunicazione basata su messaggi A non dovrà attendere gli altri servizi. Ciò ridurrà il costo dell'infrastruttura.

    
posta Raiyan 15.11.2018 - 06:54
fonte

3 risposte

2

Con una "E"

B, C e D pubblicano ciascuno il proprio evento di completamento. E si iscrive a questi nuovi eventi, raccogliendo informazioni da ciascuno e memorizzandone lo stato fino a quando non riconosce che ha ricevuto tutti gli eventi, potenzialmente in qualsiasi ordine. Una volta ricevuti tutti, completa la propria elaborazione con tutte le informazioni di cui ha bisogno, eventualmente pubblicando il proprio evento di completamento.

Comemenzionato@kadiii,vediilmodello Saga per gestire ulteriori complessità, in particolare per l'equivalenza delle transazioni .

    
risposta data 15.11.2018 - 17:00
fonte
4

Idealmente, non lo fai. Questo tipo di approccio è irto di scenari di fallimento parziale. Cosa succede se B e C procedono, ma D muore in modo irrecocabile? Cosa succede quando ottieni dati duplicati da uno dei lavoratori?

In generale, si ottiene un nuovo servizio E che ascolta i risultati di BCD, scrivendo i risultati parziali sul proprio db. Potenzialmente potrebbe essere una parte di A - dipende da cosa stai facendo. E potrebbe controllare se ha tutte le informazioni e combinarle durante l'elaborazione di ogni risultato. Ma più probabilmente combinerai i risultati parziali su query dal db o tramite un altro servizio per mantenere l'elaborazione dei risultati rapida e semplice.

    
risposta data 15.11.2018 - 07:09
fonte
1

Sono B, C, D microservizi reali o solo funzioni? Se creano risultati significativi (ad esempio OrderCreated, InvoiceCreated, BillDelivered) nel loro contesto, penso che dovresti salvare gli eventi creati da ognuno di essi separatamente per non bloccare e attendere il più lento. È possibile spostare la logica che li unisce al processore di eventi ed eseguire solo se necessario. Sebbene tu ne abbia bisogno in un certo ordine puoi usare uno schema ben noto per questo - Saga .

    
risposta data 15.11.2018 - 13:28
fonte

Leggi altre domande sui tag