Реактивно програмиране: концепции, обучение, функции и експертни съвети

Принципите на реактивното програмиране не са нови и могат да бъдат проследени от 70-те и 80-те години в основните произведения на Джим Грей и Пит Хелланд с тандемна система.

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


Основи на реактивното програмиране

Това програмиране е насочено към поточна информация и разпространение на промените в данните. При използване на програмни езици е лесно да се разпределят статични и динамични потоци, докато базовият модел автоматично разширява промените през всички потоци от данни. С прости думи, програмните потоци на Rx, произведени от един компонент, както и основната структура, предоставена от Rx библиотеките, ще разпространяват тези промени в друг компонент, регистриран за получаване на тези промени. Реактивното програмиране на Rx се състои от три ключови точки.
Основни функции на компонентите:
  • Наблюденията не са нищо друго освен потоци от данни. Мониторът съхранява данни, които могат да се предават от един поток към друг. Те основно произвеждат данни периодично или само веднъж в жизнения си цикъл на базата на конфигурации. Има различни оператори, които могат да помогнат на наблюдателя да изпрати някои специфични данни въз основа на определени събития.
  • Наблюдателите консумират поток, излъчван от наблюдателите. Наблюдателите се регистрират, използвайки метода за реактивно програмиране subscribeOn (), за да получават данни, предадени от наблюдателите. Всеки път, когато се предават данни, всички регистрирани наблюдатели получават данни в обратно извикване наNext (). Тук те могат да изпълняват различни операции, като например синтактичен анализ на JSON отговор или актуализиране на интерфейса. Ако има грешка, причинена от наблюдение, наблюдателят ще го получи в onerror ().
  • Планировчикът (Schedule) е компонент в Rx, който съобщава на наблюдателите и наблюдателите какъв поток те трябва да работят. Можете да използвате метода observOn (), за да кажете на наблюдателите какъв поток трябва да наблюдават. В допълнение, можете да използвате schedOn (), за да докладвате наблюдавания поток, в който трябва да бъдат стартирани.
  • При струйното програмиране, използвайки RxJava, основните нишки по подразбиране, като Schedulers.newThread (), създават нов фон. Schedulers.io () ще изпълни код в I /O потока.


    Предимства и ограничения на метода

    Основните ползи от Rx са увеличеното използванеизчислителни ресурси за многоядрен и многопроцесорен хардуер, повишена производителност чрез рязане на точки и увеличаване на производителността чрез намаляване на точките на сериализация, в съответствие със закона Amdahl и с универсалния закон за мащабируемост на Gunther. Второто предимство е високата производителност за разработчиците, тъй като традиционните програмни парадигми се борят да осигурят прост и подкрепен подход както за асинхронни, така и за неблокиращи изчисления и IO. Функционалното реактивно програмиране адресира тези задачи, тъй като обикновено елиминира необходимостта от ясна координация между активните компоненти.
    В случаите на Rx се създава процесът на създаване на компоненти и работния процес. За да се използва пълноценно асинхронното изпълнение, включването на насрещни удари е от решаващо значение, за да се избегне прекомерното използване или по-скоро неограничено потребление на ресурси. За да се осигури стабилно състояние по отношение на потока от данни, обратното налягане, базирано на натоварване, изпраща възходящ поток на търсенето и получава съобщения. По този начин, основните предимства на системата са:
  • Повишена производителност - благодарение на способността да се обработват огромни количества данни бързо и стабилно.
  • Подобрено UX - Тъй като приложението е по-отзивчиво към потребителя.
  • Опростени модификации и актуализации - благодарение на четливо и по-лесно предвиждане на кода.
  • Но въпреки факта, че реактивното програмиране - много полезно нещо при създаванетомодерен софтуер, за да мислите за системата на по-високо ниво, трябва да използвате друг инструмент - Reactive Architecture за процеса на проектиране на реактивни системи. Освен това е важно да се помни, че има много парадигми за програмиране, а Rx е само един от тях, както всеки инструмент, той не е предназначен за всички случаи на употреба.

    Устойчивост на реактивните системи

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

    Изпълнение на системната архитектура

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

    Уеб приложенията могат до голяма степен да се възползват от стила на разработка на Rx, който ви позволява да съставяте работни потоци за отговор на заявки, които включват разклоняване към обслужващи повиквания, асинхронно извличане на ресурси и генериране на отговор и след това сортиране за клиента. Напоследък, push-and-server събития и web sockets стават все по-често използвани на практика и за да направите това по скала, се нуждаете от ефективен начин за съхраняване на много отворени връзки и където IO не блокира.
    За тази цел съществуват инструменти като потоци и фючърси, които правят прости неблокиращи и асинхронни трансформации и ги изтласкват на клиентите. Реактивно програмиране с достъп до данни - актуализира и изисква в ефикасен ресурс, използвайки основно SQL бази данни или NoSQL с асинхронни драйвери. Уеб приложенията също се възползват от разработването на реактивна система за неща като разпределено кеширане, последователност на данните и многоузловни съобщения. Традиционните уеб приложения обикновено използват възли. Но веднага след като програмистите започнат да използват Server-Sent-Events (SSE) и WebSockets, тези възли стават оперативни, тъй като поне поддържат състоянието на връзката с клиента и съответно се изпращат съобщения до тях. Това изисква разработването на реактивна система, тъй катоТова е област, в която адресирането на получатели е важно чрез съобщенията.

    Същността на Java реактивното програмиране

    Не е необходимо да се използва Rx в реактивни системи. Защото Rx програмирането и реактивните системи не са едно и също. Въпреки че често използват взаимозаменяеми термини, те не са точни синоними и отразяват различни неща. Системите представляват следващото ниво на "реактивност". Това ниво включва специфични дизайнерски и архитектурни решения, които ви позволяват да създавате стабилни и гъвкави приложения. Въпреки това една много добра идея - комбинация от методи - носи още повече ползи за приложенията, тъй като ги прави още по-взаимосвързани, позволява по-ефективно използване на ресурсите и осигурява по-ниско забавяне. Когато става въпрос за огромни обеми данни или многозадачност, често се изисква асинхронна обработка, за да се направят системите бързи и отзивчиви. В Java, представител на стария обектно-ориентирано програмиране, асинхронността може да стане наистина сложна и да направи кода трудно разбираем и поддържан. По този начин Rx е особено полезен за тази чисто обектно-ориентирана среда, тъй като опростява работата на асинхронните потоци. С последните си версии, започвайки с Java 8, Java е направила някои опити да внедри вградена реактивност, но тези опити днес не са много популярни сред разработчиците. Въпреки това, има някои ярки и редовно обновявани внедрявания от трети страни за реактивно програмиране на Java, които помагат за спасяването на деня и затова са особено ценени от Java разработчиците.

    Котлин: Първоначален тест за ефективност

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

    Реактивни разширения (ReactiveX или RX) са библиотека, която следва принципите на Rx, т.е. събранието на асинхронни и програмно базирани събития, като се използванаблюдавана последователност. Тези библиотеки осигуряват много интерфейси и методи, които помагат на разработчиците да пишат чист и прост код. Реактивните разширения са налични на няколко езика. Програмистите са особено заинтересовани от RxJava и RxAndroid, тъй като android е най-фокусираната област. Jet програмиране с RxJava е изпълнението на Java реактивно разширение от Netflix. Това е в общи линии библиотека, която е асинхронна, наблюдавайки модела на наблюдателя. Можете да създадете асинхронен трафик, да ги конвертирате и да ги консумирате като наблюдател в различни потоци от данни. Библиотеката предлага широк спектър от невероятни оператори като карта, асоциация и филтър, които могат да бъдат приложени към потока от данни. Когато програмистът започне да използва действителни примери на кодове, той научава повече за операторите и реализациите.

    Многопоточност в приложения за Android

    Android Android приложение за Android (Android) RxJava е няколко добавени класа, по-конкретно, планировчиците са представени в RxAndroid (AndroidSchedulers.mainThread ()), който играе важна роля в поддържането на многопоточната концепция в Android приложенията. , използван в програмирането за Android за проектанти и тяхното обобщение:
  • Schedulers.io () - neyntensyvnыh използва за извършване на операции като интернет разговори, четене на дискове/файлове, операции с бази данни и поддържащи пулове с нишки.
  • AndroidSchedulers.mainThread () - Предоставя достъп до главната нишка Thread /UI. Обикновено операциите в тази нишка, като например обновяване на интерфейса за взаимодействие с потребителя. Експертите съветват потребителите, че не трябва да извършват интензивни операции на тази тема, тъй като това може да доведе до програмиране или ANR диалог.
  • Schedulers.newThread () използвайки това, ще се създава нова нишка всеки път, когато планираната задача е насрочена. Обикновено се предлага да не се използва график за продължителна работа. Потоците, създадени с newThread (), няма да бъдат използвани повторно.
  • Schedulers.computation () - Тази графика може да се използва за извършване на интензивни операции с процесора, за обработка на огромни данни от центъра за реактивно програмиране, за обработка на растерни изображения. Броят на нишките, създадени с помощта на този график, зависи изцяло от броя на наличните CPU ядра.
  • Schedulers.single () - този планировчик ще изпълнява всички задачи в ред, който може да се използва, когато се изисква необходимостта от последователно изпълнение.
  • Schedulers.immediate () - Този планировчик незабавно изпълнява задачи, докато блокира основния поток.
  • Schedulers.trampoline () - Изпълнява задача в режим Първо в първо излизане. Всички планирани задачи ще се изпълняват едно след друго, ограничавайки броя на фоновите потоци до един.
  • Schedulers.from () - ви позволява да създадете график от изпълнител, като ограничите броя на създадените потоци. Когато пулът от потоци е зает, задачата ще бъдепоставете в опашката.
  • Основни примери на RxJava

    Сега, когато има добри теоретични познания за RxJava и RxAndroid, можете да отидете в някои примери на кодове, за да разберете по-добре концепцията. За да започнете, трябва да добавите зависимостите RxJava и RxAndroid за build.gradle и синхронизиране на проекта. Основните етапи.
    Програмиране.
    Наблюдателят ви подписва така, че да може да започне да получава данни по два начина:
  • SubscribeOn (Schedulers.io ()) - ви казва да стартирате задачата във фонов поток.
  • ObservOn (AndroidSchedulers.mainThread ()) - Определя наблюдател за получаване на данни в потока на потребителския интерфейс на Android.
  • Това е всичко, така че програмистът ще може да напише първата си програма за реактивно програмиране с RxJava. Предприятията и доставчиците на междинния софтуер започнаха да използват Реактивен, а през 2016 - 2012 г. се наблюдава огромен ръст на корпоративния интерес към приемането на тази парадигма. Rx предлага ефективност на разработчиците чрез ресурсна ефективност на ниво компонент за вътрешна логика и трансформация на потока от данни, докато реактивните системи предлагат ефективност за архитекти и DevOps, поради стабилността и еластичността на системата. Те се използват за създаване на Cloud Native и други широкомащабни разпределени системи. На практика книгите за реактивно програмиране на Java също са широко използвани с методи, които позволяват комбиниране на принципите на проектиране на реактивни системи.

    Свързани публикации