Reaktív programozás java. Reaktív programozás az Objective-C-ben

Egy modern programozási tudományágról szeretnék beszélni, amely megfelel a skálázhatóság, a hibatűrés és a gyors reagálás iránti növekvő igényeknek, és nélkülözhetetlen mind többmagos környezetben, mind felhő alapú számítástechnika, valamint egy nyílt online tanfolyamot is bemutatunk róla, amely alig néhány napon belül kezdődik.

Ha még nem hallottál róla reaktív programozás, Minden rendben. Ez egy gyorsan fejlődő tudományág, amely egyesíti az egyidejűséget az eseményvezérelt és az aszinkronnal. A reaktivitás minden webszolgáltatás és elosztott rendszer velejárója, és számos nagy teljesítményű, nagy fokú párhuzamossággal rendelkező rendszer magja. Röviden, a kurzus készítői azt javasolják, hogy a reaktív programozást tekintsék a funkcionális programozás természetes kiterjesztésének (magasabb rendű függvényekkel) párhuzamos rendszerekre, amelyek elosztott állapotúak, amelyeket az aktív alanyok által kicserélt aszinkron adatfolyamok koordinálnak és hangszerelnek, ill. szereplők.

Érthetőbb szavakkal ez a Reaktív Kiáltványban van leírva, az alábbiakban a főbb rendelkezéseket újramondom belőle, a teljes fordítást pedig a Habrén közöljük. Ahogy a Wikipédia mondja, a kifejezés reaktív programozás már régóta létezik és praktikus alkalmazások változó fokú egzotikum, de a Reactive Manifesto szerzőinek, a Typesafe Inc. kezdeményező csoportjának erőfeszítéseinek köszönhetően egészen a közelmúltban kapott új lendületet a fejlesztéshez és a terjesztéshez. A Typesafe a funkcionális programozói közösségben a kiváló Scala nyelv és a forradalmian új párhuzamos Akka platform szerzői által alapított cégként ismert. Most úgy pozícionálják cégüket, mint a világ első sugárhajtású platformjának megalkotóját, amelyet egy új generáció fejlesztésére terveztek. Platformjuk lehetővé teszi az összetett gyors fejlesztését felhasználói felületekés az absztrakció új szintjét biztosítja a párhuzamos számítástechnika és a többszálú feldolgozáson keresztül, csökkentve az ezekben rejlő kockázatokat a garantált kiszámítható skálázás révén. A gyakorlatba ülteti át a Reactive Manifesto elképzeléseit, és lehetővé teszi a fejlesztő számára a modern igényeknek megfelelő alkalmazások megértését és létrehozását.

Ezt a platformot és a reaktív programozást ismerheti meg, ha részt vesz a Reactive Principles Massive Open Online Course-on. Ez a kurzus Martin Odersky „Funkcionális programozás alapelvei a Scalában” című kurzusának folytatása, amelynek több mint 100 000 résztvevője volt, és a résztvevők a világon az egyik legmagasabb sikerességi arányt mutatták be a Massive Open Online Course esetében. A Scala nyelv megalkotójával közösen az új kurzust Eric Meyer, aki a .NET alatti reaktív programozás Rx keretrendszerét fejlesztette ki, és Roland Kuhn, aki jelenleg a Typesafe Akka fejlesztőcsapatát vezeti. A kurzus lefedi a reaktív programozás kulcsfontosságú elemeit, és bemutatja, hogyan alkalmazzák azokat a méretezhető és hibatűrő eseményvezérelt rendszerek tervezésére. A tananyag illusztrált rövid programokés egy sor feladatsor kíséri, amelyek mindegyike szoftverprojekt. Valamennyi feladat sikeres teljesítése esetén a résztvevők oklevelet kapnak (természetesen a részvétel és az igazolás ingyenes). A tanfolyam 7 hétig tart és ezen a hétfőn, november 4-én indul. A kurzus részletes vázlata és egy bemutatkozó videó is elérhető a kurzus oldalán: https://www.coursera.org/course/reactive.

Akit érdekel, vagy kétségei vannak, annak ajánlom a Reaktív Kiáltvány alapfogalmainak tömör összefoglalását. Szerzői jelentős változásokat észlelnek a pályázatok követelményeiben utóbbi évek. Ma az alkalmazások bármilyen környezetben üzembe helyezhetők mobil eszközök több ezer többmagos processzorral rendelkező felhőfürtökhöz. Ezek a környezetek új követelményeket támasztanak szoftverés technológiák. Az előző generációs architektúrák a felügyelt szerverekre és konténerekre összpontosítottak, további drága hardvereken, szabadalmaztatott megoldásokon és párhuzamos számítástechnika többszálon keresztül. Jelenleg egy új architektúra fejlesztése folyik, amely négy kulcsfontosságú tulajdonsággal rendelkezik, amelyek egyre inkább elterjednek mind a fogyasztói, mind a vállalati ipari környezetben. Az ilyen architektúrájú rendszerek: eseményvezérelt, skálázható, hibatűrő (Resilient) és gyors reagálásúak, pl. reagáló (Responsive). Ez zökkenőmentes, valós idejű felhasználói élményt biztosít, amelyet egy öngyógyító, méretezhető alkalmazáscsomag támogat, amely készen áll a többmagos és felhőkörnyezetekben történő telepítésre. A reaktív architektúrák mind a négy jellemzője a teljes technológiai veremre vonatkozik, ami megkülönbözteti őket a réteges architektúrák hivatkozásaitól. Tekintsük őket egy kicsit részletesebben.


Eseményvezérelt Az alkalmazások aszinkron komponens kommunikációt feltételeznek, és lazán csatolt felépítésüket valósítják meg: az üzenet küldőjének és fogadójának nem kell tudnia sem egymásról, sem az üzenet továbbításának módjáról, ami lehetővé teszi, hogy a kommunikáció tartalmára koncentrálhasson. Amellett, hogy a lazán csatolt komponensek jelentősen javítják a rendszer karbantarthatóságát, bővíthetőségét és evolúcióját, interakciójuk aszinkronitása és nem blokkoló jellege az erőforrások jelentős részét is felszabadíthatja, csökkentheti a válaszidőt és O több áteresztőképesség a hagyományos alkalmazásokhoz képest. Az eseményvezérelt természetnek köszönhető, hogy a reaktív architektúra többi jellemzője lehetséges.

Méretezhetőség a reaktív programozás keretében ez a rendszer reakciója a terhelés változására, pl. rugalmasság, amelyet a számítási csomópontok szükség szerinti hozzáadásának vagy felszabadításának képessége ér el. Az alacsony csatolás, az aszinkron üzenetküldés és a hely átláthatósága miatt a telepítési módszer és az alkalmazás topológia a telepítési idő döntésévé válik, és a terhelésre reagáló konfiguráció és az adaptív algoritmusok függvénye. És így, számítógép hálózat az alkalmazás részévé válik, kezdetben kifejezetten elosztott természetű.

hibatűrés A reaktív architektúra is a tervezés részévé válik, és ez jelentősen eltér a rendszer folyamatos rendelkezésre állását a szerverredundancián és a feladatátvételen keresztül biztosító hagyományos megközelítésektől. Egy ilyen rendszer rugalmasságát azáltal éri el, hogy képes megfelelően reagálni az egyes összetevők meghibásodására, elkülöníteni ezeket a hibákat azáltal, hogy kontextusukat az őket okozó üzenetek formájában tárolja, és továbbadja ezeket az üzeneteket egy másik komponensnek, amely döntést tud hozni arról, hogyan kezelni a hibát. Ez a megközelítés lehetővé teszi az alkalmazás üzleti logikájának tisztán tartását, elválasztva attól a hibakezelés logikáját, amely kifejezetten deklaratív formában van megfogalmazva a hibák regisztrálásához, elkülönítéséhez és a rendszer eszközeivel történő kezeléséhez. Az ilyen öngyógyító rendszerek felépítéséhez az összetevőket hierarchikusan rendezik, és a problémát olyan szintre emelik, amely meg tudja oldani.

És végül fogékonyság- ez a rendszer azon képessége, hogy a terheléstől és meghibásodásoktól függetlenül reagáljon a felhasználói bemenetekre, az ilyen alkalmazások bevonják a felhasználót interakcióba, érzést keltenek szoros kapcsolat rendszerrel és elegendő felszereléssel az aktuális feladatok elvégzéséhez. A válaszkészség nemcsak a valós idejű rendszerekben releváns, hanem az alkalmazások széles körében is szükséges. Ráadásul az a rendszer sem tekinthető hibatűrőnek, amely még meghibásodáskor sem tud gyorsan reagálni. A válaszkészség megfigyelhető modellek, eseményfolyamok és állapotjelző kliensek használatával érhető el. A megfigyelhető modellek eseményeket bocsátanak ki, amikor állapotuk megváltozik, és valós idejű interakciót biztosítanak a felhasználók és a rendszerek között, míg az eseményfolyamok biztosítják azt az absztrakciót, amelyre ez az interakció épül, nem blokkoló aszinkron transzformációk és kommunikáció révén.

Így a reaktív alkalmazások kiegyensúlyozott megközelítést képviselnek a modern szoftverfejlesztés számos problémájának megoldásában. Eseményvezérelt alapokra építve biztosítják a skálázhatóság és a hibatűrés garantálásához szükséges eszközöket, és támogatják a teljes értékű reszponzív felhasználói élményt. A szerzők mindezt elvárják több rendszerek betartják a reaktív kiáltvány elveit.

Ezen kívül a tanfolyami tervet fordítás nélkül adom. Csak arra az esetre, ha idáig elolvastad, és még mindig kíváncsi vagy.

1. hét: A funkcionális programozás alapelveinek áttekintése: helyettesítési modell, for-kifejezések és azok viszonya a monádokhoz. Bevezeti a for-kifejezések új megvalósítását: a véletlenérték generátorokat. Megmutatja, hogyan használható ez a véletlenszerű tesztelés során, és áttekintést ad a ScalaCheckről, egy eszközről, amely megvalósítja ezt az ötletet.

2. hét: Funkcionális programozás és változtatható állapot. Mi tesz egy objektumot változtathatóvá? Hogyan hat ez a helyettesítési modellre. Bővített példa: Digitális áramkör szimuláció

3. hét: határidős ügyletek. Bemutatja a futures-t, mint egy másik monádot, a for-kifejezésekkel konkrét szintaxisként. Megmutatja, hogyan lehet határidős ügyleteket összeállítani a szálak blokkolásának elkerülése érdekében. A szálak közötti hibakezelést tárgyalja.

4. hét: Reaktív adatfolyam feldolgozás. A határidők általánosítása reaktív számításokra folyamokon keresztül. stream operátorok.

5. hét:Színészek. Bemutatja a színészmodellt, a szereplőket a konzisztencia, az aszinkron üzenettovábbítás beágyazott egységeiként, tárgyalja az üzenetküldés különböző szemantikáját (legfeljebb egyszer, legalább egyszer, pontosan egyszer) és az esetleges konzisztenciát.

6. hét: felügyelet. Bemutatja a hibák reifikációját, a hierarchikus hibakezelést, a hiba kernel mintáját, az életciklus figyelését, tárgyalja a tranziens és perzisztens állapotokat.

7. hét: Beszélgetési minták. Megvitatja a szereplők közötti párbeszéd állapotának kezelését és az áramlásszabályozás mintáit, az üzenetek továbbítását a szereplők csoportjaihoz a rugalmasság vagy a terheléselosztás érdekében, a vétel nyugtázását a megbízható kézbesítés elérése érdekében.

Az OOP fejlesztés világa általában és a Java nyelv különösen aktív életet él. Megvannak a maga divatirányzatai, és ma elemezzük a szezon egyik fő trendjét - a ReactiveX keretrendszert. Ha még mindig távol áll ettől a hullámtól - ígérem, tetszeni fog! Egyértelműen jobb, mint a magas derekú farmer :).

Reaktív programozás

Amint az OOP nyelvek tömeges használatra érettek, a fejlesztők rájöttek, hogy a C-szerű nyelvek képességei néha mennyire hiányosak. Mivel a kódírás a funkcionális programozás stílusában súlyosan rontja az OOP kód minőségét, és ezáltal a projekt karbantarthatóságát, egy hibridet találtak ki - reaktív programozás.

A reaktív fejlesztési paradigma azon az elképzelésen alapul, hogy folyamatosan nyomon kell követni egy objektum állapotában bekövetkező változásokat. Ha ilyen változások történtek, akkor minden érdeklődő objektumnak már frissített adatokat kell kapnia, és csak velük kell dolgoznia, elfelejtve a régieket.

A reaktív programozási ötlet jó példája az Excel táblázat. Ha több cellát kapcsol össze egy képlettel, a számítás eredménye minden alkalommal megváltozik, amikor az ezekben a cellákban lévő adatok megváltoznak. A könyvelésnél az adatok ilyen dinamikus változása általános dolog, a programozóknál viszont inkább kivétel.

A=3; b=4; c=a+b; F1(c); a=1; F2(c);

Ebben a példában az F1 és F2 függvények a C változó különböző értékeivel működnek. Gyakran előfordul, hogy mindkét függvénynek csak a legfrissebb adatokkal kell rendelkeznie - a reaktív programozás lehetővé teszi, hogy azonnal hívja az F1-et paramétereket a függvények logikájának megváltoztatása nélkül. Ez a kódstruktúra lehetővé teszi az alkalmazás számára, hogy azonnal reagáljon bármilyen változásra, ami gyorssá, rugalmassá és reagálóvá teszi.

ReactiveX

A reaktív programozási ötletek a semmiből való megvalósítása meglehetősen problémás lehet – vannak buktatók, és ez elég sok időt vesz igénybe. Ezért sok fejlesztő számára ez a paradigma csak elméleti anyag maradt a ReactiveX megjelenéséig.

A ReactiveX keretrendszer egy reaktív programozási eszköz, amely az összes népszerű OOP nyelvvel működik. Maguk a készítők többplatformos API-nak hívják az aszinkron fejlesztéshez, az Observer minta alapján.

Ha a "reaktív programozás" kifejezés egyfajta elméleti modell, akkor az Observer minta egy kész mechanizmus a program változásainak követésére. És elég gyakran kell követni őket: adatok betöltése és frissítése, eseményértesítések stb.

Az Observer minta körülbelül olyan régóta létezik, mint maga az OOP. Egy objektumot, amelynek állapota változhat, kiadónak nevezzük (a Megfigyelhető kifejezés népszerű fordítása). Az összes többi résztvevő, akit érdekelnek ezek a változások, előfizetők (megfigyelő, előfizető). Az értesítések fogadásához az előfizetők azonosítójuk kifejezett megadásával regisztrálnak a kiadónál. A kiadó időről időre értesítéseket generál, amelyeket a kiadó elküld a regisztrált előfizetők listájára.

Valójában a ReactiveX készítői nem találtak ki semmi forradalmiat, csak kényelmesen megvalósították a mintát. És bár sok OOP nyelv, és különösen a Java, rendelkezik a minta kész megvalósításával, ez a keretrendszer további "tuningolást" tartalmaz, amely az "Observert" nagyon hatékony eszközzé varázsolja.

RxAndroid

Az Android-világ ReactiveX könyvtárának portját rxAndroidnak hívják, és mint mindig, a Gradle-n keresztül csatlakozik.

Fordítsa le az "io.reactivex:rxandroid:1.1.0" fájlt

Az értesítéseket generáló kiadó itt a Megfigyelhető osztály használatával van megadva. Egy kiadónak több előfizetője is lehet, ezek megvalósításához az Előfizető osztályt használjuk. A megfigyelhető alapértelmezett viselkedése az, hogy egy vagy több üzenetet küld az előfizetőknek, majd kilép, vagy hibaüzenetet ad ki. Az üzenetek lehetnek változók és egész objektumok is.

Rx.Observable myObserv = rx.Observable.create(new rx.Observable.OnSubscribe () ( @A nyilvános érvénytelen hívás felülbírálása (előfizetőelőfizető) ( előfizető.Következő("Helló"); előfizető.Következő("világ"); előfizető.Befejezett(; ) ));

Ebben az esetben a myObserv kiadó először elküldi a hello és üzenet karakterláncokat, majd egy sikerüzenetet. A kiadó meghívhatja az onNext() , onCompleted() és onEror() metódusokat, ezért az előfizetőknek ezeket meg kell határozniuk.

Előfizető mySub = új előfizető () (... @Override public void onNext(String value) (Log.e("adatot kaptam", " " + érték);) );

Minden készen áll a munkára. Marad az objektumok összekapcsolása - és a "Hello, world!" a reaktív programozás készen áll!

MyObserv.subscribe(mySub);

Azt kell mondanom, hogy ez egy nagyon egyszerű példa volt. A ReactiveX számos lehetőséget kínál a mintában szereplő összes résztvevő viselkedésére: szűrés, csoportosítás, hibakezelés. A reaktív programozás előnyeit csak gyakorlati kipróbálással lehet érezni. Térjünk rá komolyabban a feladatra.

Továbbra is csak a tagok számára elérhető

1. lehetőség: Csatlakozzon a "webhely" közösséghez, hogy elolvassa az oldalon található összes anyagot

A meghatározott időszakban a közösséghez való tagság hozzáférést biztosít az ÖSSZES Hacker anyaghoz, növeli a személyes kumulatív kedvezményt, és lehetővé teszi, hogy professzionális Xakep Score értékelést gyűjtsön!

Megy.

A reaktív programozás először úgy hangzik, mint egy születőben lévő paradigma neve, de valójában egy olyan programozási módszerre utal, amely eseményvezérelt megközelítést alkalmaz az aszinkron adatfolyamokkal való munkához. A folyamatosan aktuális adatok alapján a reaktív rendszerek eseménysorozat végrehajtásával reagálnak rájuk.
A reaktív programozás az Observer tervezési mintáját követi, amely a következőképpen definiálható: ha egy objektumban állapotváltozás történik, akkor az összes többi objektumot ennek megfelelően értesíti és frissíti. Tehát ahelyett, hogy lekérdeznék az eseményeket a változásokhoz, az eseményeket aszinkron módon tolják el, hogy a megfigyelők feldolgozhassák azokat. Ebben a példában a megfigyelők olyan függvények, amelyek egy esemény elküldésekor kerülnek végrehajtásra. És az említett adatfolyam a ténylegesen megfigyelhető.

Szinte minden nyelv és keretrendszer ezt a megközelítést alkalmazza az ökoszisztémájában, és a Java legújabb verziói sem kivételek. Ebben a cikkben elmagyarázom, hogyan lehet reaktív programozást alkalmazni a JAX-RS legújabb verziójával a Java EE 8 és Java 8 funkciókban.

Reaktív kiáltvány

A Reactive Manifesto négy alapvető szempontot sorol fel, amelyek alapján egy alkalmazásnak rugalmasabbnak, lazább csatolásúnak és könnyen méretezhetőnek kell lennie, és ezért képesnek kell lennie reagálni. Azt mondja, hogy az alkalmazásnak érzékenynek, rugalmasnak (és ezért méretezhetőnek), rugalmasnak és üzenetvezéreltnek kell lennie.

A mögöttes cél egy valóban érzékeny alkalmazás. Tegyük fel, hogy van egy olyan alkalmazásod, amelyik egy nagy szál feldolgozza a felhasználói kéréseket, és a munka végeztével a szál visszaküldi a válaszokat az eredeti kérelmezőknek. Ha egy alkalmazás több kérést kap, mint amennyit kezelni tud, ez a folyamat szűk keresztmetszetté válik, és az alkalmazás elveszíti korábbi válaszkészségét. Ahhoz, hogy továbbra is reagáljon, az alkalmazásnak méretezhetőnek és rugalmasnak kell lennie. A rugalmas alkalmazás olyan alkalmazás, amely automatikus helyreállítási funkcióval rendelkezik. A legtöbb fejlesztő tapasztalata szerint csak az üzenetvezérelt architektúra teszi lehetővé az alkalmazások méretezhetőségét, robusztusságát és érzékenységét.

A reaktív programozást a Java 8-ban és a Java EE 8-ban vezették be. A Java nyelv olyan fogalmakat vezetett be, mint a CompletionStage és annak CompletableFuture megvalósítása, és a Java elkezdte használni ezeket a szolgáltatásokat olyan specifikációkban, mint például a JAX-RS Reactive Client API-ja.

JAX-RS 2.1 Reactive Client API

Nézzük meg, hogyan használható a reaktív programozás a Java EE 8 alkalmazásokban A folyamat megértéséhez alapszintű Java EE API ismerete szükséges.

A JAX-RS 2.1 új módszert vezetett be a reaktív REST kliens létrehozására. A JAX-RS által kínált meghívó alapértelmezett megvalósítása szinkron, ami azt jelenti, hogy a létrehozandó kliens blokkoló hívást küld a szerver végpontjára. Példa megvalósításra az 1. listában található.

Válasz válasz = ClientBuilder.newClient() .target("http://localhost:8080/service-url") .request() .get();
A 2.0-s verziótól kezdődően a JAX-RS támogatja az aszinkron hívó létrehozását az ügyfél API-n az async() metódus egyszerű meghívásával, a 2. listában látható módon.

Jövő válasz = ClientBuilder.newClient() .target("http://localhost:8080/service-url") .request() .async() .get();
Aszinkron hívó használata az ügyfélen a javax.ws.rs.core.Response típusú Future példányt adja vissza. Ez válaszlekérdezést, a future.get() meghívását vagy egy visszahívás regisztrálását eredményezheti, amely akkor kerül meghívásra, ha van elérhető HTTP-válasz. Mindkét megvalósítás alkalmas aszinkron programozásra, de a dolgok általában bonyolultabbak lesznek, ha csoportosítani szeretné a visszahívásokat, vagy feltételes eseteket kíván hozzáadni az aszinkron végrehajtási minimumokhoz.

A JAX-RS 2.1 reaktív módot kínál ezeknek a problémáknak a megoldására az új JAX-RS Reactive Client API-val az ügyfél-összeállításhoz. Ez olyan egyszerű, mint az rx() metódus meghívása a kliens összeállítása során. A 3. listában az rx() metódus egy reaktív meghívót ad vissza, amely a kliens végrehajtása során létezik, és a kliens egy CompletionStage.rx() típusú választ ad vissza, amely lehetővé teszi a szinkron meghívóról az aszinkron meghívóra való áttérést egyszerű művelettel. hívás.

CompletionStage válasz = ClientBuilder.newClient() .target("http://localhost:8080/service-url") .request() .rx() .get();
CompletionStage<Т>a Java 8-ban bevezetett új interfész. Ez egy számítást reprezentál, amely lehet egy lépés a nagyobb számításon belül, ahogy a neve is sugallja. Ez az egyetlen Java 8 reaktivitás, amely bekerült a JAX-RS-be.
A válaszpéldány kézhezvétele után meghívhatom az AcceptAsync() -t, ahol megadhatok egy kódrészletet, amely aszinkron módon fog lefutni, amikor a válasz elérhetővé válik, a 4. listában látható módon.

Response.thenAcceptAsync(res -> ( Hőmérséklet t = res.readEntity(Temperature.class); //dolgok elvégzése t-vel ));
Reaktivitás hozzáadása egy REST-végponthoz

A reaktív megközelítés nem korlátozódik az ügyféloldalra a JAX-RS-ben; szerver oldalon is használható. Példaként először létrehozok egy egyszerű szkriptet, amelyben lekérhetem a helyek listáját egyetlen célhoz. Minden pozíciónál külön hívást kezdeményezek a helyadatokkal egy másik pontra, hogy megkapjam a hőmérsékleti értékeket. A célállomások interakciója az 1. ábrán látható módon történik.

1. ábra: Interakció a célállomások között

Először csak a tartománymodellt határozom meg, majd az egyes modellekhez tartozó szolgáltatásokat. Az 5. lista bemutatja, hogyan van meghatározva a Forecast osztály, amely a Hely és a Hőmérséklet osztályokat foglalja magában.

Nyilvános osztály Hőmérséklet ( privát Kettős hőmérséklet; privát String skála; // getterek és beállítók ) public class Hely ( Karakterlánc neve; public Location() () public Location(String name) ( this.name = név; ) // getterek és beállítók ) public class Előrejelzés ( private Hely helye; privát Hőmérséklet hőmérséklet; nyilvános Előrejelzés(Helyszín helye) ( this.location = location; ) public Forecast setHőmérséklet(végső Hőmérséklet hőmérséklet) ( this.temperature = hőmérséklet; return this; ) // getters )
Az előrejelzések listájának lezárásához a ServiceResponse osztály a 6. listában van megvalósítva.

Public Class ServiceResponse(privát hosszú feldolgozási idő; privát lista előrejelzések = új ArrayList<>(); public void setProcessingTime(long processingTime) ( this.processingTime = feldolgozási idő; ) public ServiceResponse előrejelzések(Lista előrejelzések) ( this.forecasts = előrejelzések; ezt adja vissza; ) // getters )
A 7. listában látható LocationResource három helymintát határoz meg a /location elérési úttal.

@Path("/location") nyilvános osztály LocationResource ( @GET @Produces(MediaType.APPLICATION_JSON) public Response getLocations() ( lista helyek = új ArrayList<>(); locations.add(new Location("London")); locations.add(new Location("Isztambul")); locations.add(new Location("Prága")); return Response.ok(new GenericEntity >(helyek)()).build(); ) )
A 8. listában látható TemperatureResource 30 és 50 közötti véletlenszerűen generált hőmérsékleti értéket ad vissza az adott helyhez. A megvalósításhoz 500 ms-os késleltetés került az érzékelő leolvasásának szimulálására.

@Path("/temperature") public class TemperatureResource ( @GET @Path("/(city)") @Produces(MediaType.APPLICATION_JSON) public Response getAverageTemperature(@PathParam("city") String cityName) ( Hőmérséklet hőmérséklet = új Temperature(); temperature.setTemperature((double) (new Random().nextInt(20) + 30)); temperature.setScale("Celsius"); try ( Thread.sleep(500); ) catch (InterruptedException figyelmen kívül hagyva) ( ignored.printStackTrace(); ) return Response.ok(temperature).build(); ) )
Először egy szinkron ForecastResource megvalósítását mutatom be (lásd a 9. listát), amely minden helyet visszaad. Ezután minden pozícióhoz felhívja a hőmérsékleti szolgáltatást, hogy megkapja az értékeket Celsius-fokban.

@Path("/forecast") nyilvános osztály ForecastResource ( @Uri("location") privát WebCél helyCél; @Uri("hőmérséklet/(város)") privát WebCél hőmérsékletCél; @GET @Produces(MediaType.APPLICATION_JSON) nyilvános válasz getLocationsWithTemperature () ( long startTime = System.currentTimeMillis(); ServiceResponse válasz = new ServiceResponse(); Lista locations = locationCél .request() .get(new GenericType >()()); forEach(location -> ( Hőmérséklet hőmérséklet = hőmérsékletCél .resolveTemplate("város", hely.getName()) .request() .get(Temperature.class); response.getForecasts().add(new Forecast(location) .setTemperature (hőfok)); )); long endTime = System.currentTimeMillis(); response.setProcessingTime(endTime - startTime); return Response.ok(response).build(); ) )
Ha az előrejelzési célállomást /forecast néven kéri, a 10. listához hasonló kimenetet kap. Vegye figyelembe, hogy a kérés feldolgozása 1,533 ms-ig tartott, ami logikus, mivel a három különböző helyről történő hőmérséklet-kérés szinkron módon 1,5 ms-t tesz ki.

( "előrejelzések": [ ( "hely": ( "név": "London" ), "hőmérséklet": ( "skála": "Celsius", "hőmérséklet": 33 ) ), ( "hely": ( "név" ": "Isztambul" ), "hőmérséklet": ( "skála": "Celsius", "hőmérséklet": 38) ), ( "hely": ( "név": "Prága" ), "hőmérséklet": ( "skála ": "Celsius", "hőmérséklet": 46 ) ) ], "feldolgozási idő": 1533 )
Eddig minden a tervek szerint halad. Itt az ideje bevezetni a reaktív programozást a szerver oldalon, ahol az összes hely beérkezése után párhuzamosan lehet hívni az egyes helyekre. Ez egyértelműen javíthatja a korábban bemutatott szinkron áramlást. Ez a 11. listában történik, amely az előrejelzési szolgáltatás reaktív verziójának meghatározását mutatja.

@Path("/reactiveForecast") nyilvános osztály ForecastReactiveResource ( @Uri("location") private WebTarget locationTarget; @Uri("hőmérséklet/(város)") privát WebCél hőmérsékletCél; @GET @Produces(MediaType.APPLICATION_JSON) public void getLocationsWithTemperature (@Suspended final AsyncResponse async) ( long startTime = System.currentTimeMillis(); // Hozzon létre egy szakaszt a CompletionStage helyeinek lekéréséhez > locationCS = locationTarget.request() .rx() .get(new GenericType >() ()); // Ha külön szakaszt hoz létre a helyek szakaszban, // a fent leírt módon, gyűjtse össze az előrejelzések listáját // mint egy nagy CompletionStage végső CompletionStage-ben > előrejelzésCS = locationCS.thenCompose(locations -> ( // Hozzon létre egy szakaszt az előrejelzések lekéréséhez // CompletionStage listaként > előrejelzési lista = // Helyszínek streamelése és mindegyik feldolgozása // külön-külön locations.stream().map(location -> ( // Hozzon létre egy lépést, hogy // csak egy város hőmérsékleti értékeit kapja meg // a neve alapján végleges CompletionStage tempCS = hőmérsékletCél .resolveTemplate("város", hely.getName()) .request() .rx() .get(Temperature.class); // Ezután hozzon létre egy CompletableFuture-t, amely // tartalmaz egy előrejelzési példányt // egy hellyel és egy hőmérsékleti értékkel. CompletableFuture.completedFuture(new Forecast(location)) .thenCombine(tempCS, Forecast::setTemperature); )).collect(Collectors.toList()); // Visszaadja az utolsó CompletableFuture példányt, ahol // az összes bemutatott befejezhető jövőbeli objektum // befejezve return CompletableFuture.allOf(forecastList.toArray(new CompletableFuture)) .thenApply(v -> forwardList.stream() .map(CompletionStage::toCompletableFuture ) .map(CompletableFuture::join) .collect(Collectors.toList())); )); // Hozzon létre egy ServiceResponse példányt, amely // tartalmazza az előrejelzések teljes listáját // a feldolgozási idővel együtt. // Hozd létre a jövőjét, és kombináld a // forwardCS-el az előrejelzések lekéréséhez // és illessze be a szolgáltatásválaszba CompletableFuture.completedFuture(new ServiceResponse()) .thenCombine(forecastCS, ServiceResponse::forecasts) .whenCompleteAsync((válasz, dobható) - > ( response.setProcessingTime(System.currentTimeMillis() - startTime); async.resume(response); )); ) )
A reaktív megvalósítás első pillantásra bonyolultnak tűnhet, de ha közelebbről megvizsgáljuk, észrevehetjük, hogy ez meglehetősen egyszerű. A ForecastReactiveResource megvalósításban először a JAX-RS Reactive Client API használatával klienshívást kezdeményezek a helyszolgáltatásokhoz. Mint fentebb említettem, ez egy kiegészítés a Java EE 8-hoz, és segít egy reaktív hívás létrehozásában egyszerűen az rx() metódussal.

Most létrehozok egy új szakaszt a hely alapján, hogy összegyűjtsem a jóslatok listáját. Előrejelzések listájaként lesznek tárolva egy nagy befejezési szakaszban, amelyet előrejelzésCS-nek neveznek. Végül egy szolgáltatáshívási választ hozok létre, csak az előrejelzésCS használatával.

Most gyűjtsük össze az előrejelzéseket az előrejelzési lista változóban meghatározott befejezési szakaszok listájaként. Az egyes előrejelzések befejezési szakaszának létrehozásához átadom a helyadatokat, majd létrehozok egy tempCS változót, ismét a JAX-RS Reactive Client API használatával, amely a város nevével hívja meg a hőmérsékleti szolgáltatást. Itt a solveTemplate() metódust használom az ügyfél felépítéséhez, és ez lehetővé teszi, hogy paraméterként átadjam a város nevét a buildernek.

A streaming utolsó lépéseként meghívom a CompletableFuture.completedFuture() függvényt, paraméterként átadva az új Forecast példányt. Ezt a jövőt kombinálom a tempCS szakaszsal, hogy meglegyen az iterált helyek hőmérsékleti értéke.

A 11. lista CompletableFuture.allOf() metódusa a befejezési szakaszok listáját előrejelzésCS-vé alakítja. Ennek a lépésnek a végrehajtása egy nagy befejezhető jövőt ad vissza, amikor az összes szállított befejezhető határidős ügylet elkészült.

A szolgáltatásválasz a ServiceResponse osztály egy példánya, ezért létrehozok egy befejezett jövőt, majd összefűzöm az előrejelzésCS befejezési szakaszt az előrejelzések listájával, és kiszámítom a szolgáltatás válaszidejét.

Természetesen a reaktív programozás csak a szerveroldalt kényszeríti aszinkron végrehajtásra; a kliens oldal addig blokkol, amíg a szerver választ nem küld a kérelmezőnek. A probléma kiküszöbölésére a Server Sent Events (SSE) segítségével részleges választ küldhet, amint az elérhető, így az egyes helyekhez tartozó hőmérsékleti értékek egyenként kerülnek elküldésre az ügyfélnek. A ForecastReactiveResource kimenete hasonló lesz a 12. listához. Amint a kimeneten látható, a feldolgozási idő 515 ms, ami az ideális végrehajtási idő a hőmérsékleti értékek egyetlen helyről történő lekéréséhez.

( "előrejelzések": [ ( "hely": ( "név": "London" ), "hőmérséklet": ( "skála": "Celsius", "hőmérséklet": 49 ) ), ( "hely": ( "név" ": "Isztambul" ), "hőmérséklet": ( "skála": "Celsius", "hőmérséklet": 32 ) ), ( "hely": ( "név": "Prága" ), "hőmérséklet": ( "skála" ": "Celsius", "hőmérséklet": 45 ) ) ], "feldolgozási idő": 515 )
Következtetés

A cikkben szereplő példákban először bemutattam egy szinkron módot az előrejelzések lekérésére a hely- és hőmérsékletszolgáltatások használatával. Ezután reaktív megközelítésre váltottam, hogy a szolgáltatáshívások között aszinkron feldolgozás történjen. Ha a JAX-RS Reactive Client API-t a Java EE 8-ban a Java 8-ban elérhető CompletionStage és CompletableFuture osztályokkal együtt használja, az aszinkron feldolgozás ereje a reaktív programozás révén szabadul fel.

A reaktív programozás több, mint egy aszinkron modell megvalósítása egy szinkronból; leegyszerűsíti az olyan fogalmakat is, mint a beágyazási szakasz. Minél gyakrabban használják, annál könnyebb lesz párhuzamos programozásban bonyolult forgatókönyvek kezelése.

Köszönöm a figyelmet. Mint mindig, most is várjuk észrevételeiket, kérdéseiteket.

Segíthetsz és utalhatsz át pénzt az oldal fejlesztésére

Ellenőrizze az információkat. Ellenőrizni kell a tények pontosságát és az ebben a cikkben bemutatott információk megbízhatóságát. Magyarázatok kellenek a vitalapon... Wikipédia

Az interaktivitás egy olyan fogalom, amely felfedi az objektumok közötti interakció jellegét és mértékét. A következő területeken használják: információelmélet, számítástechnika és programozás, távközlési rendszerek, szociológia, ipari tervezés és mások. A ... ... Wikipédiában

Ezt a cikket wikifikálni kellene. Kérjük, formázza a cikkek formázási szabályai szerint. Ennek a kifejezésnek más jelentése is van, lásd: Electromash (jelentések) ... Wikipédia

külföldi pszichoterápiás technikák- MÉLY TECHNIKÁK Aktív pszichoterápia (Reichmanntól). A lét elemzése (Binswanger). Sorselemzés (Sondi). Karakterelemzés (W. Reich). I. elemzés (H. Kohut, E. Erickson). Analitikus játékterápia (M. Klein). Családelemző terápia (Richter)…… Nagy Pszichológiai Enciklopédia

Könyvek

  • Reaktív programozás C++ nyelven. Párhuzamos és aszinkron alkalmazások tervezése, Pai Praseed, Abraham Peter. Párhuzamos és aszinkron alkalmazások tervezése az RxCpp könyvtár és a modern C ++ segítségével 17 Támogatott párhuzamos programozási eszközök Együttműködési…
  • , Nurkevich T., Christensen B.. Manapság, amikor a programok aszinkronok, és a gyors válaszadás a legfontosabb tulajdonság, a reaktív programozás segít megbízhatóbb, jobban méretezhető és gyorsabb kódot írni.…
  • Reaktív programozás RxJava, Tomas Nurkevich, Ben Christensen segítségével. Manapság, amikor a programok aszinkronok és a gyors válaszadás a legfontosabb tulajdonság, a reaktív programozás segít megbízhatóbb, jobban méretezhető és gyorsabb kódot írni.…

A reaktív programozás elvei nem új keletűek, és Jim Gray és Pat Helland tandemrendszeren a 70-es és 80-as években végzett alapművére vezethetők vissza.

Ezek az emberek jóval megelőzték korukat. Csak az elmúlt 5-10 évben volt kénytelen a technológiai ipar felülvizsgálni a meglévő "legjobb gyakorlatokat" a vállalati rendszer fejlesztése érdekében. Megtanulta alkalmazni a többmagos és felhőalapú számítástechnika mai világának reaktív elveiről szerzett ismereteit.

A reaktív rendszer alapja az üzenettovábbítás, amely időbeli határt hoz létre a komponensek között, lehetővé teszi azok időbeni leválasztását a párhuzamosság és a tér segítségével, ami elosztja a terhelést és biztosítja a mobilitást. Ez a szétválasztás a komponensek közötti teljes elszigetelés követelménye, és a rendszerek stabilitásának és rugalmasságának alapját képezi.

A reaktív programozás alapjai

Ez a programozás az információáramlásra és az adatváltozások terjedésére összpontosít. Programozási nyelvek használatakor könnyen szétválasztható a statikus és a dinamikus folyam, miközben az alapul szolgáló modell automatikusan továbbítja a változásokat az összes adatfolyamon. Egyszerűen fogalmazva, az Rx programozás, amelyet az egyik komponens bocsát ki, és az Rx könyvtárak által biztosított mögöttes struktúra, továbbítja ezeket a változtatásokat egy másik, a változtatások fogadására regisztrált összetevőre. Az Rx reaktív programozása három kulcspontból áll.

A komponensek fő funkciói:

  1. A megfigyelhető adatok nem más, mint adatfolyamok. A megfigyelhető olyan adatokat csomagol, amelyek átvihetők egyik adatfolyamból a másikba. Alapvetően rendszeres időközönként, vagy életciklusuk során csak egyszer bocsátanak ki adatokat a konfigurációk alapján. Különféle operátorok segíthetnek a megfigyelőnek bizonyos események alapján konkrét adatokat küldeni.
  2. A megfigyelők fogyasztják a megfigyelhető által kibocsátott adatfolyamot. A megfigyelők a subscribeOn() reaktív programozási módszerrel iratkoznak fel, hogy megkapják a megfigyelhető adatokhoz továbbított adatokat. Amikor egy megfigyelhető adatot küld, minden regisztrált megfigyelő megkapja az adatokat az onNext() visszahívásban. Itt különféle műveleteket hajthatnak végre, például JSON-válasz elemzését vagy a felhasználói felület frissítését. Ha hibát okoz a megfigyelhető, a megfigyelő azt az onError()-ban kapja meg.
  3. Az ütemezők (schedule) az Rx egyik összetevője, amely megmondja a megfigyelhetőnek és a megfigyelőknek, hogy melyik szálon futjanak. Az observOn() metódus segítségével megmondhatja a megfigyelőknek, hogy melyik szálon kell figyelniük. Alternatív megoldásként a schedOn() használható arra, hogy megmondja a megfigyelhetőnek, hogy melyik szálon kell futniuk.

Az RxJava-t használó reaktív programozás során az alapértelmezett magszálak, például a Schedulers.newThread() új hátteret hoz létre. A Schedulers.io() végrehajtja a kódot az I/O szálon.

Az Rx fő előnyei a számítási erőforrások fokozottabb kihasználása többmagos és többprocesszoros hardvereken, a jobb teljesítmény a pontok csökkentésével és a jobb teljesítmény a szerializációs pontok csökkentésével, az Amdahl-törvény és a Günther-féle egyetemes méretezhetőségi törvény szerint.

A második előny a fejlesztők nagy termelékenysége, mivel a hagyományos programozási paradigmák nehezen tudtak egyszerű és karbantartható megközelítést biztosítani az aszinkron és nem blokkoló számítások és IO kezeléséhez. A funkcionális reaktív programozás kezeli ezeket a feladatokat, mert általában kiküszöböli az aktív komponensek közötti explicit koordináció szükségességét.

Ahol az Rx előfordul, ott jön létre az összetevők létrehozásának folyamata és a munkafolyamatok összetétele. Az aszinkron végrehajtás előnyeinek teljes kihasználása érdekében az ellennyomás engedélyezése kritikus fontosságú a túlhasználat vagy inkább a korlátlan erőforrás-felhasználás elkerülése érdekében. Az adatáramlás állandó állapotának biztosítása érdekében a terhelésalapú ellennyomás felfelé áramló keresletet küld, és üzeneteket fogad.

Tehát a rendszer fő előnyei a következők:

  1. Megnövelt teljesítmény – köszönhetően a nagy mennyiségű adat gyors és következetes feldolgozásának.
  2. Továbbfejlesztett UX - annak a ténynek köszönhető, hogy az alkalmazás jobban reagál a felhasználóra.
  3. Egyszerűsített módosítások és frissítések – az olvashatóbb és könnyebben megjósolható kódnak köszönhetően.

De annak ellenére, hogy a reaktív programozás nagyon hasznos dolog a modern szoftverek építésénél, egy magasabb szintű rendszerről való gondolkodáshoz egy másik eszközt kell használni - a Reaktív architektúrát a reaktív rendszerek tervezésének folyamatához. Azt is fontos megjegyezni, hogy sok programozási paradigma létezik, és az Rx csak egy ezek közül, mint minden eszköz, ezt sem minden felhasználási esetre tervezték.

Reaktív rendszerstabilitás

A reziliencia a meghibásodásokra való reagálás, és a rendszer veleszületett funkcionális tulajdonsága. Fejlesztésre szorul, nem csak visszamenőleges kiegészítésre a rendszerhez. A reaktív javascript programozás ellenálló képessége túlmutat a hibatűrésen, és nem a degradációnak köszönhető, hanem meghibásodás esetén teljesen ki tudja javítani magát.

Ez megköveteli a komponensek elkülönítését és a hibaelhárítást, hogy elkerülhető legyen a meghibásodások átterjedése a szomszédos komponensekre, ami katasztrofális, lépcsőzetes meghibásodási forgatókönyvekhez vezethet. Így a rugalmas rendszerek felépítésének kulcsa az, hogy üzenetként jellemezhetők más összetevőknek, amelyek felügyelőként működnek, és a hibás komponensen kívüli biztonságos környezetből kezelhetők.

Itt, mivel üzenetvezérelt, ezek a létesítmények távolodnak a szorosan összekapcsolt, törékeny, mélyen egymásba ágyazott szinkron hívásláncoktól, amelyeket többnyire figyelmen kívül hagynak. Az ötlet az, hogy a hibakezelést leválasztják a hívásláncról, például úgy, hogy felszabadítják a klienst a szerverhibák kezelésének felelőssége alól.

Mivel a legtöbb rendszer eredendően összetett, az egyik legfontosabb szempont annak biztosítása, hogy a rendszerarchitektúra minimális teljesítménycsökkenést biztosítson mind a fejlesztés, mind a komponensek karbantartása során, ugyanakkor minimálisra csökkenti a véletlenszerű bonyolultságot. Ez azért fontos, mert a rendszer életciklusa során, ha nem megfelelően van megtervezve, egyre nehezebb lesz működésben tartani, és több időre és erőfeszítésre lesz szükség a megértéshez a problémák elkülönítése és kijavítása érdekében.

A reaktív rendszerek jelentik a legproduktívabb rendszerarchitektúrát a többmagos, felhő- és mobilarchitektúrák összefüggésében:

  1. A hibaleválasztás válaszfalakat kínál az alkatrészek között, megelőzve a lépcsőzetes meghibásodásokat, és korlátozva a hibák terjedelmét és súlyosságát.
  2. A felügyelői hierarchiák több szintű védelmet kínálnak öngyógyító képességekkel kombinálva, ami kiküszöböli a működési költségek sok átmeneti meghibásodását.
  3. Az üzenetek átugrása és a hely átláthatósága lehetővé teszi az összetevők letiltását és cseréjét anélkül, hogy ez befolyásolná a végfelhasználói élményt. Ez csökkenti a hibák költségeit, viszonylagos sürgősségét, valamint a diagnosztizálásukhoz és javításukhoz szükséges erőforrásokat.
  4. A replikáció csökkenti az adatvesztés kockázatát, és csökkenti a meghibásodások hatását az információ-visszakeresés és -tárolás elérhetőségére.
  5. A rugalmasság lehetővé teszi az erőforrások megtakarítását a felhasználás ingadozása esetén, minimálisra csökkentve a működési költségeket alacsony terhelés mellett, valamint a meghibásodás kockázatát vagy a skálázhatóságba való sürgős beruházást a terhelés növekedésével.

A webes alkalmazások nagy hasznot húzhatnak az Rx fejlesztési stílusból, amely lehetővé teszi olyan kérés-válasz munkafolyamatok összeállítását, amelyek magukban foglalják a szolgáltatáshívásokba való elágazást, az aszinkron erőforrás-lekérést és a válaszok összeállítását, valamint az ezt követő rendezést az ügyfél számára. A közelmúltban a push-to-server események és webes socketek egyre elterjedtebbek a gyakorlatban, és ennek nagyarányú végrehajtásához sok nyitott kapcsolat hatékony tárolására van szükség, ahol az IO nem blokkol.

Vannak erre eszközök, például a Streams és Futures, amelyek megkönnyítik a nem blokkoló és aszinkron konverziót, és eljuttatják azokat a kliensekhez. Data Access Layer Reactive Programming – Frissíti és lekérdezi az adatokat egy hatékony erőforrásban, lehetőleg SQL vagy NoSQL adatbázisok használatával aszinkron illesztőprogramokkal.

A webalkalmazások számára előnyös az is, ha reaktív rendszert fejlesztenek ki olyan dolgokhoz, mint az elosztott gyorsítótárazás, az adatok konzisztenciája és a több csomópontos értesítések. A hagyományos webes alkalmazások általában álló csomópontokat használnak. De amint a programozók elkezdik használni a Server-Sent-Events (SSE) és a WebSockets szolgáltatást, ezek a csomópontok működésbe lépnek, mert legalább fenntartják a kliens kapcsolat állapotát, és ennek megfelelően push értesítéseket küldenek nekik. Ehhez egy reaktív rendszer kialakítása szükséges, mivel ez az a terület, ahol fontos a címzettek megszólítása üzenetküldéssel.

A Java reaktív programozás lényege

Reaktív rendszerekben nem kötelező az Rx használata. Mert az Rx programozás és a reaktív rendszerek nem ugyanaz. Bár gyakran felcserélhetően használják őket, nem pontos szinonimák, és különböző dolgokat tükröznek. A rendszerek a „reaktivitás” következő szintjét képviselik. Ez a szint olyan konkrét tervezési és építészeti döntéseket foglal magában, amelyek lehetővé teszik robusztus és rugalmas alkalmazások létrehozását.

Egy nagyon jó ötlet - a módszerek kombinációja - azonban még több hasznot hoz az alkalmazások számára, mivel még jobban összekapcsolódik, hatékonyabb erőforrás-felhasználást tesz lehetővé, és alacsonyabb késleltetést biztosít. Ha hatalmas adatmennyiségről vagy többfeladatos munkavégzésről van szó, gyakran aszinkron feldolgozásra van szükség ahhoz, hogy a rendszerek gyorsak és érzékenyek legyenek.

A Java, a régi objektum-orientált programozás öröksége, az aszinkron nagyon bonyolulttá válhat, és megnehezítheti a kód megértését és karbantartását. Így az Rx különösen hasznos ebben a "tisztán" objektum-orientált környezetben, mert megkönnyíti az aszinkron szálakkal való munkát.

Legújabb kiadásaival, a Java 8-tól kezdve, maga a Java is tett néhány kísérletet a natív reaktivitás megvalósítására, de ezek a próbálkozások manapság nem túl népszerűek a fejlesztők körében. Vannak azonban olyan élő és rendszeresen frissített, harmadik féltől származó implementációk a reaktív Java programozáshoz, amelyek megmenthetik a helyzetet, és ezért különösen nagyra értékelik a Java fejlesztők.

Egy tipikus alkalmazásban gyakori, hogy ismételten végrehajtanak néhány reaktív programozási műveletet az RxJava használatával, ezért össze kell hasonlítania a sebességet, a CPU- és a memóriahasználatot ugyanazokkal a műveletekkel, amelyeket a Kotlin korutinokkal és az RxJava-val is megvalósítottak. Ez egy kezdeti teljesítményteszt.

Valahányszor olyan új eszközt alkalmaznak, amelyet széles körben használnak a kódban, fontos megérteni, hogy ez befolyásolja-e az alkalmazás általános teljesítményét, mielőtt eldöntené, hogy érdemes-e használni. A használati gyakorlat megadja a rövid választ: a legtöbb esetben a felhasználóknak meg kell fontolniuk az RxJava Kotlin korutinokra való cseréjét, különösen Androidban.

Az RxJava segítségével történő reaktív programozás továbbra is korlátozott számú esetben használható, és ezekben az esetekben az RxJava és a korutinok keverhetők.

Egyszerű okok:

  1. Sokkal nagyobb rugalmasságot biztosítanak, mint a hagyományos Rx.
  2. Gazdag operátorkészletet biztosít a gyűjteményekhez, amelyek ugyanúgy néznek ki, mint az RxJava operátorok esetében.
  3. A Kotlin reaktív programozása szükség esetén interakcióba léphet az rxjava használatával.
  4. Nagyon könnyűek és hatékonyak, tekintettel a nagyobb CPU-használatra az RxJava által létrehozott összes objektumból származó szemétgyűjtéshez.

Reaktív kiterjesztések

A Reactive Extensions (ReactiveX vagy RX) egy olyan könyvtár, amely az Rx elveit követi, azaz aszinkron és esemény alapú programokat állít össze egy megfigyelhető szekvencia segítségével. Ezek a könyvtárak számos interfészt és módszert kínálnak, amelyek segítenek a fejlesztőknek tiszta és egyszerű kód írásában.

A reaktív kiterjesztések több nyelven is elérhetők. A programozókat különösen érdekli az RxJava és az RxAndroid, mivel az android a leginkább fókuszált terület.

Az RxJava használatával történő reaktív programozás a Netflix Java Reactive Extension megvalósítása. Alapvetően ez egy olyan könyvtár, amely megfigyelői mintát követve aszinkron eseményeket állít össze.

Lehetőség van aszinkron forgalom létrehozására, átalakítására és a megfigyelő által történő felhasználására különböző adatfolyamokban. A könyvtár lenyűgöző operátorok széles skáláját kínálja, például térképet, csatlakozást és szűrőt, amelyek alkalmazhatók az adatfolyamra. Ahogy a programozó tényleges kódpéldákat kezd használni, többet fog megtudni az operátorokról és a konverziókról.

Többszálú megoldás az Android alkalmazásokban

Android" class="if uuid-2938324" src="/misc/i/gallery/73564/2938324.jpg" />

Az Android Reactive Programming (RxAndroid) kifejezetten az Android platformra vonatkozik, néhány hozzáadott osztállyal az RxJava tetején. Pontosabban, az ütemezőket az RxAndroidban vezették be (AndroidSchedulers.mainThread()), amely fontos szerepet játszik az Android alkalmazások többszálas koncepciójának támogatásában.

A szakértők többek között csak az RxJava könyvtár használatát tanácsolják. Még az Android programozásban használt nagyszámú ütemezőnek köszönhetően is.

Az alábbiakban az ütemezők listája és azok összefoglalása látható:

  1. Schedulers.io() – Nem intenzív műveletek, például hálózati hívások, lemez-/fájlolvasások, adatbázis-műveletek végrehajtására szolgál, és szálkészletet tart fenn.
  2. AndroidSchedulers.mainThread() – Hozzáférést biztosít a fő Thread/UI témához. Általában a műveletek ebben a szálban zajlanak, mint például a felhasználói felület frissítése, interakció a felhasználóval. A szakértők azt tanácsolják a felhasználóknak, hogy ne végezzenek intenzív műveleteket ezen az adatfolyamon, mert ez az alkalmazás összeomlását vagy ANR párbeszédpanelt okozhat.
  3. Schedulers.newThread() - Ennek használatával minden alkalommal új szál jön létre, amikor egy feladat ütemezve van. Általában azt javasolják, hogy ne használja az ütemezést nagyon hosszú munkákhoz. A newThread() segítségével létrehozott szálak nem lesznek újra felhasználva.
  4. Schedulers.computation() - Ez az ütemezés használható CPU-igényes műveletek végrehajtására, a reaktív programozóközpont hatalmas adatainak feldolgozására, bittérképek feldolgozására. Az ütemezővel létrehozott szálak száma teljes mértékben a rendelkezésre álló CPU magok számától függ.
  5. Schedulers.single() - Ez az ütemező az összes feladatot a következő sorrendben hajtja végre, amely akkor használható, ha szekvenciális végrehajtásra van szükség.
  6. Schedulers.immediate() – Ez az ütemező azonnal végrehajtja a feladatot a fő szál szinkron blokkolásával.
  7. Schedulers.trampoline() - A feladatokat First In-First Out módban futtatja. Az összes ütemezett feladat egymás után fut, a háttérszálak számát egyre korlátozva.
  8. Schedulers.from () - lehetővé teszi ütemező létrehozását egy végrehajtóból, korlátozva a létrehozott szálak számát. Amikor a szálkészlet foglalt, a feladatok sorba kerülnek.

Most, hogy jó háttérrel rendelkezik az RxJava és az RxAndroid területén, áttérhet néhány kódpéldára, hogy jobban megértse a koncepciót. A kezdéshez hozzá kell adnia az RxJava és RxAndroid függőséget a build.gradle projektekhez, és szinkronizálnia kell a projektet.

Programozás.

A Megfigyelő előfizetett egy megfigyelhetőre, így két módszerrel kezdheti meg az adatok fogadását:

  1. SubscribeOn(Schedulers.io()) – Megmondja a megfigyelhetőnek, hogy indítson el egy feladatot egy háttérszálon.
  2. ObservOn(AndroidSchedulers.mainThread()) – Megmondja a megfigyelőnek, hogy adatokat fogadjon az Android UI szálon.

Ez minden, így a programozó megírhatja első reaktív programozó programját az RxJava segítségével.

A vállalatok és a köztesszoftver-szállítók elkezdték használni a Reactive-ot, és 2016-2018-ban óriási mértékben megnőtt a vállalati érdeklődés e paradigma elfogadása iránt.

Az Rx a fejlesztői teljesítményt nyújtja a komponens szintű erőforrás-hatékonyság révén a belső logika és az adatfolyam-átalakításhoz, míg a reaktív rendszerek teljesítményt nyújtanak az építészek és a DevOps számára a rendszerszintű rugalmasság és rugalmasság révén. Ezeket a „Cloud Native” és más nagyméretű elosztott rendszerek létrehozására használják. A gyakorlatban a Java reaktív programozási könyveket is széles körben használják olyan módszerekkel, amelyek lehetővé teszik a reaktív rendszertervezés elveinek kombinálását.



Betöltés...
Top