Come gestisci una richiesta POST di un'applicazione web con il sourcing di eventi?

2

Vorrei chiedere aiuto per capire come vengono utilizzati i sistemi di event-sourcing quando si tratta di applicazioni Web e richieste POST. Capisco come sono archiviati gli eventi e l'architettura event-driven di coerenza finale. Comprendo CQRS ecc., Ma non riesco a immaginare come un meccanismo dell'archivio eventi gestisca qualcosa come una richiesta POST HTML quando l'applicazione web nel browser deve restituire lo stato modificato nella pagina seguente a cui siamo reindirizzati, ovvero:

  1. Compilare un modulo HTML su una pagina per aggiornare alcune risorse.

  2. Premendo invia per inviare i dati a un'applicazione web.

  3. Viene creato un evento con i dati da aggiornare e l'ID della risorsa.

  4. L'evento viene generato e verrà eventualmente salvato nell'archivio degli eventi.

  5. Il browser mi porta a una pagina diversa nell'applicazione web.

  6. Invio una richiesta di query per recuperare la risorsa aggiornata (attraverso la ripetizione di eventi) perché voglio presentare all'utente lo stato più recente della risorsa.

  7. La query non restituisce lo stato più recente perché la coerenza finale non è ancora avvenuta e il sistema ha ancora bisogno di alcuni millisecondi per aggiornare l'archivio eventi.

  8. Vedo che l'aggiornamento non ha mai avuto luogo. La risorsa sembra sempre la stessa.

  9. L'archivio eventi ha salvato la risorsa e ora posso aggiornare il browser e verificare che l'aggiornamento abbia effettivamente avuto luogo.

Cosa mi manca, per favore? Sembra che ci sia qualcosa di veramente semplice qui, ma non riesco a vedere come un'applicazione web possa funzionare con l'event sourcing. Ci stiamo affidando al fatto che l'event-sourcing sia più veloce dell'applicazione web e supponiamo che i dati saranno sempre coerenti prima che l'utente prenda la pagina successiva? Non sarebbe un po 'rischioso durante l'uso intensivo del sistema?

Grazie

    
posta Rafal Bielec 25.01.2017 - 23:53
fonte

2 risposte

1

The event is raised and will be saved in the event store eventually.

Questo è sbagliato: l'evento dovrebbe essere scritto immediatamente nell'archivio degli eventi. Il caso limite di cui bisogna fare attenzione qui è che due scritture in conflitto vengono eseguite contemporaneamente: se una di queste scritture non riesce, il chiamante deve essere avvisato che il comando non è riuscito, rendendoli consapevoli del problema e consentendo loro di prendere in considerazione strategia appropriata.

Hai ragione a sapere che i modelli letti sono aggiornati alla fine, piuttosto che immediatamente, il che introduce alcune sfide.

What I am missing, please? It seems that there's something really simple here, but I cannot see how a web application can work with event sourcing. Are we relying on the event-sourcing being faster than the web application and assuming that the data will always be consistent before the user hits the next page? Wouldn't that be a bit risky during heavy system use?

Ci sono un paio di approcci da prendere. Uno è, come hai descritto POST-REDIRECT-GET. Ma diventiamo un po 'più intelligenti riguardo alla risorsa che è l'obiettivo del reindirizzamento. Anziché reindirizzare a un endpoint "ultimo" arbitrario, reindirizziamo invece a un endpoint in grado di identificare la posizione in cui dovremmo trovarci nel flusso di eventi

/foo?asOf={sequenceNumber}

Quindi quell'endpoint può bloccarsi, in attesa che l'evento si presenti, oppure può creare in modo proattivo una nuova rappresentazione della risorsa recuperando la cronologia dall'archivio degli eventi, o .... Ci sono molte variazioni , ma tutti iniziano dal pensare di essere specifici su dove nella storia si vuole creare la rappresentazione.

(A seconda delle esigenze, l'implementazione potrebbe restituire una rappresentazione, o potrebbe reindirizzare a una rappresentazione una volta che i risultati sono disponibili. Si potrebbe voler restituire una rappresentazione in quel punto esatto della cronologia, o in qualsiasi punto conveniente dopo .)

Un'altra alternativa è costruire una rappresentazione nel gestore POST. L'applicazione ha appena aggiornato correttamente il flusso di eventi, quindi ha tutti gli eventi nella cronologia fino a quel momento. È possibile passare tale cronologia a un bit di codice che sa come generare la vista (eventualmente leggendo in altre cronologie dal modello di scrittura o copie memorizzate nella cache dal modello letto).

Un altro approccio, utile in alcune circostanze, è quello di restituire gli eventi stessi e consentire al chiamante di ricostruire la vista che si aspettano. Questo approccio potrebbe avere senso se stessi scrivendo un'app per una sola pagina, lasci che l'app aggiorni la propria copia non autorevole del modello e lavori da lì.

    
risposta data 26.01.2017 - 17:19
fonte
1

Tutto si riduce davvero alla natura dei dati che stai presentando al tuo utente. Se è di natura transazionale e la coerenza è di fondamentale importanza, allora hai ragione: un modello alla fine coerente probabilmente non funzionerà. Tuttavia, se è accettabile che la natura dei dati sia latente, la coerenza finale funzionerà correttamente.

Ad esempio, pensa a un sistema bancario. Lo stato più recente dell'account di un utente e la cronologia delle transazioni è ovviamente molto importante. Pertanto, la coerenza finale è probabilmente qualcosa che non funzionerà. Tuttavia, i messaggi che risultano da transazioni consistenti possono essere qualcosa che è accettabile avere (una quantità accettabile di) latenza. Qualcosa del genere, forse un utente vuole essere avvisato ogni volta che è stata effettuata una transazione di oltre $ 100. Questo è qualcosa che potrebbe / essere ottenuto attraverso un'eventuale coerenza.

Quindi in risposta alla tua domanda, sì, i sistemi alla fine coerenti possono / funzionano perfettamente per un'applicazione web. Tutto dipende dai dati con cui hai a che fare.

    
risposta data 26.01.2017 - 01:03
fonte

Leggi altre domande sui tag