Programowanie reaktywne: koncepcje, szkolenia, funkcje i porady ekspertów

Zasady programowania reaktywnego nie są nowe i można je prześledzić od lat 70. i 80. w głównych dziełach Jim Gray i Pete Helland z systemem tandemowym.

Ci ludzie znacznie wyprzedzają swój czas. Tylko w ciągu ostatnich 5-10 lat branża technologiczna została zmuszona do ponownego rozważenia istniejących "najlepszych praktyk" w zakresie rozwoju systemu korporacyjnego. Nauczyła się stosować wiedzę o reaktywnych zasadach dzisiejszego świata wielordzeniowych i chmurowych. Podstawą systemu reaktywnego jest transmisja komunikatów, która tworzy tymczasową granicę pomiędzy komponentami, umożliwia ich rozwiązanie w czasie, wykorzystując równoległość i przestrzeń, która rozkłada obciążenie i zapewnia mobilność. To wzajemne połączenie jest warunkiem całkowitej izolacji między komponentami i stanowi podstawę zarówno stabilności, jak i elastyczności systemów.


Podstawy programowania reaktywnego

Programowanie ma na celu przesyłanie informacji i dystrybucję zmian danych. Podczas używania języków programowania można łatwo przydzielić strumienie statyczne i dynamiczne, a model podstawowy automatycznie rozszerza zmiany na wszystkie strumienie danych. W prostych słowach, strumienie programowania Rx produkowane przez jeden komponent, a także podstawowa struktura zapewniona przez biblioteki Rx, będą dystrybuować te zmiany do innego komponentu zarejestrowanego w celu otrzymania tych zmian. Reaktywne programowanie Rx składa się z trzech kluczowych punktów.
Główne funkcje komponentów:
  • Obserwacje to nic innego jak strumienie danych. Monitor przechowuje dane, które mogą być przesyłane z jednego przepływu do drugiego. Zasadniczo generują dane okresowo lub tylko raz w swoim cyklu życia w oparciu o konfiguracje. Istnieje wiele operatorów, którzy mogą pomóc obserwatorowi wysłać określone dane w oparciu o określone zdarzenia.
  • Obserwatorzy zużywają strumień emitowany przez obserwatorów. Obserwatorzy rejestrują się za pomocą metody reaktywnego programowania subscribeOn () w celu odbioru danych transmitowanych przez obserwatorów. Ilekroć dane są przesyłane, wszyscy zarejestrowani obserwatorzy otrzymują dane w wywołaniu zwrotnym onNext (). Tutaj mogą wykonywać różne operacje, takie jak analizowanie odpowiedzi JSON lub aktualizowanie interfejsu. Jeśli wystąpi błąd spowodowany obserwacją, obserwator dostanie go w onerror ().
  • Harmonogram (Harmonogram) jest składnikiem Rx, który mówi obserwatorom i obserwatorom, z jakiego przepływu powinni pracować. Możesz użyć metody observOn (), aby powiedzieć obserwatorom, jaki strumień mają obserwować. Ponadto można użyć metody schedOn (), aby zgłosić zaobserwowany strumień, w którym powinny zostać uruchomione.
  • W programowaniu strumieniowym za pomocą RxJava, domyślne główne wątki, takie jak Schedulers.newThread (), tworzą nowe tło. Schedulers.io () wykona kod w strumieniu I /O.


    Zalety i ograniczenia metody

    Głównymi zaletami Rx są zwiększone wykorzystaniezasoby obliczeniowe dla sprzętu wielordzeniowego i wieloprocesorowego, zwiększona produktywność dzięki punktom cięcia i zwiększająca produktywność poprzez redukcję punktów serializacji, zgodnie z Prawem Amdahla i Ustawą Skalowalności Uniwersalnego Gunthera. Drugą zaletą jest wysoka wydajność dla programistów, ponieważ tradycyjne paradygmaty programowania walczyły o zapewnienie prostego i obsługiwanego podejścia zarówno do asynchronicznych i nieblokujących komputerów i IO. Funkcjonalne programowanie reaktywne rozwiązuje te zadania, ponieważ zwykle eliminuje potrzebę wyraźnej koordynacji między aktywnymi komponentami.
    W przypadku wystąpienia Rx tworzony jest proces tworzenia komponentów i przepływu pracy. Aby w pełni wykorzystać asynchroniczną realizację, uwzględnienie przeciw-trafień ma kluczowe znaczenie dla uniknięcia nadmiernego wykorzystania lub raczej nieograniczonego zużycia zasobów. Aby zapewnić stały stan w zakresie przepływu danych, oparte na obciążeniu przeciwne ciśnienie wysyła do góry strumień zapotrzebowania i odbiera komunikaty. Zatem główne zalety systemu to:
  • Zwiększona wydajność - dzięki zdolności do szybkiego i stabilnego przetwarzania ogromnych ilości danych.
  • Ulepszone UX - ponieważ aplikacja jest bardziej responsywna dla użytkownika.
  • Uproszczone modyfikacje i aktualizacje - dzięki czytelnej i łatwiejszej prognozie kodu.
  • Ale pomimo faktu, że programowanie reaktywne - bardzo przydatne przy tworzeniunowoczesne oprogramowanie, aby myśleć o systemie na wyższym poziomie, trzeba użyć innego narzędzia - architektury reaktywnej do projektowania systemów reaktywnych. Ponadto ważne jest, aby pamiętać, że istnieje wiele paradygmatów programowania, a Rx jest tylko jednym z nich, tak jak każde narzędzie, nie jest przeznaczony do wszystkich przypadków użycia.

    Stabilność systemów reaktywnych

    Stabilność jest wrażliwością w przypadku awarii i stanowi integralną właściwość funkcjonalną systemu. Wymaga rozwoju, a nie tylko dodawania do systemu w formie wstecznej. Stabilność programowania reaktywnego javascript wykracza poza tolerancję na uszkodzenia i nie wynika to z degradacji, ale w przypadku awarii może całkowicie się poprawić. To wymaga izolacji komponentów i powstrzymywania, aby uniknąć kolizji, które rozprzestrzeniają się na sąsiednie komponenty, co może prowadzić do katastroficznych scenariuszy z kaskadowymi awariami. Dlatego kluczem do stworzenia odpornych systemów - samodzyskiwania jest to, że można je opisać jako wiadomości wysyłane do innych komponentów, które działają jako nadzorcy i są zarządzane z bezpiecznego kontekstu poza odrzuconym komponentem. Tutaj, będąc kierowanymi wiadomościami, te fundusze odchodzą od silnie powiązanych, delikatnych, głęboko osadzonych, synchronicznych łańcuchów połączeń, które w większości przypadków są ignorowane. Chodzi o oddzielenie zarządzania błędami wywołania zwrotnego, na przykład poprzez zwolnienie klienta z odpowiedzialności za przetwarzanie awarii serwera.

    Charakterystyka architektury systemu

    Ponieważ większość systemów jest z natury złożona, jednym z najważniejszych aspektów jest zapewnienie, że architektura systemu zapewnia minimalne obniżenie wydajności, zarówno w zakresie projektowania i konserwacji komponentów, przy jednoczesnym zmniejszeniu losowej złożoności do minimum. Jest to ważne, ponieważ przez cały cykl życia systemu, jeśli nie jest on odpowiednio zaprojektowany, będzie coraz trudniej utrzymać efektywność, a potrzeba więcej czasu i wysiłku, aby zrozumieć, jak zlokalizować i wyeliminować problemy. Systemy reaktywne są najbardziej produktywną architekturą systemową w kontekście architektur wielordzeniowych, chmurowych i mobilnych:
  • Izolacja awarii oferuje przełączanie między komponentami, zapobieganie awariom kaskadowania oraz ograniczanie objętości i stopnia awarii.
  • Hierarchia organów nadzoru oferuje kilka poziomów ochrony w połączeniu z możliwościami samoleczenia, co eliminuje wiele czasowych zaniechań jakichkolwiek kosztów operacyjnych w dochodzeniu.
  • Pomijanie przesyłania wiadomości i przejrzystości lokalizacji umożliwia wyłączanie i zastępowanie komponentów bez wpływu na pracę użytkownika końcowego. Zmniejsza to koszty awarii, ich relatywne znaczenie, a także zasoby potrzebne do diagnozy i korekty.
  • Replikacja zmniejsza ryzyko utraty danych i zmniejsza wpływ awarii na dostępność wyszukiwania i przechowywania informacji.
  • Elastyczność pozwala na przechowywanie zasobów w takim stopniu, w jakimzużycie jest różne, co minimalizuje koszty eksploatacji podczas ładowania i ryzyko awarii lub pilnych inwestycji w skalowalność wraz ze wzrostem obciążenia.
  • Związek z tradycyjnymi aplikacjami internetowymi

    Aplikacje internetowe mogą w znacznym stopniu korzystają z rozwoju stylu Rx, pozwalając przepływy dokonać żądanie-odpowiedź, w tym wyzwań rozgałęzienia usług, wydobycie zasobów asynchroniczne i kompilację odpowiedzi oraz dalszemu sortowaniu do klienta. Niedawno, Push-serwer zdarzeń i gniazda sieci są coraz częściej wykorzystywane w praktyce, a do tego wymaganą skalę skutecznych sposobów przechowywania wielu otwartych połączeń i gdzie blokuje IO.
    Istnieją narzędzia, na przykład, strumieni i Futures, które sprawiają, że proste neblokyruyuschye i asynchroniczną konwersję i zachęca je do klientów. Jet dostęp do danych na poziomie programowania c - aktualizacje i prosi, żeby skutecznie zasobu, najlepiej przy użyciu baz danych SQL lub NoSQL asynchronicznych sterowniki. Aplikacje internetowe korzystają również z rozwoju systemu odrzutowego dla takich rzeczy, jak rozproszone buforowanie, spójność danych i wielowęzłowe przesyłanie wiadomości. Tradycyjne aplikacje internetowe zwykle używają węzłów. Ale jak programiści zaczną używać serwera Sent-zatorowym (SSE) i WebSockets - jednostki te są sprawne, bo przynajmniej wspierają one stan połączenia klienta i push-wiadomości wysyłanych do nich odpowiednio. Wymaga to rozwoju systemu reaktywnego, ponieważJest to obszar, w którym adresowanie adresatów jest ważne dzięki wysyłaniu wiadomości.

    Istota programowania reaktywnego Java

    Nie jest konieczne stosowanie Rx w systemach strumieniowych. Ponieważ programowanie Rx i systemy reaktywne nie są jednym i tym samym. Chociaż często używają terminów wymiennych, nie są one dokładnymi synonimami i odzwierciedlają różne rzeczy. Systemy reprezentują następny poziom "reaktywności". Ten poziom obejmuje konkretne rozwiązania projektowe i architektoniczne, które umożliwiają tworzenie niezawodnych i elastycznych aplikacji. Niemniej jednak bardzo dobry pomysł - kombinacja metod - przynosi jeszcze więcej korzyści aplikacjom, ponieważ sprawia, że ​​są one jeszcze bardziej połączone, umożliwiają bardziej efektywne wykorzystanie zasobów i zapewniają mniejsze opóźnienie. W przypadku ogromnych ilości danych lub wielozadaniowości często wymagane jest przetwarzanie asynchroniczne, aby systemy były szybkie i responsywne. W języku Java, przedstawiciel starego programowania obiektowego, asynchronizacja może stać się naprawdę skomplikowana i sprawić, że kod będzie trudny do zrozumienia i obsługi. Tak więc, Rx jest szczególnie użyteczny dla tego czysto obiektowego środowiska, ponieważ upraszcza działanie asynchronicznych strumieni. Dzięki swoim najnowszym wydaniom, począwszy od samej Java 8, Java podjęła pewne próby wdrożenia wbudowanej reaktywności, ale obecnie te próby nie są zbyt popularne wśród programistów. Istnieją jednak żywe i regularnie aktualizowane implementacje stron trzecich do programowania reaktywnego Java, które pomagają zaoszczędzić czas i dlatego są szczególnie doceniane przez programistów Java.

    Kotlin: Wstępny test wydajności

    W typowym zastosowaniu dla programistów Androida zwykle wielokrotnie wykonać pewne operacje programowania reaktywne pomocą RxJava, więc należy porównać prędkość, zużycie procesora i pamięci o tych samych operacji, które zostały wdrożone z dniem soprohrammamy Kotlin iz RxJava. To jest wstępny test wydajności. Stosowany nowe narzędzie, które jest powszechnie wykorzystywany w Kodeksie, ważne jest, aby zrozumieć, czy będzie to miało wpływ na ogólną wydajność programu przed podjęciem decyzji o tym, jak należy go stosować. Praktyka wykorzystania daje krótką odpowiedź: w większości przypadków użytkownicy powinni rozważyć zastąpienie RxJava Kotlinem, szczególnie na Androidzie. Programowanie śmieciowe RxJava może być używane w ograniczonej liczbie przypadków, w takich przypadkach można mieszać zarówno RxJava, jak i programy współprogramowe. Proste przyczyny:
  • Zapewniają znacznie większą elastyczność niż zwykle Rx.
  • Zapewnia bogaty zestaw operatorów w kolekcjach, które wyglądają tak samo, jak w przypadku operatorów RxJava.
  • Reaktywne programowanie Kotlin może w razie potrzeby współdziałać z rxjava.
  • ,
  • są bardzo proste i skuteczne, ze względu na większy stopień wykorzystania procesora do zbierania wszystkich obiektów utworzonych RxJava.
  • rozszerzenia reaktywne

    Reaktywne Rozszerzenia (ReactiveX lub Rx) - biblioteki, który stosuje się do zasad Rx, który jest asynchroniczny i montażowe na bazie aplikacje wykorzystujące zdarzeniaobserwowana sekwencja. Biblioteki te zapewniają wiele interfejsów i metod, które pomagają programistom pisać czysty i prosty kod. Rozszerzenia reaktywne są dostępne w kilku językach. Programiści są szczególnie zainteresowani RxJavą i RxAndroidem, ponieważ android jest najbardziej skupionym obszarem. Programowanie Jet za pomocą RxJava jest implementacją Java Reactive Extension z Netflix. Jest to w zasadzie biblioteka, która jest asynchroniczna, obserwując wzorzec obserwatora. Możesz tworzyć ruch asynchroniczny, konwertować i wykorzystywać je jako obserwatora w różnych strumieniach danych. Biblioteka oferuje szeroki zakres niesamowitych operatorów, takich jak mapa, powiązanie i filtr, które można zastosować do strumienia danych. Gdy programista zaczyna używać rzeczywistych przykładów kodu, uczy się więcej o operatorach i konwersjach.

    aplikacje wielowątkowymi w Android

    Androida "klasa =" jeśli UUID-2938324 "src =" /misc /I /zdjęć /73564 /2938324.jpg „/& gt; Android reaktywne programowania (RxAndroid) specyficznego dla platformy Android dodaje kilka klas ponad RxJava dokładniej. - planistów prezentowane w RxAndroid (AndroidSchedulers.mainThread ()), która odgrywa ważną rolę we wspieraniu pojęcie wielowątkowości w aplikacjach dla Androida Przede wszystkim, eksperci radzą, aby używać tylko RxJava biblioteki Nawet przez wielu planistów.. , używane w programowaniu dla Androida Poniżej znajduje się lista dla projektantów i ich streszczenia
  • Schedulers.io () - neyntensyvnыh wykorzystywane do wykonywania czynności, takich jak połączeń internetowych, czytanie dysków/files, operacje na bazie danych i które obsługuje pule wątków.
  • AndroidSchedulers.mainThread () - zapewnia dostęp do głównego tematu Temat /UI. Zazwyczaj operacje w tym wątku, takie jak aktualizacja interfejsu interakcji użytkownika. Eksperci doradzają użytkownikom, że nie powinien wykonywać żadnych operacji na intensywne tego strumienia, ponieważ może to spowodować, że programy lub ANR dialogu rolka.
  • Schedulers.newThread () przy użyciu tej nowej nici będą utworzone za każdym razem, gdy planowane zadania. Zazwyczaj sugeruje się, aby nie stosować harmonogramu długich prac. Wątki utworzone za pomocą metody newThread () nie będą ponownie wykorzystywane.
  • Schedulers.computation () - Wykres ten może być użyty do przeprowadzenia intensywnego działania procesora do przetwarzania ogromne danych, programowanie strumienia środkowy rastrowego przetwarzania obrazu. Liczba wątków utworzonych z tego planisty jest całkowicie zależny od liczby dostępnych rdzeni procesora.
  • Schedulers.single () - Ta scheduler wykona wszystkie zadania w kolejności, w jakiej można użyć, gdy trzeba spójną wydajność.
  • Schedulers.immediate () - harmonogram natychmiast wykonuje tę czynność, podczas blokowania głównego strumienia.
  • Schedulers.trampoline () - wykonuje sposób zadanie pierwszy na wejściu-pierwszy na wyjściu. Wszystkie zaplanowane zadania będą wykonywane jedna po drugiej, co ogranicza liczbę wątków tła.
  • Schedulers.from () - pozwala stworzyć planisty od artysty, ograniczając liczbę nitek utworzone. Kiedy pula strumieni jest zajęta, zadanie będzieumieścić w kolejce.
  • Podstawowe przykłady RxJavy

    Teraz, gdy istnieje dobra wiedza teoretyczna na temat RxJava i RxAndroid, można przejść do przykładów kodu, aby lepiej zrozumieć tę koncepcję. Aby rozpocząć, musisz dodać zależności RxJava i RxAndroid do build.gradle i zsynchronizować projekt. Główne etapy.
    Programowanie.
    Obserwator podpisuje cię, aby mógł zacząć otrzymywać dane za pomocą dwóch metod:
  • SubscribeOn (Schedulers.io ()) - mówi, aby rozpocząć zadanie w strumieniu w tle.
  • ObservOn (AndroidSchedulers.mainThread ()) - określa Observer, aby uzyskać dane w strumieniu interfejsu użytkownika systemu Android.
  • To wszystko, więc programista będzie mógł napisać swój pierwszy program programowania reaktywnego z RxJavą. Przedsiębiorstwa i dostawcy oprogramowania pośredniego zaczęli używać systemu Reactive, a w latach 2016-2018 nastąpił ogromny wzrost zainteresowania korporacyjnego przyjęciem tego paradygmatu. Rx oferuje wydajność programistyczną dzięki wydajności zasobów na poziomie komponentów w celu wewnętrznej logiki i transformacji przepływu danych, podczas gdy reaktywne systemy oferują wydajność dla architektów i DevOps, ze względu na stabilność i elastyczność na poziomie systemu. Są używane do tworzenia Cloud Native i innych rozproszonych systemów na dużą skalę. W praktyce książki o reaktywnym programowaniu Javy są również szeroko stosowane dzięki metodom pozwalającym łączyć zasady projektowania systemów reaktywnych.

    Powiązane publikacje