Reaktivno programiranje: koncepti, usposabljanje, funkcije in strokovni nasveti

Načela reaktivnega programiranja niso nova in jih je mogoče zaslediti od 70. in 80. let v glavnih delih Jim Greyja in Peteja Hellanda s tandemskim sistemom.

Ti ljudje so daleč pred svojim časom. Samo v zadnjih 5-10 letih je bila tehnološka industrija prisiljena ponovno pretehtati obstoječe "najboljše prakse" za razvoj korporativnega sistema. Naučila se je uporabljati znanje o reaktivnih principih današnjega sveta multi-core in cloud computing. Osnova za reaktivni sistem je prenos sporočil, ki ustvarja začasno mejo med komponentami, omogoča njihovo pravočasno reševanje z uporabo vzporednosti in prostora, ki porazdeli obremenitev in zagotavlja mobilnost. Ta povezava je pogoj za popolno izolacijo med komponentami in je osnova za stabilnost in elastičnost sistemov.


Osnove reaktivnega programiranja

To programiranje je namenjeno pretakanju informacij in distribuciji sprememb podatkov. Pri uporabi programskih jezikov je enostavno dodeliti statične in dinamične tokove, osnovni model pa samodejno razširi spremembe skozi vse podatkovne tokove. Preprosto povedano, programski tokovi Rx, ki jih proizvede ena komponenta, kot tudi osnovna struktura, ki jo zagotavljajo knjižnice Rx, bodo te spremembe razdelili na drugo komponento, registrirano za prejem teh sprememb. Reaktivno programiranje Rx je sestavljeno iz treh ključnih točk.
Glavne funkcije komponent:
  • Opazovanja niso nič drugega kot tokovi podatkov. Monitor shranjuje podatke, ki se lahko prenašajo iz enega toka v drugega. V osnovi proizvajajo podatke periodično ali samo enkrat v svojem življenjskem ciklu na podlagi konfiguracij. Obstajajo različni operaterji, ki lahko opazovalcu pomagajo poslati nekatere specifične podatke na podlagi določenih dogodkov.
  • Opazovalci porabijo tok, ki ga oddajajo opazovalci. Opazovalci se prijavijo z metodo reaktivnega programiranja subscribeOn (), da prejmejo podatke, ki jih posredujejo opazovalci. Kadarkoli se prenašajo podatki, vsi registrirani opazovalci prejmejo podatke v povratnem klicu naNext (). Tukaj lahko izvajajo različne operacije, kot so razčlenjevanje JSON odziva ali posodabljanje vmesnika. Če pride do napake zaradi opazovanja, jo opazovalec dobi v onerror ().
  • Razporejevalnik (Urnik) je komponenta v programu Rx, ki opazovalcem in opazovalcem pove, s kakšnega toka naj delujejo. Uporabite lahko metodo observOn (), da opazovalcem povejte, kateri tok naj opazujejo. Poleg tega lahko uporabite schedOn () za poročanje opazovanega toka, v katerem naj se zaženejo.
  • V jet programiranju z uporabo RxJave privzete glavne niti, kot so Schedulers.newThread (), ustvarijo novo ozadje. Schedulers.io () bo izvajal kodo v toku V /I.


    Prednosti in omejitve metode

    Glavne koristi Rx so povečana uporabaračunalniški viri za večjedrno in večprocesorsko strojno opremo, povečana produktivnost z rezanjem točk in povečanje produktivnosti z zmanjšanjem serijskih točk, v skladu z zakonom Amdahl in zakonom o univerzalni Gunther skalabilnosti. Druga prednost je visoka zmogljivost za razvijalce, saj so tradicionalne paradigme programiranja težko zagotavljale enostaven in podprt pristop tako za asinhrono kot za ne-blokiranje računalništva in IO. Funkcionalno reaktivno programiranje obravnava te naloge, ker ponavadi odpravlja potrebo po jasnem usklajevanju med aktivnimi komponentami.
    Kadar se pojavlja Rx, se ustvari proces ustvarjanja komponent in poteka dela. Da bi v celoti izkoristili asinhrono izvedbo, je vključitev nasprotnih zadetkov ključnega pomena, da bi se izognili pretirani uporabi ali neomejeni porabi sredstev. Da bi zagotovili stabilno stanje v smislu pretoka podatkov, povratni tlak na osnovi obremenitve pošlje navzgor pretok povpraševanja in sprejema sporočila. Glavne prednosti sistema so:
  • izboljšana zmogljivost - zahvaljujoč zmožnosti hitre in stabilne obdelave velikih količin podatkov.
  • Izboljšan UX - Ker je aplikacija bolj odzivna na uporabnika.
  • Poenostavljene spremembe in posodobitve - zahvaljujoč berljivi in ​​lažji napovedi kode.
  • Kljub dejstvu, da je Reactive Programming - zelo uporabna stvar pri ustvarjanjusodobne programske opreme, da bi razmišljali o sistemu na višji ravni, morate uporabiti drugo orodje - Reaktivno arhitekturo za proces oblikovanja reaktivnih sistemov. Poleg tega je pomembno vedeti, da obstaja veliko programskih paradigem, in Rx je samo eden izmed njih, tako kot vsako orodje, ni namenjen za vse primere uporabe.

    Stabilnost reaktivnih sistemov

    Stabilnost je občutljivost v primeru okvare in je integralna funkcionalna lastnost sistema. Zahteva razvoj, ne le dodajanje sistema v retroaktivni obliki. Stabilnost reaktivnega programiranja javascript presega toleranco napak in to ni posledica degradacije, v primeru okvare pa se lahko popolnoma popravi. To zahteva izolacijo in zadrževanje komponent, da bi se izognili trčenju, ki se razširi na sosednje komponente, kar lahko privede do katastrofalnih scenarijev s kaskadnimi zlomi. Zato je ključ do ustvarjanja odpornih sistemov - samoobnavljanje - to, da jih lahko opišemo kot sporočila, poslana drugim komponentam, ki delujejo kot nadzorniki, in jih upravljamo iz varnega konteksta, ki ni vključen v zavrnjeni del. Ta sredstva, ki so vodena sporočila, se izločijo iz močno povezanih, krhkih, globoko vgrajenih sinhronih verig klicev, ki se v večini primerov ne upoštevajo. Ideja je ločiti upravljanje neuspelih povratnih klicev, na primer z osvoboditvijo odjemalca iz odgovornosti za obdelavo okvar strežnika.

    Izvedba sistemske arhitekture

    Ker je večina sistemov sama po sebi zapletena, je eden od najpomembnejših vidikov zagotoviti, da sistemska arhitektura zagotavlja minimalno zmanjšanje zmogljivosti, tako pri načrtovanju kot tudi vzdrževanju komponent, hkrati pa zmanjša naključno kompleksnost na minimum. To je pomembno, saj bo v celotnem življenjskem krogu sistema, če ni ustrezno zasnovan, težje in težje vzdrževati učinkovitost, zato bo potrebno vedno več časa in truda, da se razumejo in odpravijo težave. Reaktivni sistemi so najbolj produktivna sistemska arhitektura v kontekstu večjedrnih, oblačnih in mobilnih arhitektur:
  • Izolacija napak ponuja preklapljanje med komponentami, kar preprečuje neuspeh kaskade in omejuje obseg in stopnjo napak.
  • Hierarhija nadzornikov ponuja več ravni zaščite v kombinaciji z zmožnostjo samozdravljenja, kar odpravlja številne začasne opustitve stroškov poslovanja za preiskavo.
  • Spuščanje prenosa sporočil in preglednost lokacije omogočata onemogočanje in zamenjavo komponent brez vpliva na delo končnega uporabnika. To zmanjšuje stroške okvar, njihov relativni pomen, pa tudi sredstva, potrebna za diagnozo in popravek.
  • Replikacija zmanjšuje tveganje izgube podatkov in zmanjšuje vpliv napake na razpoložljivost iskanja in shranjevanja informacij.
  • Elastičnost omogoča shranjevanje virov, kot jeuporaba se spreminja, kar zmanjšuje obratovalne stroške med nakladanjem in tveganje okvar ali nujne naložbe v razširljivost ob povečanju obremenitve.
  • Razmerje do tradicionalnih spletnih aplikacij

    Spletne aplikacije lahko v veliki meri izkoristijo razvojni slog Rx-a, ki vam omogoča sestavljanje delovnih procesov poizvedbe-odziva, ki vključujejo razvejanje za servisne klice, asinhrono pridobivanje virov in generiranje odziva ter nato razvrščanje za odjemalca. V zadnjem času so se dogodki push-and-server in spletne vtičnice v praksi vse bolj uporabljali in za to potrebujete učinkovit način za shranjevanje številnih odprtih povezav in kjer IO ne blokira.
    Za to obstajajo orodja, kot so Streams and Futures, ki omogočajo preproste neblokirajoče in asinhrone transformacije ter jih potisnejo k strankam. Reaktivno programiranje z dostopom do podatkov - posodablja in zahteva v učinkovit vir, predvsem z uporabo podatkovnih baz SQL ali NoSQL z asinhronimi gonilniki. Spletne aplikacije imajo tudi koristi od razvoja jet sistema za stvari, kot so porazdeljeno predpomnjenje, skladnost podatkov in sporočanje z več vozlišči. Tradicionalne spletne aplikacije običajno uporabljajo vozlišča. Toda takoj, ko programerji začnejo uporabljati strežniško-poslane dogodke (SSE) in WebSockets, postanejo ta vozlišča operativna, saj vsaj podpirajo stanje povezave odjemalca, zato so jim poslana tudi sporočila. Za to je potreben razvoj reaktivnega sistemaTo je področje, kjer je obravnavanje prejemnikov pomembno prek sporočanja.

    Bistvo java reaktivnega programiranja

    Rx v jet-sistemih ni potrebno uporabljati. Ker programiranje Rx in reaktivni sistemi niso enaki. Čeprav pogosto uporabljajo zamenljive izraze, niso natančne sopomenke in odražajo različne stvari. Sistemi predstavljajo naslednjo stopnjo "reaktivnosti". Ta raven vključuje posebne oblikovalske in arhitekturne rešitve, ki vam omogočajo ustvarjanje robustnih in prilagodljivih aplikacij. Kljub temu zelo dobra ideja - kombinacija metod - prinaša še več koristi aplikacijam, saj jih še bolj povezuje, omogoča učinkovitejšo uporabo virov in zagotavlja manjšo zamudo. Ko gre za ogromne količine podatkov ali večopravilnost, je za asinhrono obdelavo pogosto potrebno hitro in odzivno delovanje. V Javi, predstavniku starega objektno usmerjenega programiranja, lahko asinhronost postane resnično zapletena in jo je težko razumeti in podpreti. Tako je Rx še posebej uporaben za to čisto objektno usmerjeno okolje, saj poenostavlja delovanje asinhronih tokov. S svojimi najnovejšimi izdajami, ki se začenjajo s samim Java 8, je Java naredila nekaj poskusov za implementacijo vgrajene reaktivnosti, vendar ti poskusi danes niso zelo priljubljeni pri razvijalcih. Vendar pa obstajajo nekatere žive in redno posodobljene izvedbe tretjih oseb za reaktivno programiranje Java, ki pomagajo rešiti dan in jih zato še posebej cenijo razvijalci Java.

    Kotlin: Začetni preskus učinkovitosti

    V običajnih aplikacijah Android programerji redno izvajajo nekatere operacije reaktivnega programiranja z uporabo RxJave, zato je treba primerjati hitrost, porabo procesorja in pomnilnik z enakimi operacijami, ki so bile izvedene z obema kotlinskima programoma in RxJava. To je začetni preskus zmogljivosti. Kadar koli uporabljate novo orodje, ki se pogosto uporablja v celotni kodi, je pomembno razumeti, ali bo to vplivalo na splošno učinkovitost programa, preden se odločite, kako smotrno ga je uporabiti. Uporabna praksa daje kratek odgovor: v večini primerov bi morali uporabniki razmisliti o zamenjavi RxJave z Kotlinom, zlasti na Androidu. Programiranje junkije RxJava se lahko uporablja v omejenem številu primerov, v teh primerih pa lahko mešate oba RxJava in so-programe. Preprosti vzroki:
  • Zagotoviti veliko več prožnosti kot običajno Rx.
  • Zagotavlja bogat nabor operaterjev v zbirkah, ki so podobni kot pri operaterjih RxJava.
  • Kotlinovo reaktivno programiranje lahko po potrebi sodeluje z rxjava.
  • So zelo lahke in učinkovite, ob upoštevanju višje ravni uporabe CPE za zbiranje smeti iz vseh objektov, ki jih je ustvarila RxJava.
  • Reaktivne razširitve

    Reaktivne razširitve (ReactiveX ali RX) je knjižnica, ki sledi načelom Rx, to je sestavljanju asinhronih in programskih dogodkov z uporaboopazovano zaporedje. Te knjižnice nudijo veliko vmesnikov in metod, ki pomagajo razvijalcem pisati čisto in preprosto kodo. Reaktivne razširitve so na voljo v več jezikih. Programerji so še posebej zainteresirani za RxJava in RxAndroid, saj je android najbolj osredotočeno področje. Jet programiranje z uporabo RxJave je implementacija reaktivne razširitve Java iz Netflixa. To je v bistvu knjižnica, ki je asinhrona in opazuje vzorec opazovalca. Ustvarite lahko asinhroni promet, ga pretvorite in porabite kot opazovalca v različnih podatkovnih tokovih. Knjižnica ponuja širok spekter neverjetnih operaterjev, kot so zemljevid, povezava in filter, ki jih lahko uporabite v toku podatkov. Ko programer začne uporabljati dejanske primere kode, izve več o operaterjih in pretvorbah.

    Multithreading v aplikacijah Android

    Android Android aplikacija za Android (Android) class = "if uuid-2938324" src = "/misc /i /gallery /73564 /2938324.jpg" /Random programiranje za Android (RxAndroid) RxJava je nekaj dodanih razredov, natančneje, razporejevalniki so predstavljeni v RxAndroid (AndroidSchedulers.mainThread ()), ki igra pomembno vlogo pri podpiranju večnitnega koncepta v aplikacijah Android. , ki se uporablja pri programiranju za Android za načrtovalce in njihov povzetek:
  • Schedulers.io () - neyntensyvnыh uporablja za opravljanje dejavnosti, kot so internetne klice, branje diskov/datoteke, operacije baze podatkov, ki podpirajo zbirke niti.
  • AndroidSchedulers.mainThread () - omogoča dostop do glavne niti Thread /UI. Značilno so operacije v tej niti, kot je na primer posodabljanje vmesnika za interakcijo z uporabnikom. Strokovnjaki svetujejo uporabnikom, da na tej niti ne smejo izvajati nobenih intenzivnih operacij, saj lahko to povzroči programski met ali ANR dialog.
  • Schedulers.newThread (), ki uporablja to, bo ustvarjena nova nit vsakič, ko bo načrtovana naloga. Običajno se priporoča, da se ne uporablja časovni razpored za dolgo delo. Niti, ustvarjene z uporabo funkcije newThread (), ne bodo ponovno uporabljene.
  • Schedulers.computation () - Ta graf se lahko uporablja za izvajanje intenzivnih operacij s procesorjem, za obdelavo ogromnih podatkov središča reaktivnega programiranja, za obdelavo rastrskih slik. Število niti, ustvarjenih z uporabo tega razporejevalnika, je v celoti odvisno od števila razpoložljivih CPU jeder.
  • Schedulers.single () - ta načrtovalec bo izvajal vse naloge v vrstnem redu, ki ga je mogoče uporabiti, ko je potrebna potreba po zaporedni izvedbi.
  • Schedulers.immediate () - Ta načrtovalec opravlja naloge takoj, medtem ko blokira glavni tok.
  • Schedulers.trampoline () - opravi nalogo v načinu prvega prvega izhoda. Vse načrtovane naloge bodo izvedene ena za drugo, kar bo omejilo število tokov ozadja na eno.
  • Schedulers.from () - omogoča ustvarjanje razporejevalnika iz izvajalca, ki omejuje število ustvarjenih tokov. Ko je skupina tokov zasedena, bo nalogav čakalno vrsto.
  • Osnovni primeri RxJave

    Zdaj, ko obstajajo dobra teoretična znanja o RxJavi in ​​RxAndroid, si lahko ogledate nekaj primerov kod, da bi bolje razumeli koncept. Če želite začeti, morate graditi odvisnosti RxJava in RxAndroid za izdelavo .gradle in sinhronizirati projekt. Glavne faze.
    Programiranje.
    Opazovalec vas podpira, da lahko začne prejemati podatke na dva načina:
  • SubscribeOn (Schedulers.io ()) - vam pove, da zaženete nalogo v toku v ozadju.
  • ObservOn (AndroidSchedulers.mainThread ()) - Določi Observer za pridobivanje podatkov v toku uporabniškega vmesnika Android.
  • To je vse, zato bo programer lahko napisal svoj prvi program reaktivnega programiranja z RxJavo. Podjetja in dobavitelji vmesne programske opreme so začeli uporabljati Reactive, v letu 2016 -2018 pa je prišlo do velike rasti korporativnega interesa za sprejetje te paradigme. Rx ponuja razvijalce s pomočjo učinkovite rabe virov na ravni komponent za notranjo logiko in transformacijo pretoka podatkov, medtem ko reaktivni sistemi zagotavljajo zmogljivost za arhitekte in DevOps, zaradi stabilnosti in elastičnosti na ravni sistema. Uporabljajo se za ustvarjanje Cloud Native in drugih velikih distribuiranih sistemov. V praksi se knjige o reaktivnem programiranju Jave uporabljajo tudi z metodami, ki omogočajo združevanje načel oblikovanja reaktivnih sistemov.

    Sorodne publikacije