Una breve panoramica dei sistemi reattivi

Negli ultimi due anni si è parlato molto dei sistemi reattivi. Insieme al brusio arriva la raccolta di insalate di parole chiave pertinenti come flussi reattivi, estensioni reattive, programmazione reattiva, programmazione reattiva funzionale, ecc. Se sei stato nel settore della tecnologia abbastanza a lungo, hai visto gli alti e bassi ciclici delle parole d'ordine e acronimi di volta in volta. Quindi, tutto questo è un altro clamore che presto sarà datato?

Ho sentito ingegneri del software respingere i sistemi reattivi come nient'altro che un alias per sistemi asincroni basati su eventi, proprio come il modo in cui alcuni liquidano i microservizi come SOA (architettura orientata ai servizi) senza ESB (bus di servizio aziendale). Mentre spesso compaiono parole d'ordine tecnologiche con un significato reinventato, vedo abbastanza tratti distintivi nei sistemi reattivi per pensare che il nome non sia semplicemente un altro alias.

Cosa sono i sistemi reattivi?

Il Manifesto Reattivo descrive le caratteristiche essenziali dei sistemi reattivi: reattivi, resilienti, elastici e guidati dai messaggi. Ciò fornisce un'immagine di alto livello e un suono un po 'generico. In particolare, la reattività, la resilienza, l'elasticità descritte nel manifesto sono requisiti quasi standard di molte applicazioni del mondo reale oggigiorno.

Forse "guidato dai messaggi" è il requisito che differenzia veramente i sistemi reattivi dagli altri. Sotto il cofano, un sistema reattivo si basa sulle interazioni tramite il passaggio di messaggi asincrono che stabilisce i confini tra i singoli componenti. Un tale modello di interazione aiuta a spianare il percorso verso l'accoppiamento libero sia in termini di tempo che di posizione per la concorrenza e la distribuibilità, rispettivamente. Inoltre, consente al sistema di essere dotato integralmente di alcuni meccanismi non bloccanti per regolare i flussi di dati (più su questo di seguito).

Flussi reattivi

Nella costruzione di sistemi reattivi, sembra esserci un approccio preminente in cui le operazioni di elaborazione dei dati sono, ove applicabile, formulate come flussi di flusso compositivo. Questo non fa parte dei requisiti del Manifesto reattivo, ma potrebbe essere il modello di interazione basato sui messaggi intrinseco nei sistemi reattivi che favorisce naturalmente un approccio di modellazione incentrato sul flusso.

Apparentemente emersi come un'iniziativa separata, i flussi reattivi possono essere visti come un tipo specifico di sistemi reattivi incentrati sull'elaborazione dei flussi, esprimendo flussi compositivi come grafici diretti.

Contropressione

Uno dei meccanismi di regolamentazione non bloccanti menzionati in precedenza è la contropressione. Può essere la funzionalità più richiesta per i sistemi che implementano flussi reattivi. È un meccanismo di feedback asincrono che opera nella direzione opposta del flusso verso i componenti a monte per la regolazione del carico.

Con la contropressione incorporata che regola i flussi di flusso in modo non bloccante, il sistema è in grado di funzionare con utilizzi della memoria relativamente più stabili. Tale funzionalità elimina i problemi di overflow dello stack potenzialmente devastanti (ad es. Causati da un lento assorbimento di dati) che normalmente dovrebbero essere contrastati da un meccanismo di buffering dei dati personalizzato attraverso i flussi di flusso.

E la programmazione reattiva?

Come paradigma di programmazione per la creazione di sistemi reattivi, la programmazione reattiva enfatizza la formulazione della logica di programmazione asincrona come flussi di dati e la propagazione automatica delle modifiche ai valori delle variabili correlate nel sistema. I linguaggi utilizzati per tale paradigma di programmazione fornirebbero funzioni componibili adatte per operare sui flussi formulati.

In base alla progettazione, la programmazione reattiva favorisce lo stile di programmazione funzionale che esprime e risolve i problemi computazionali utilizzando funzioni componibili. Tuttavia, l'esistenza del termine programmazione reattiva funzionale precede questo "movimento" reattivo di oltre un decennio. FRP ha un focus molto diverso e si concentra sull'uso delle funzioni per esprimere comportamenti nel tempo continuo con una semplice semantica di denotazione. Tuttavia, ora è spesso visto come programmazione reattiva con un'enfasi esplicita nella programmazione funzionale.

Se un'illustrazione con codice funziona meglio, consiglio di leggere il tutorial di Andre Staltz che illustra l'essenza della programmazione reattiva in JavaScript utilizzando RxJS.

ReactiveX

ReactiveX, alias Reactive Extensions, è una libreria API che consente l'utilizzo di operazioni di composizione per gestire flussi di eventi asincroni. Estendendosi dal pattern dell'osservatore, gli osservabili e gli osservatori (che sono abbonati agli osservabili) costituiscono gli ingredienti chiave nella libreria con un insieme di operatori componibili per il filtraggio, la trasformazione, l'aggregazione, ecc. RxJS e RxJava sono due delle implementazioni più popolari di ReactiveX rispettivamente in JavaScript e Java.

Attori Akka

Akka è una libreria basata su attori destinata alla creazione di applicazioni scalabili simultanee e distribuite su JVM (Java Virtual Machine). Al centro ci sono primitive computazionali chiamate attori che mantengono lo stato e il comportamento e comunicano tra di loro tramite il passaggio di messaggi asincrono.

Scritti in Scala, gli attori Akka sono per natura leggeri e vagamente accoppiati. Questo, insieme alle robuste funzionalità di routing, sharding e pub-sub di Akka per sistemi distribuiti scalabili come l'IoT, li rende un'ottima piattaforma per la creazione di sistemi reattivi.

Akka flussi

Un front-runner (e un membro fondatore) dell'iniziativa dei flussi reattivi è Akka Streams. È costruito sulla base degli attori Akka e fornisce un ampio set di API per la creazione di topologie di flusso ed elaborazione di flussi in modo altamente compositivo. Un recente post sul mio blog è incentrato sui flussi Akka e su come può essere utilizzato per eseguire alcune operazioni di estrazione di testo di base.

Apparentemente, Akka trasmette come un'iniziativa reattiva si sta sforzando in questi giorni. I driver basati su Akka-Streams come Reactive Rabbit e ReactiveMongo per RabbitMQ e MongoDB hanno iniziato a guadagnare slancio nel settore della tecnologia. Inoltre, Akka HTTP, che è la prossima generazione del toolkit Spray REST / HTTP, è anche costruito per essere abilitato allo streaming con flussi Akka come motore sottostante.

Tutti i flussi sono orientati - in qualche modo

Con lo slancio in costante crescita nell'adozione dell'iniziativa dei sistemi reattivi, apparentemente ha superato lo stadio di essere una semplice campagna pubblicitaria. È anche evidentemente più di una parola d'ordine reinventata di sistemi asincroni basati su eventi. Dal punto di vista dei meriti tecnici, non vedo motivo per cui non diventerà più prominente. Tuttavia, anche le iniziative tecnologiche open source sono come prodotti commerciali: un buon tempismo può attirare rapidamente l'attenzione nella fase iniziale e un marketing adeguato può aiutare a ottenere lo slancio continuo necessario per diffondere alla base di utenti più ampia.

Dal punto di vista temporale, la programmazione funzionale è in aumento, quindi direi che è un ottimo tempismo, poiché lo stile di programmazione è accolto favorevolmente nella costruzione di sistemi reattivi. Per quanto riguarda il marketing, credo che un nome più intuitivo e rivelatore dell'iniziativa venderebbe meglio all'industria tecnologica. Difficilmente si potrebbe cogliere qualcosa di significativo quando si sente per la prima volta il termine "sistemi reattivi". Sebbene il termine "reattivo" affronti alcuni aspetti della propagazione del cambiamento abbracciato in tali sistemi, non salta all'occhio del pubblico come caratteristica distintiva.

Con sistemi reattivi, flussi reattivi e programmazione reattiva prevalentemente orientata attorno ai flussi, penso che il termine "flusso" sia una parola chiave più rivelatrice di "reattivo". Scambiando generalità con semplicità e intuizione, combinerei sistemi reattivi e flussi reattivi come un'unica iniziativa, e sostituirei "reattivo" con qualcosa che ruota attorno al "flusso".