Parliamo di Reactive Programming

Parliamo di Reactive Programming. Che cos’è la programmazione reattiva?
La programmazione reattiva descrive un paradigma di progettazione che si basa sulla logica di programmazione asincrona per gestire gli aggiornamenti in tempo reale di contenuti altrimenti statici. Fornisce un mezzo efficiente – l’uso di flussi di dati automatizzati – per gestire gli aggiornamenti dei contenuti ogni volta che un utente effettua una richiesta.

I flussi di dati utilizzati nel reactive programming sono collezioni coerenti e coese di segnali digitali creati su base continua o quasi. Questi flussi di dati vengono inviati da una fonte, come un sensore di movimento, un indicatore di temperatura o un database dell’inventario dei prodotti, in risposta a un trigger. Tale innesco può avvenire tramite:

  • Un evento, come avvisi generati dal software, sequenze di tasti o segnali provenienti da un sistema Internet delle cose (IoT).
  • Una chiamata, ovvero una funzione che invoca una routine come parte di un flusso di lavoro.
  • Un messaggio, ovvero un’unità informativa che il sistema invia all’utente o all’operatore del sistema con informazioni sullo stato di un’operazione, un errore, un guasto o un’altra condizione.


La programmazione reattiva crea un software che risponde agli eventi piuttosto che sollecitare gli input degli utenti. Un evento è semplicemente un segnale che indica che è successo qualcosa. È generalmente accettato che gli eventi siano segnali “in tempo reale”, ovvero che siano generati contemporaneamente alla condizione che segnalano e che debbano essere elaborati in tempo reale. Questi eventi sono meglio visualizzati come “flussi” che possono scorrere attraverso più elementi di elaborazione, essere fermati e gestiti lungo il percorso, o biforcarsi e generare attività di elaborazione parallela. Nella maggior parte dei casi, questa elaborazione è sensibile al tempo, il che significa che le applicazioni richiedono uno stile di programmazione diverso, ed è così che è nata la programmazione reattiva.

Quando parliamo di Reactive Programming i sistemi reattivi con cui si confronta consistono in una combinazione di funzioni “osservatore” e “gestore”. Il primo riconosce condizioni o cambiamenti importanti e genera messaggi per segnalarli, mentre il secondo gestisce questi messaggi in modo appropriato. Il presupposto della programmazione reattiva è che non c’è controllo sul numero o sulla tempistica degli eventi, quindi il software deve essere resiliente e altamente scalabile per gestire carichi variabili.

Le prime applicazioni della programmazione reattiva alle applicazioni aziendali erano in gran parte limitate a questioni come il monitoraggio dello stato delle reti, dei server o del software e la segnalazione di condizioni del database come i livelli di inventario. Questo orientamento sta cambiando con l’avvento dell’IoT, degli edifici e delle città intelligenti e del cloud computing pubblico. L’IoT ha reso il modello reattivo importante nella gestione delle strutture, nel controllo dei processi industriali e persino nella domotica. Il cloud ha introdotto sia uno stile di componentizzazione del software – l’informatica funzionale e i microservizi – sia un movimento per spostare molte applicazioni reattive nel cloud per i suoi vantaggi di scalabilità e affidabilità.

Come funziona la programmazione reattiva (Parliamo di Reactive Programming)?
La programmazione reattiva si basa sui flussi, che sono sequenze ordinate nel tempo di messaggi di eventi correlati. Un determinato flusso inizia generalmente con un osservatore, che può essere un segmento di codice all’interno di un’applicazione che osserva una condizione relativa all’applicazione stessa, oppure un dispositivo come un sensore IoT che genera un evento. Un flusso viene talvolta rappresentato come una freccia, da sinistra a destra, che inizia con il processo dell’osservatore e scorre attraverso uno o più gestori fino a quando non viene elaborato completamente, termina in uno stato di errore o si biforca in flussi derivati. La programmazione reattiva consiste nel costruire questi osservatori e gestori e nel filettare il flusso come richiesto.

I flussi generati dai dispositivi sono facilmente comprensibili. Ma i flussi generati da osservatori inseriti dal software sono un po’ più complicati. Normalmente, questi elementi lavorano in collaborazione con il lavoro di elaborazione svolto da un’applicazione oppure vengono eseguiti periodicamente per monitorare un elemento del database. Quando questo elemento software riconosce una condizione, genera un evento nel flusso.

Un flusso di eventi è gestito dai gestori stessi, che inviano il lavoro a un processo successivo specifico, oppure da un bus di messaggi, come un bus di servizi aziendali o una coda di messaggi, che trasporta il messaggio agli ascoltatori del bus designati. Il processo di gestione dei messaggi determina se un messaggio viene trasmesso a più gestori o a un singolo gestore, e normalmente è anche responsabile del bilanciamento del carico tra più gestori paralleli o della fornitura di gestori di riserva in caso di guasto.

Ogni gestore deve passare il messaggio, determinare che il processo di streaming è terminato e “mangiare” il messaggio, oppure generare un errore. Il gestore può decidere se “biforcare” un messaggio a più flussi o se generare un nuovo flusso o più flussi. Queste condizioni di fork sono spesso usate per separare i compiti nella gestione dei messaggi; un messaggio potrebbe generare una risposta locale per aprire un gate e un messaggio a un sistema di elaborazione delle transazioni.

In “The Reactive Principle”, il seguito di “The Reactive Manifesto”, Jonas Bonér e altri definiscono gli otto principi che un’applicazione deve incarnare per essere considerata reattiva:

  • Rimanere reattivi. Rispondere sempre in modo tempestivo.
  • Accettare l’incertezza. Costruire l’affidabilità nonostante le fondamenta inaffidabili.
  • Abbracciare il fallimento. Aspettatevi che le cose vadano male e costruite la vostra resilienza.
  • Affermare l’autonomia. Progettare componenti che agiscono in modo indipendente e interagiscono in modo collaborativo.
  • Personalizzare la consistenza. Individuare la coerenza per ogni componente per bilanciare disponibilità e prestazioni.
  • Disaccoppiare il tempo. Elaborare in modo asincrono per evitare la coordinazione e l’attesa.
  • Disaccoppiare lo spazio. Creare flessibilità abbracciando la rete.
  • Gestire le dinamiche. Adattarsi continuamente alla variazione della domanda e delle risorse.

Vantaggi e sfide del reactive programming
I principali vantaggi delle tecniche di programmazione reattiva sono la loro capacità di:

  • fornire un migliore controllo sui tempi di risposta associati all’elaborazione degli eventi;
  • consentire una progettazione coerente del software per i sistemi in tempo reale, per ridurre i costi e gli sforzi di sviluppo e manutenzione;
  • supportare il bilanciamento del carico e la resilienza per migliorare la qualità dell’esperienza; e
  • rendere esplicito il concetto di flusso o di evento, migliorando la gestione complessiva degli elementi di calcolo e delle risorse di elaborazione rendendoli più “visibili”.


Questi vantaggi sono accompagnati da sfide, tra cui le seguenti:

  • Aggiungere processi di osservazione al software attuale può essere difficile o impossibile, a seconda della disponibilità del codice sorgente e delle competenze di programmazione del personale.
  • La progettazione reattiva rappresenta un importante cambiamento di mentalità per gli sviluppatori e gli sforzi compiuti presenteranno una curva di apprendimento durante la quale potrebbe essere necessaria una maggiore convalida e supervisione della progettazione e della codifica.
  • I sistemi reattivi possono facilmente accumulare ritardi a causa di un numero eccessivo di processi collegati al flusso.


Parliamo di Reactive Programming, come adottarla.
Un buon programma reattivo inizia con un diagramma chiaro del flusso di eventi, che includa tutti i processi gestori specifici e il loro ruolo nell’elaborazione, nella terminazione o nella generazione di errori. Una volta fatto questo, la piattaforma di hosting – edge, cloud o data center – viene selezionata e designata sul diagramma del flusso per ogni processo, evitando di andare avanti e indietro attraverso i confini della piattaforma di hosting. Lo sviluppo può quindi iniziare.

Durante lo sviluppo è necessario osservare le seguenti best practice:

Quando un flusso di eventi deve innescare una risposta del mondo reale, come ad esempio l’apertura di un cancello, mantenere il ciclo di controllo breve spostando il processo di risposta più vicino alla parte anteriore del flusso e ospitandolo vicino alla sorgente dell’evento.
Evitare l’uso di linguaggi e tecniche di programmazione che creano componenti statici che memorizzano i dati con il software, per garantire che i componenti possano essere scalati e sostituiti facilmente.
Esaminare l’ubicazione e l’implementazione di qualsiasi database necessario ai processi di gestione per garantire che l’accesso al database non aggiunga latenza o attraversi i confini del cloud, generando costi aggiuntivi.
In ogni fase dello sviluppo, fate riferimento al diagramma del flusso di eventi per assicurarvi che sia mantenuto, aggiornato e preciso.


Casi d’uso della programmazione reattiva
Se Parliamo di Reactive Programming ne descriviamo i principali casi d’uso:

  • Applicazioni IoT in cui i sensori creano eventi che poi controllano le fasi dei processi del mondo reale, creano transazioni commerciali o entrambi. Questa è l’applicazione in più rapida crescita delle tecniche di programmazione reattiva, anche se non è l’obiettivo tradizionale.
  • Applicazioni che raccolgono informazioni sullo stato delle reti o degli elementi di elaborazione dei dati attraverso agenti software inseriti che monitorano attività o elementi di dati. Questa è la prima applicazione classica della programmazione reattiva, ma sta convergendo con l’IoT.
  • Qualsiasi applicazione che richieda una gestione altamente interattiva dell’interfaccia utente-utente, in particolare quando ogni tasto deve essere elaborato e interpretato. Questa è l’altra classica applicazione di programmazione reattiva, che ora include i giochi e alcune applicazioni di social media.
  • Segnalazione tra applicazioni, in particolare tra quelle che potremmo definire applicazioni “in primo piano” e applicazioni “in background” o batch, che eseguono analisi statistiche e pulizia di database. Questo caso d’uso comporta normalmente un processo che monitora le modifiche e attiva un flusso di eventi quando ne viene rilevato uno.
  • Coordinamento tra l’elaborazione funzionale del cloud AWS Lambda e l’elaborazione back-end del data center, dove un evento attiva l’esecuzione di un processo back-end. Questo facilita alcune forme di sviluppo del cloud ibrido.

(fonte)

Innovaformazione, scuola informatica specialistica promuove i nuovi paradigmi di sviluppo software tra cui il reactive programming. Come argomento di formazione lo trovate all’interno del Corso Spring framework . Mentre l’elenco dell’intera offerta formativa (per aziende) è disponibile sul nostro sito QUI.

INFO: info@innovaformazione.net – tel. 3471012275 (Dario Carrassi)

Vuoi essere ricontattato? Lasciaci il tuo numero telefonico e la tua email, ti richiameremo nelle 24h:

    Ti potrebbe interessare

    Articoli correlati