Come evitare la comunicazione sincrona tra microservizi

-1

Diciamo che stiamo parlando di un webshop.

  1. Microservice 1: gestisce i prodotti e i relativi prezzi
  2. Microservice 2: responsabile del pagamento e del pagamento.

Se un utente desidera pagare un prodotto, viene richiamato il servizio di pagamento. Il servizio deve restituire il successo o il fallimento in modo sincrono. Anche il servizio deve garantire di utilizzare i prezzi correnti.

Quindi il flusso di lavoro corrente passa i productIds al servizio di pagamento. I servizi di pagamento interrogano il prezzo corrente (dal servizio 1 SYNCHRON). Il servizio di pagamento esegue la procedura di pagamento.

Flusso di lavoro:

Caller (App) -> Payment service -> Product service -> Payment service -> Caller (App) 

In che modo uno scenario di questo tipo può essere ottimizzato per la comunicazione asincrona? O la comunicazione sincrona attraverso i servizi di riposo è la migliore?

    
posta Florian 30.03.2018 - 15:18
fonte

1 risposta

4

Non c'è modo migliore nella programmazione. Tutto dipende dalla situazione. Pensavo che la tua spiegazione non fosse molto chiara. Suppongo che tu voglia dire che il tuo flusso di lavoro - > Servizio 2 - > Servizio 1. Ora si desidera richiamare il servizio 1 Async.

Soluzione: Se questo è corretto, non penso che si possa usare Async perché è necessario attendere che il Servizio 1 restituisca il Prezzo corrente per procedere. Oppure puoi modificare il tuo processo:

Puoi richiamare il tuo Servizio 1 dal Flusso di lavoro (passare l'Id prodotto e ottenere il prezzo corrente). Una volta che hai tutte le informazioni, richiama il servizio 2 e passa tutti i dati nel parametro. In questo modo non devi preoccuparti della sincronizzazione e dell'async.

    private void YourProcessFlow() //inside your workflow
    {
        var currentPrice = InvokeService1(12345);
        InvokeService2(12345, currentPrice);
    }

Alternativa: Ecco il codice per Async, nel caso in cui, se vuoi usarlo da qualche altra parte:

    using System.Threading.Tasks;

    new Task(() => { InvokeService1(12345);}).Start();

    private int InvokeService1(int productId)
    {
        // Invoke your Service 2 here
        return price;
    }

Qui la linea 1 invocherà il tuo metodo e passerà alla riga successiva del codice. Ciò non attenderà che il metodo restituisca il valore. Come ho detto, hai bisogno di currentPrice per procedere e questo non può essere eseguito Async.

Idea: Non conosco la tua situazione completa, ma se ci sono altre cose che il tuo servizio / flusso di lavoro sta facendo e non dipendono dai risultati degli altri, puoi utilizzare il concetto Programmazione parallela . Puoi google per ulteriori informazioni

    
risposta data 30.03.2018 - 16:18
fonte