Reaktivno programiranje: koncepti, trening, značajke i stručni savjeti

Principi reaktivnog programiranja nisu novi, a mogu se pratiti od 70-ih i 80-ih godina u glavnim djelima Jim Gray-a i Pete Hellanda s tandem sustavom.

Ti ljudi su daleko ispred svog vremena. Tek u posljednjih 5-10 godina tehnološka industrija bila je prisiljena preispitati postojeće "najbolje prakse" za razvoj korporativnog sustava. Naučila je primijeniti znanje o reaktivnim principima današnjeg svijeta multi-core i cloud computing-a. Osnova za reaktivni sustav je prijenos poruka, koji stvara privremenu granicu između komponenti, omogućuje im da se riješe u vremenu, koristeći paralelizam i prostor koji distribuira opterećenje i osigurava mobilnost. Ova međusobna povezanost je uvjet za potpunu izolaciju između komponenti i čini osnovu za stabilnost i elastičnost sustava.


Osnove reaktivnog programiranja

Ovo programiranje je usmjereno na prijenos informacija i distribuciju promjena podataka. Kada se koriste programski jezici, lako je alocirati statičke i dinamičke tokove, dok osnovni model automatski proširuje promjene kroz sve podatkovne tokove. Jednostavnim riječima, Rx programski tokovi koje proizvodi jedna komponenta, kao i osnovna struktura koju pružaju Rx knjižnice, distribuirat će te promjene drugoj komponenti registriranoj za primanje tih promjena. Reaktivno programiranje Rx-a sastoji se od tri ključne točke.
Glavne funkcije komponenti:
  • Opažanja nisu ništa drugo nego tokovi podataka. Monitor sprema podatke koji se mogu prenijeti iz jednog toka u drugi. Oni u osnovi proizvode podatke povremeno ili samo jednom u svom životnom ciklusu na temelju konfiguracija. Postoje različiti operatori koji mogu pomoći promatraču da pošalje određene podatke na temelju određenih događaja.
  • Promatrači konzumiraju struju koju emitiraju promatrači. Promatrači se prijavljuju koristeći metodu reaktivnog programiranja subscribeOn () kako bi primili podatke koje promatrači prenose. Kad god se prenose podaci, svi registrirani promatrači primaju podatke u povratnom pozivu naNext (). Ovdje se mogu izvoditi različite operacije, kao što su raščlanjivanje JSON odgovora ili ažuriranje sučelja. Ako dođe do pogreške uslijed promatranja, promatrač će je dobiti u onerror ().
  • Planer (Raspored) je komponenta u Rx-u koja govori promatračima i promatračima iz kojeg toka treba raditi. Možete upotrijebiti metodu observOn () koja će promatračima reći koji tok treba promatrati. Osim toga, možete koristiti schedOn () za prijavu promatranog toka u kojem bi trebali biti pokrenuti.
  • U jet programiranju pomoću RxJave, zadane glavne niti, kao što su Schedulers.newThread (), stvaraju novu pozadinu. Schedulers.io () izvršit će kôd u I /O streamu.


    Prednosti i ograničenja metode

    Glavne prednosti Rx-a su povećana uporabaračunalnim resursima za multi-core i multiprocesorski hardver, povećanu produktivnost rezanjem točaka i povećanje produktivnosti smanjenjem bodova serijalizacije, u skladu s Amdahlovim zakonom i univerzalnim zakonom o skalabilnosti Gunther. Druga prednost je visoka učinkovitost za programere, budući da su tradicionalne paradigme programiranja nastojale pružiti jednostavan i podržan pristup asinkronim i neblokirajućim računalima i IO-u. Funkcionalno reaktivno programiranje rješava ove zadatke jer obično eliminira potrebu za jasnom koordinacijom između aktivnih komponenti.
    Gdje se pojavljuje Rx, stvara se proces stvaranja komponenti i tijeka rada. Kako bi se u potpunosti iskoristilo asinkrono izvršavanje, uključivanje protu-hitova je ključno kako bi se izbjeglo prekomjerno korištenje ili radije neograničena potrošnja resursa. Da bi se osiguralo stabilno stanje u smislu protoka podataka, povratni tlak temeljen na opterećenju šalje uzlazni tok potražnje i prima poruke. Stoga su glavne prednosti sustava:
  • Poboljšane performanse - zahvaljujući sposobnosti brzog i stabilnog obrađivanja velikih količina podataka.
  • Poboljšani UX - Budući da je aplikacija osjetljivija na korisnika.
  • Pojednostavljene izmjene i nadogradnje - zahvaljujući čitljivom i lakšem predviđanju koda.
  • Ali unatoč činjenici da Reaktivno programiranje - vrlo korisna stvar pri stvaranjumodernog softvera, da bi razmišljali o sustavu na višoj razini, morate koristiti drugi alat - Reaktivnu arhitekturu za proces dizajniranja reaktivnih sustava. Osim toga, važno je zapamtiti da postoji mnogo programskih paradigmi, a Rx je samo jedan od njih, baš kao i bilo koji alat, nije namijenjen svim slučajevima uporabe.

    Stabilnost reaktivnih sustava

    Stabilnost je osjetljivost u slučaju kvara i predstavlja integralno funkcionalno svojstvo sustava. To zahtijeva razvoj, a ne samo dodavanje sustava u retroaktivnom obliku. Stabilnost reaktivnog programiranja javascripta nadilazi toleranciju grešaka i to nije zbog degradacije, ali u slučaju kvara može se potpuno ispraviti. To zahtijeva izolaciju komponenti i neuspjeh zadržavanja kako bi se izbjegli sudari koji se šire na susjedne komponente, što može dovesti do katastrofalnih scenarija s kaskadnim padovima. Stoga je ključ za stvaranje otpornih sustava - samopopravak to što se mogu opisati kao poruke poslane drugim komponentama koje djeluju kao nadzornici i kojima se upravlja iz sigurnog konteksta izvan odbačene komponente. Ovdje, kao vođene poruke, ta sredstva odlaze iz snažno povezanih, krhkih, duboko ukorijenjenih sinkronih lanaca poziva, koji se u većini slučajeva zanemaruju. Ideja je odvojiti upravljanje neuspjehima povratnog poziva, na primjer, oslobađanjem klijenta od odgovornosti za obradu kvarova poslužitelja.

    Izvedba arhitekture sustava

    Budući da je većina sustava inherentno složena, jedan od najvažnijih aspekata je osigurati da arhitektura sustava osigurava minimalno smanjenje performansi, kako u dizajnu tako iu održavanju komponenti, dok u isto vrijeme smanjuje nasumičnu složenost na minimum. To je važno, jer će tijekom životnog ciklusa sustava, ako nije pravilno dizajniran, biti teže i teže održati učinkovitost, te će biti potrebno sve više vremena i truda da bi se razumjelo kako bi se pronašli i otklonili problemi. Reaktivni sustavi su najproduktivnija arhitektura sustava u kontekstu multi-core, cloud i mobile arhitektura:
  • Izolacija neuspjeha nudi prebacivanje između komponenti, sprječavajući neuspjeh kaskade i ograničavajući volumen i stupanj kvarova.
  • Hijerarhija supervizora nudi nekoliko razina zaštite u kombinaciji sa sposobnostima samoizlječenja, eliminirajući mnoge privremene napuštene operativne troškove za istragu.
  • Preskakanje prijenosa poruka i transparentnost lokacije omogućuju vam da onemogućite i zamijenite komponente bez utjecaja na rad krajnjeg korisnika. Time se smanjuju troškovi kvarova, njihova relativna važnost, kao i resursi potrebni za dijagnozu i korekciju.
  • Replikacija smanjuje rizik od gubitka podataka i smanjuje učinak kvara na dostupnost pretraživanja i pohranjivanja informacija.
  • Elastičnost vam omogućuje pohranjivanje resursa kolikokorištenje varira, što smanjuje tekuće troškove tijekom utovara i rizik od kvarova ili hitnog ulaganja u skalabilnost kako se opterećenje povećava.
  • Odnos prema tradicionalnim web aplikacijama

    Web aplikacije mogu uvelike imati koristi od razvojnog stila Rx-a, koji vam omogućuje da sastavite radne procese odgovora na upite koji uključuju grananje za servisiranje poziva, asinkroni dohvat resursa i generiranje odgovora, a zatim sortiranje za klijenta. Nedavno su se push-and-server događaji i web-utičnice sve više koristili u praksi, a da biste to učinili na skali, potreban vam je učinkovit način pohranjivanja mnogih otvorenih veza i tamo gdje IO ne blokira.
    Za to postoje alati kao što su Streams i Futures, koji prave jednostavne neblokirajuće i asinkrone transformacije i guraju ih klijentima. Reaktivno programiranje s pristupom podacima - ažurira ih i zahtijeva u učinkovitom resursu, uglavnom koristeći SQL baze podataka ili NoSQL s asinkronim upravljačkim programima. Web-aplikacije također imaju koristi od razvoja jet sustava za stvari kao što su distribuirano caching, konzistentnost podataka i multi-node messaging. Tradicionalne web-aplikacije obično koriste čvorove. Ali čim programeri počnu koristiti Server-Sent-Events (SSE) i WebSockets, ti čvorovi postaju operativni, budući da barem podržavaju stanje veze klijenta, a push poruke se šalju na njih u skladu s tim. Za to je potreban razvoj reaktivnog sustavaTo je područje na koje je adresiranje primatelja važno putem poruka.

    Bit Java reaktivnog programiranja

    Nije potrebno koristiti Rx u mlaznim sustavima. Budući da Rx programiranje i reaktivni sustavi nisu jedno te isto. Iako često koriste zamjenjive izraze, nisu točni sinonimi i odražavaju različite stvari. Sustavi predstavljaju sljedeću razinu "reaktivnosti". Ova razina uključuje specifična dizajnerska i arhitektonska rješenja koja vam omogućuju stvaranje robusnih i fleksibilnih aplikacija. Ipak, vrlo dobra ideja - kombinacija metoda - donosi još više koristi aplikacijama, jer ih čini još više međusobno povezanim, omogućuje učinkovitije korištenje resursa i osigurava manje kašnjenje. Kada je riječ o ogromnim količinama podataka ili višezadaćnosti, asinkrona obrada često je potrebna kako bi sustavi bili brzi i osjetljivi. U Javi, predstavnici starog objektno orijentiranog programiranja, asinhronija može postati vrlo složena i učiniti kod teško razumljivim i podržanim. Dakle, Rx je osobito koristan za ovo čisto objektno orijentirano okruženje, jer pojednostavljuje rad asinkronih struja. Sa svojim najnovijim izdanjima, počevši od same Java 8, Java je napravila neke pokušaje da implementira ugrađenu reaktivnost, ali ti pokušaji danas nisu jako popularni kod programera. Međutim, postoje neke žive i redovito ažurirane implementacije treće strane za Java reaktivno programiranje koje pomažu spasiti dan i stoga su posebno cijenjene od strane Java programera.

    Kotlin: Početni test uspješnosti

    U uobičajenoj Android aplikaciji, programeri obično izvode neke reaktivne operacije programiranja koristeći RxJava redovito, pa je potrebno usporediti brzinu, korištenje procesora i memoriju s istim operacijama koje su implementirane s oba Kotlin programa i RxJava. Ovo je početni test uspješnosti. Kad god se koristi novi alat koji se koristi u cijelom kodu, važno je razumjeti hoće li to utjecati na cjelokupnu izvedbu programa prije nego što odlučite koliko je korisno koristiti ga. Praksa korištenja daje kratak odgovor: u većini slučajeva korisnici bi trebali razmotriti zamjenu RxJave s Kotlinom, posebno na Androidu. RxJava programiranje junk-a može se koristiti u ograničenom broju slučajeva, au tim slučajevima možete miješati i RxJava i su-programe. Jednostavni uzroci:
  • Osigurati mnogo veću fleksibilnost od uobičajenog Rx.
  • Pruža bogat skup operatora u zbirkama koje izgledaju isto kao kod operatora RxJava.
  • Kotlinovo reaktivno programiranje može interakciju s rxjava ako je potrebno.
  • Vrlo su lagani i učinkoviti, uzimajući u obzir višu razinu korištenja CPU-a za prikupljanje smeća iz svih objekata koje je stvorio RxJava.
  • Reaktivna proširenja

    Reaktivna proširenja (ReactiveX ili RX) je knjižnica koja slijedi načela Rx-a, tj. Skup asinhronih i programskih događaja pomoćuopaženi slijed. Te knjižnice pružaju mnogo sučelja i metoda koje pomažu razvojnim inženjerima da napišu čist i jednostavan kod. Reaktivna proširenja dostupna su na nekoliko jezika. Programeri su posebno zainteresirani za RxJava i RxAndroid, jer je android najviše fokusirano područje. Jet programiranje pomoću RxJave je implementacija Java Reactive Extensiona iz Netflixa. To je u osnovi knjižnica koja je asinhrona i promatra uzorak promatrača. Možete stvoriti asinkroni promet, pretvoriti ih i konzumirati kao promatrač u različitim tokovima podataka. Knjižnica nudi širok raspon nevjerojatnih operatora kao što su mapa, asocijacija i filtar koji se mogu primijeniti na tok podataka. Kada programer počne koristiti stvarne primjere koda, saznaje više o operatorima i konverzijama.

    Multithreading u Android aplikacijama

    Android Android aplikacija za Android (Android) class = "if uuid-2938324" src = "/misc /i /gallery /73564 /2938324.jpg" /Android Random Programming (RxAndroid) RxJava je nekoliko dodanih klasa, točnije, raspoređivači su predstavljeni u RxAndroidu (AndroidSchedulers.mainThread ()), koji igra važnu ulogu u podržavanju multithreading koncepta u Android aplikacijama. , koji se koristi u programiranju za Android za projektanti i njihove Ukratko:
  • Schedulers.io () - neyntensyvnыh koristiti za obavljanje operacija kao što su internetske pozive, čitanje diskova/datoteke, operacije baze podataka, i koje podržava poolove nitova.
  • AndroidSchedulers.mainThread () - omogućuje pristup glavnoj niti Thread /UI. Tipično, operacije u ovoj niti, kao što je ažuriranje sučelja korisničke interakcije. Stručnjaci savjetuju korisnike da ne bi trebali izvoditi intenzivne operacije na ovoj niti, jer to može uzrokovati bacanje programa ili ANR dijalog.
  • Schedulers.newThread () koristeći ovo, nova nit će biti izrađena svaki put kada je zakazani zadatak zakazan. Obično se predlaže da se ne koristi vremenski raspored za dugotrajan rad. Niti stvoreni pomoću newThread () neće se ponovno koristiti.
  • Schedulers.computation () - Ovaj grafikon može se koristiti za obavljanje intenzivnih operacija s procesorom, za obradu ogromnih podataka centra reaktivnog programiranja, za obradu rasterskih slika. Broj niti kreiranih pomoću ovog rasporeda u cijelosti ovisi o broju dostupnih CPU jezgri.
  • Schedulers.single () - ovaj raspored će izvršiti sve zadatke redoslijedom koji se može koristiti kada je potrebna sekvencijalna izvedba.
  • Schedulers.immediate () - Ovaj planer odmah izvršava zadatke, dok blokira glavni tok.
  • Schedulers.trampoline () - Obavlja zadatak u načinu rada First In-First Out. Svi planirani zadaci izvršavat će se jedan za drugim, ograničavajući broj pozadinskih tokova na jedan.
  • Schedulers.from () - omogućuje vam da kreirate planer od izvođača, ograničavajući broj stvorenih tokova. Kada je bazen tokova zauzet, zadatak će bitistaviti u red.
  • Osnovni primjeri RxJave

    Sada kada postoje dobra teoretska znanja o RxJavi i RxAndroidu, možete otići na neke primjere koda kako biste bolje razumjeli koncept. Da biste započeli, morate dodati ovisnosti RxJava i RxAndroid za build.gradle i sinkronizirati projekt. Glavne faze.
    Programiranje.
    Promatrač vas signalizira kako bi mogao početi primati podatke na dva načina:
  • SubscribeOn (Schedulers.io ()) - govori vam da pokrenete zadatak u pozadinskom toku.
  • ObservOn (AndroidSchedulers.mainThread ()) - određuje promatrač za dobivanje podataka u streamu Android korisničkog sučelja.
  • To je sve, tako da će programer moći s RxJavom napisati svoj prvi program reaktivnog programiranja. Poduzeća i dobavljači intermedijarnog softvera počeli su koristiti Reactive, au 2016. i 2012. došlo je do velikog rasta korporativnog interesa za usvajanje ove paradigme. Rx nudi performanse razvojnih programera kroz učinkovitost resursa na razini komponenti za internu logiku i transformaciju toka podataka, dok reaktivni sustavi nude performanse za arhitekte i DevOps, zbog stabilnosti i elastičnosti na razini sustava. Koriste se za stvaranje Cloud Native i drugih velikih distribuiranih sustava. U praksi, knjige o reaktivnom programiranju Jave također su naširoko korištene metodama koje omogućuju kombiniranje načela projektiranja reaktivnih sustava.

    Povezane publikacije