Prima di tutto, è difficile per me spiegare i problemi in modo chiaro, ho cercato di renderlo il più chiaro possibile, ma se hai bisogno di maggiori informazioni, chiedi e cercherò di spiegare come meglio come posso
Sto provando a utilizzare i microservizi, estraendo funzionalità da un monolite nel proprio servizio (multi-tenant). Tuttavia, una delle cose che non riesco a capire come affrontare è questa:
Che cosa succede se un microservizio (attivato da un evento) richiede l'interazione dell'utente?
Ad esempio, al momento abbiamo il seguente flusso (semplificato):
Abbiamo un modulo di donazione in cui qualcuno può fare una donazione. L'utente inserisce le informazioni (importo, metodo di pagamento ecc.). I dati vengono salvati in un database e verrà effettuata una chiamata a una API esterna (fornitore di servizi di pagamento). L'API restituisce un URL in cui l'utente può completare il pagamento effettivo. Reindirizziamo l'utente a tale URL e quando il pagamento è stato completato, l'utente verrà reindirizzato a noi. In tal caso, in caso di successo, attiviamo la donazione, inviamo un'email di conferma e mostriamo un messaggio in caso di esito positivo o negativo.
Problemi
C'è una serie di problemi con cui vorrei liberarmi:
- Accoppiamento stretto: la donazione è a conoscenza del pagamento e il pagamento è a conoscenza della donazione
- Non possiamo cambiare facilmente i fornitori di pagamento perché i diversi provider hanno bisogno di parametri diversi (il provider I.E. supporta diversi metodi di pagamento rispetto al fornitore b)
- Risolvere bug è davvero difficile perché è necessario implementare la correzione a molti clienti diversi.
Quindi quello che penso dovrebbe succedere è dividere questa funzionalità in due servizi separati :
Quando un utente inserisce le proprie informazioni, viene attivato un evento creato da una donazione.
servizio di donazione
Il servizio di donazione crea la donazione (ovviamente nel proprio data store, ecc.) e poi licenzia un evento "pagamento richiesto" con l'importo che deve essere pagato. Si abbona anche a "pagamento riuscito" e "pagamento non riuscito" (e gestisce la logica di conseguenza).
Servizio di pagamento
Il servizio di pagamento si abbona a "payment_requested", chiama l'api esterna, salva i dati necessari per completare il pagamento (URL I.E., ID esterno, ecc.). Quando il pagamento è stato completato (manteniamo fuori dal campo di applicazione la logica effettiva), viene generato l'evento "pagamento riuscito" o "pagamento non riuscito".
Ciò disaccoppia le implementazioni di donazione e pagamento, tuttavia, poiché ciò è asincrono, non ho idea di come reindirizzare l'utente al servizio di pagamento per completare il processo.
Soluzione 1
Una delle soluzioni potrebbe essere che il client è in attesa di un evento tramite polling lungo o websocket, ma probabilmente migliaia di questi potrebbero non essere una grande idea.
Soluzione 2
Un altro potrebbe essere dimenticare l'evento basato e utilizzare le chiamate sincrone a questi servizi, ma ciò significa che le prestazioni del servizio di donazione dipendono dal servizio di pagamento che a sua volta dipende dalle API esterne.
Domanda
Come puoi vedere, trovo difficile trovare una buona soluzione per questo. Forse alcuni di voi possono dare la tua opinione su come questo potrebbe essere implementato.