Aggiorna catena del modello su un modello guidato da eventi

5

Qual è il nome formale per questo specifico scenario problematico in un'architettura guidata dagli eventi e quali sono gli approcci più comuni per gestirlo? Dopo l'invio di un'azione o di un evento, vari abbonati verranno eseguiti in ordine. Ma dopo che il primo sottoscrittore è stato eseguito, attiva una nuova azione che ha anche diversi abbonati e così via. Ad un certo punto, alcuni utenti richiederanno dati da altri modelli che dipendono dalla prima azione, ma non sono stati ancora aggiornati. Vedi lo schema:

    
posta Paulo Madroñero 07.12.2016 - 17:47
fonte

2 risposte

1

come suggerito da Dunk , il modo in cui ho risolto questo problema è stato ridisegnare e utilizzare una terza entità per gestire il evento iniziale e quindi per garantire che il sequenziamento sia nell'ordine corretto.

Lo strumento scelto era Reactive Extensions (Rx) . Trovo che la descrizione di Microsoft msdn sia molto accurata:

Reactive Extensions (Rx) is a library for composing asynchronous and event-based programs using observable sequences and LINQ-style query operators.

Quindi il risultato è qualcosa del tipo:

Non ho intenzione di andare in profondità in rx, ma fondamentalmente trattiamo ogni emettitore di eventi come un flusso di dati. Questo flusso di dati viene solitamente gestito come array statico. Possiamo fare tutto ciò che vogliamo con i flussi, e se costruiamo una catena di flussi, avremo sempre un flusso aggiornato alla fine della catena.

Quindi i pro di questo approccio sono:

  • Imparerai un nuovo paradigma di programmazione (se non lo sai già)
  • Non è necessario reinventare la ruota creando un sistema di gestione degli eventi complesso.
  • Una volta imparato, diventerà molto facile gestire grandi flussi di eventi.

Gli svantaggi:

  • Devi refactoring. Può essere fatto in parte, tuttavia è necessaria una buona comprensione per farlo.
  • Davvero, una curva di apprendimento DAVVERO ripida (almeno per me lo era). Non ho mai lavorato con la programmazione reattiva o funzionale, quindi per la prima volta ho impiegato me e il mio team per trasformare il nostro cervello in un pensiero funzionale.
  • Un po 'complicato debug e unit test, ma non impossibile.
risposta data 20.02.2017 - 10:54
fonte
0

Il nome formale in UML è "unione di attività (concorrenti)", vedere " Diagramma attività " o più dettagliato qui .

Un possibile approccio per gestire questo è passare un ID univoco o un token dall'origine dell'evento iniziale attraverso la catena, così il "nodo join" può confrontare questo ID per gli eventi in arrivo e associare gli stati corretti tramite gli ID corrispondenti. Negli scenari del mondo reale, le cose possono diventare più complesse (ad esempio, gli scenari di timeout, il buffering degli eventi, il nodo di join potrebbe reagire all'input parziale, qualunque cosa tu possa immaginare).

    
risposta data 07.12.2016 - 23:06
fonte