Кратък преглед на реактивните системи

През последните няколко години имаше много шум за реактивните системи. Заедно с шума идва колекцията от подходящи салати с ключови думи като реактивни потоци, реактивни разширения, реактивно програмиране, функционално реактивно програмиране и др. Ако сте били в технологичната индустрия достатъчно дълго, сте виждали цикличните възходи и падения на модни думи и съкращения от време на време. И така, всичко това ли е поредната скорошна дата?

Чувал съм софтуерни инженери, които отхвърлят реактивните системи като нищо повече от псевдоним за асинхронни базирани на събития системи, подобно на начина, по който някои отхвърлят микросервисите като SOA (архитектура, ориентирана към услуги), по-малко ESB (корпоративна сервизна шина). Докато технологичните модни думи с преоткрито значение често се появяват, виждам достатъчно отличителни черти в реактивните системи, за да мисля, че името не е просто друг псевдоним.

Какво представляват реактивните системи?

Реактивният манифест описва основните характеристики на реактивните системи: отзивчиви, еластични, еластични и управлявани от съобщения. Това дава картина на високо ниво и звучи малко общо. По-специално, отзивчивостта, устойчивостта, еластичността, описани в манифеста, са почти стандартни изисквания на много реални приложения в наши дни.

Може би „задвижвано от съобщения“ е изискването, което наистина разграничава реактивните системи от другите. Под капака реактивната система разчита на взаимодействия чрез асинхронно предаване на съобщения, което установява граници между отделните компоненти. Такъв модел на взаимодействие помага да се проправи път към свободно свързване както по време, така и по местоположение за съответност и разпределимост, съответно. В допълнение, тя позволява системата да бъде интегрирана с някакъв неблокиращ механизъм за регулиране на потоците от данни (повече за това по-долу).

Реактивни потоци

При изграждането на реактивни системи изглежда има виден подход, при който операциите по обработка на данни, когато е приложимо, се формулират като композиционни поточни потоци. Това не е част от изискванията в Reactive Manifesto, но това може да е присъщият модел на взаимодействие, управляван от съобщения в реактивни системи, който естествено благоприятства такъв подход, ориентиран към потока.

Очевидно възникнали като отделна инициатива, реактивните потоци могат да се разглеждат като специфичен тип реактивни системи, които се центрират около обработката на потоци, изразявайки композиционните потоци като насочени графики.

Обратен натиск

Един от неблокиращите регулаторни механизми, споменати по-рано, е обратният натиск. Това може да е най-търсената функционалност за системи, които прилагат реактивни потоци. Това е асинхронен механизъм за обратна връзка, работещ в обратна посока на потока към компонентите нагоре по веригата за регулиране на натоварването.

С вграденото обратно налягане, регулиращо потоците по неблокиращ начин, системата може да работи с относително по-стабилно използване на паметта. Такава функционалност елиминира потенциално опустошителните проблеми с препълването на стека (напр. Причинени от бавно потъване на данни), които обикновено би трябвало да бъдат противодействани чрез механизъм за буфериране на данни по поръчка в потоците на потока.

Ами реактивното програмиране?

Като парадигма за програмиране за изграждане на реактивни системи, реактивното програмиране набляга на формулирането на асинхронна логика на програмиране като потоци от данни и автоматично разпространение на промените в стойностите на корелираните променливи в системата. Езиците, използвани за такава парадигма на програмиране, биха осигурили подходящи композируеми функции за работа върху формулираните потоци.

По дизайн реактивното програмиране благоприятства функционалния стил на програмиране, който изразява и решава изчислителни проблеми, използвайки композируеми функции. Независимо от това, съществуването на термина функционално реактивно програмиране предшества това реактивно "движение" с повече от десетилетие. FRP има значително различен фокус и се концентрира около използването на функции за изразяване на поведение през продължително време с проста семантична денотация. И все пак често се разглежда като реактивно програмиране с изричен акцент във функционалното програмиране.

Ако илюстрация с код работи по-добре, препоръчвам да прочетете урока на Андре Сталц, който стъпва през същността на реактивното програмиране в JavaScript с помощта на RxJS.

ReactiveX

ReactiveX, известен още като Reactive Extensions, е API библиотека, която позволява използването на композиционни операции за обработка на потоци от асинхронни събития. Разширявайки се от модела на наблюдателя, наблюдаемите и наблюдателите (които са абонати на наблюдаваните) представляват ключовите съставки в библиотеката с набор от съставящи се оператори за филтриране, преобразуване, агрегиране и др. RxJS и RxJava са две от най-популярните реализации на ReactiveX в JavaScript и Java съответно.

Актьори от Акка

Akka е базирана на актьори библиотека, насочена към изграждане на мащабируеми едновременни и разпределени приложения на JVM (Java Virtual Machine). В основата му са изчислителните примитиви, наречени актьори, които поддържат състояние и поведение и комуникират помежду си чрез асинхронно предаване на съобщения.

Написани в Скала, актьорите от Akka по природа са леки и хлабаво свързани. Това, заедно с надеждните функции на Akka за маршрутизация, рязкост и pub-sub за мащабируеми разпределени системи като IoT, ги правят чудесна платформа за изграждане на реактивни системи.

Акка потоци

Водещ (и основател) на инициативата за реактивни потоци е Akka Streams. Той е изграден върху актьори на Akka и предоставя богат набор от API за изграждане на топологии на потоци и обработка на потоци по силно композиционен начин. Неотдавнашна публикация в блога на мои центрове около потоци Akka и как може да се използва за извършване на някои основни копаене на текст.

Очевидно потоците Akka се стремят като реактивна инициатива в наши дни. Базираните на Akka-Streams драйвери като Reactive Rabbit и ReactiveMongo за RabbitMQ и MongoDB започнаха да набират известна скорост в технологичната индустрия. В допълнение, Akka HTTP, което е следващото поколение на инструментариума Spray REST / HTTP, също е създаден, за да бъде активиран с потоци с потоци Akka като основен двигател.

Всички потоци ориентирани - по някакъв начин

С непрекъснато нарастващата инерция в приемането на инициативата за реактивни системи, тя очевидно е надминала етапа на обикновена реклама. Очевидно е и нещо повече от преоткрита модна дума на асинхронни системи, базирани на събития. От гледна точка на техническите достойнства не виждам причина тя да не стане по-видна. Независимо от това, дори технологичните инициативи с отворен код са като търговски продукти - доброто време може бързо да привлече вниманието в началния етап, а подходящият маркетинг може да помогне за набиране на текуща скорост, необходима за популяризиране на по-широката потребителска база.

Функционалното програмиране във времето се увеличава, така че бих казал, че това е чудесно, тъй като стилът на програмиране се възприема благоприятно при изграждането на реактивни системи. Що се отнася до маркетинга, вярвам, че по-интуитивното и разкриващо именуване на инициативата би се продало по-добре на технологичната индустрия. Човек едва ли би могъл да схване нещо смислено, когато за първи път чуе термина „реактивни системи“. Въпреки че терминът "реактивен" се отнася до някакъв аспект от обхванатото разпространение на промяната в такива системи, той не изпада на аудиторията като характеристика на сигнатурата.

С реактивни системи, реактивни потоци и реактивно програмиране, ориентирани предимно около потоци, мисля, че терминът "поток" е по-разкриваща ключова дума от "реактивен". Търгувайки общо с простота и интуиция, бих комбинирал реактивни системи и реактивни потоци като една инициатива и бих заменил „реактивен“ с нещо, което се центрира около „поток“.