Con il sourcing di eventi, come ottenere la risposta di una chiamata che è un effetto collaterale?

3

Supponiamo che il mio utente richieda al mio sistema ES / CQRS di aprire un ticket di supporto:

  • Il controllore invia un comando ask-support , questo comando controlla se l'utente ha abbastanza credito per farlo, quindi emette un evento ask-support .

  • Da qualche parte, un ascoltatore responsabile degli effetti collaterali ottiene questo evento. Chiama un'API di supporto esterna per aprire un ticket e recupera un token da questa chiamata.

  • Invia un comando open-ticket contenente questo token e questo genera un evento ticket aperto .

  • Ora il mio controller dovrebbe restituire il prezioso token al client, ma come?

Con questa logica di pubblicazione / sottoscrizione, il mio ascoltatore non conosce il controller e non può dirgli "hey, il tuo ticket è stato creato, ecco il tuo token".

Potrei avere una proiezione di lettura che si traduce in un elenco di token ticket di supporto e il controller potrebbe chiamarlo fino a quando non viene visualizzato il token (ma ciò non è eccezionale). O in qualche modo abbonarsi temporaneamente ai cambiamenti di proiezione (ma è complesso).

Quale strategia consiglieresti per questo caso? Il mio progetto originale è difettoso?

Grazie

    
posta Thomas Lulé 16.02.2018 - 10:27
fonte

3 risposte

3

Non sono sicuro di come potresti impedire che l'asincronia si propaghi fino al client.

Il controller potrebbe restituire immediatamente un 201 Created , insieme all'URI del ticket di supporto che ha inizialmente uno stato di Asked . Il client esegue il polling della risorsa (automaticamente o da iniziativa dell'utente) per controllarne lo stato finché non diventa Opened e ha un token.

    
risposta data 16.02.2018 - 11:05
fonte
1

È possibile assegnare il proprio token alla richiesta fornita dal controller e restituirlo. Quando il client chiede "Qual è lo stato della richiesta X?" ti consegnerà il tuo tuo token.

Questo approccio ha diverse proprietà utili. Innanzitutto, puoi restituire il token immediatamente che è ciò che desideri. In secondo luogo, non sei legato all'API esterna - quando, ad esempio, passerai a un altro sistema e vorresti migrare i problemi i tuoi token non dovranno essere modificati.

L'ovvio lato negativo è che dovrai mappare il token esterno a quello interno, ma non è un IMO di tipo show-stopper.

    
risposta data 16.02.2018 - 11:08
fonte
0

A patto che il tuo framework supporti richieste asincrone, se sai che opened-ticket sarà attivato a un certo punto puoi sottoscriverlo dall'interno dell'azione del controller (utilizzando qualsiasi infrastruttura disponibile per accedere a quell'evento). Una volta ricevuta una risposta, è sufficiente restituire le informazioni rilevanti al cliente.

    
risposta data 16.02.2018 - 10:45
fonte

Leggi altre domande sui tag