Реактивне програмування: поняття, навчання, особливості та поради фахівців

11 0 Новини високих технологій

Принципи реактивного програмування не нові, і їх можна простежити з 70-х і 80-х років в основних роботах Джима Грея і Пета Хелланда з тандемною системі.

Реактивне програмування: поняття, навчання, особливості та поради фахівців
Ці люди набагато випередили свій час. Тільки в останні 5-10 років технологічна індустрія була змушена переглянути існуючі «кращі практики» для розвитку корпоративної системи. Вона навчилася застосовувати знання про реактивних принципи сьогоднішнього світу багатоядерних і хмарних обчислень. Основою для реактивної системи є передача повідомлень, яка створює тимчасову межу між компонентами, дозволяє їх розв'язувати у часі, використовуючи паралельність і простір, що розподіляє навантаження і забезпечує мобільність. Ця розв'язка є вимогою повної ізоляції між компонентами і складає основу як для стійкості, так і для еластичності систем.


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

Це програмування спрямоване на потоки інформації та розповсюдження змін даних. При використанні мов програмування легко виділити статичні і динамічні потоки, при цьому базова модель автоматично поширить зміни через всі потоки даних. Кажучи простими словами, в потоках даних програмування Rx, що випускаються одним компонентом, що і базова структура, що надається бібліотеками Rx, буде поширювати ці зміни на інший компонент, зареєстрований для отримання цих змін. Реактивне програмування Rx складається з трьох ключових моментів.
Реактивне програмування: поняття, навчання, особливості та поради фахівців
Основні функції компонентів:
  • Спостережувані - не що інше, як потоки даних. Спостережуваний упаковує дані, які можуть передаватися з одного потоку до іншого. Вони в основному випускають дані періодично або тільки один раз у своєму життєвому циклі на основі конфігурацій. Існують різні оператори, які можуть допомогти спостерігачеві відправити деякі конкретні дані на основі певних подій.
  • Спостерігачі споживають потік, випромінюваний спостережуваним. Спостерігачі підписуються з допомогою методу реактивного програмування subscribeOn () для отримання даних, передавальних спостережуваним. Всякий раз, коли спостерігається передасть дані, всі зареєстровані спостерігачі отримують дані в зворотному виклик onNext (). Тут вони можуть виконувати різні операції, такі як розбір відповіді JSON або оновлення інтерфейсу. Якщо є помилка, викликана спостережуваним, спостерігач отримає її в onerror ().
  • Планувальники (розклад) - це компонент в Rx, який повідомляє спостережуваним і спостерігачам, з якого потоку вони повинні працювати. Можна використовувати метод observOn (), щоб повідомляти спостерігачам, на якому потоці вони повинні спостерігати. Крім того, можна використовувати schedOn (), щоб повідомити спостережуваного, в якому потоці вони повинні запускатися.
  • У реактивному програмуванні з використанням RxJava передбачені основні потоки за замовчуванням, такі як Schedulers.newThread () створять новий фон. Schedulers.io () виконає код в потоці вводу-виводу.


    Переваги та обмеження методу

    Реактивне програмування: поняття, навчання, особливості та поради фахівців
    Основними перевагами Rx є збільшення використання обчислювальних ресурсів на багатоядерний та багатопроцесорному обладнанні, підвищення продуктивності за рахунок скорочення точок і підвищення продуктивності за рахунок скорочення точок серіалізації, відповідно до Закону Амдаля і Універсального закону про масштабованості Гюнтера. Друга перевага - висока продуктивність для розробників, оскільки традиційні парадигми програмування з усіх сил намагалися забезпечити простий і підтримуваний підхід до роботи з асинхронними і неблокирующими обчисленнями та IO. З цими завданнями справляється функціональне реактивне програмування, оскільки воно зазвичай усуває необхідність у чіткій координації між активними компонентами.
    Там, де виникає Rx, створюється процес створення компонентів та склад робочих процесів. Щоб повністю використовувати асинхронне виконання, включення протитиску має вирішальне значення, щоб уникнути надмірного використання або, швидше, необмеженого споживання ресурсів. Щоб забезпечити стійкий стан з точки зору потоку даних, зворотний тиск на основі навантаження відсилає попит, що протікає вверх по потоку, і приймає повідомлення. Таким чином, основними перевагами системи є:
  • Підвищена продуктивність - завдяки можливості швидко і стабільно обробляти величезні обсяги даних.
  • Покращений UX - з-за того, що додаток більше реагує на користувача.
  • Спрощені модифікації і оновлення - завдяки читабельному та більш легкому прогнозування коду.
  • Але незважаючи на те, що Reactive Programming - дуже корисна штука при створенні сучасного програмного забезпечення, щоб міркувати про систему на більш високому рівні, потрібно використовувати інший інструмент - Reactive Architecture для процесу проектування реактивних систем. Крім того, важливо пам'ятати, що існує багато парадигм програмування, і Rx - це лише один із них, як і будь-який інструмент, він не призначений для всіх випадків використання.

    Стійкість реактивних систем

    Стійкість - це чуйність при невдачі і є невід'ємним функціональним властивістю системи. Для неї потрібні розробки, а не просто додавання в систему в ретроактивном вигляді. Стійкість реактивного програмування javascript виходить за межі відмовостійкості і це відбувається не через деградації, а в разі невдачі вона може повністю сама виправитися. Для цього потрібна ізоляція компонентів і стримування відмов, щоб уникнути збоїв, що поширюються на сусідні компоненти, що може призвести до катастрофічних сценаріїв з каскадними збоями. Таким чином, ключем до створення систем Resilient — самовідновлення є те, що вони можуть бути охарактеризованными як повідомлення, відправлені на інші компоненти, які діють як супервізори і управляються з безпечного контексту поза відмовив компонента. Тут, будучи керованими повідомленнями, ці кошти відходять від сильно пов'язаних, тендітних, глибоко вкладених синхронних ланцюжка викликів, які в більшості випадків ігноруються. Ідея полягає в тому, щоб відокремити управління відмовами від ланцюжка викликів, наприклад, звільняючи клієнта від відповідальності за обробку збоїв сервера.

    Продуктивність системної архітектури

    Реактивне програмування: поняття, навчання, особливості та поради фахівців
    Оскільки більшість систем за своєю природою складні, одним з найбільш важливих аспектів є забезпечення того, щоб системна архітектура забезпечувала мінімальне зниження продуктивності як при розробці, так і в обслуговуванні компонентів, і в той же час зменшити випадкову складність до мінімуму. Це важливо, оскільки протягом життєвого циклу системи, якщо вона не розроблена належним чином, буде все важче і важче підтримувати працездатність, і буде потрібно все більше часу і зусиль для розуміння, щоб локалізувати і усунути проблеми. Реактивні системи являють собою найбільш продуктивну системну архітектуру, в контексті багатоядерних, хмарних і мобільних архітектур:
  • Ізоляція відмов пропонує перебирання між компонентами, запобігаючи відмови від каскадування і обмежуючи обсяг і ступінь відмов.
  • Ієрархії супервайзерів пропонують кілька рівнів захисту в поєднанні з можливостями самовідновлення, що усуває безліч тимчасових відмов від будь-яких експлуатаційних витрат для розслідування.
  • Пропуск передачі повідомлень і прозорість розташування дозволяють відключати і замінювати компоненти, не зачіпаючи роботу кінцевого користувача. Це знижує вартість збоїв, їх відносну актуальність, а також ресурси, необхідні для діагностики та виправлення.
  • Реплікація знижує ризик втрати даних і зменшує вплив збою на доступність пошуку і зберігання інформації.
  • Еластичність дозволяє зберігати ресурси по мірі того, як використання коливається, що мінімізує експлуатаційні витрати при завантаженні і ризик збоїв або термінових інвестицій в масштабованість по мірі збільшення навантаження.
  • Ставлення до традиційних веб-додатками

    Реактивне програмування: поняття, навчання, особливості та поради фахівців
    Веб-додатки можуть значною мірою виграти від стилю розробки з Rx, що дозволяє скласти робочі процеси запиту-відповіді, що включають розгалуження на виклики служб, асинхронне витяг ресурсів і складання відповідей, і подальшу сортування для клієнта. Зовсім недавно push-а-серверні події і веб-сокети стали все частіше використовуватися на практиці, і для виконання цього в масштабі потрібен ефективний спосіб зберігання безлічі відкритих підключень і де IO не блокує.
    Для цього є інструменти,наприклад, Streams and Futures, які роблять простими неблокирующие і асинхронні перетворення, і підштовхує їх до клієнтів. Реактивне програмування c рівнем доступу до даних - оновлює і запитує їх в ефективному ресурсі, переважно з використанням баз даних SQL або NoSQL з асинхронними драйверами. Веб-додатки також виграють від розробки реактивної системи для таких речей, як розподілене кешування, узгодженість даних і повідомлення з декількома вузлами. Традиційні веб-додатки зазвичай використовують стоять вузли. Але як тільки програмісти починають використовувати Server-Sent-Events (SSE) і WebSockets — ці вузли стають працездатними, оскільки, як мінімум, вони підтримують стан клієнтського з'єднання, а push-повідомлення направляються до них відповідним чином. Для цього потрібна розробка реактивної системи, так як це область, де важлива адресація одержувачів допомогою обміну повідомленнями.

    Суть реактивне програмування Java

    Не потрібно обов'язково використовувати Rx в реактивних системах. Тому що Rx програмування і реактивні системи — не одне і теж. Хоча вони часто використовуються взаємозамінні терміни, але не є точними синонімами і відображають різні речі. Системи являють собою наступний рівень «реактивності». Цей рівень передбачає конкретні проектні та архітектурні рішення, які дозволяють створювати стійкі і гнучкі програми. Тим не менш дуже хороша ідея — комбінація методів — приносить ще більше переваг додатками, так як робить їх ще більш пов'язаними, дозволяє більш ефективно використовувати ресурси і забезпечує більш низьку затримку. Коли йдеться про величезні обсяги даних або багатозадачності, часто потрібна асинхронна обробка, щоб системи були швидкими і чуйними. У Java - представника старого об'єктно-орієнтованого програмування, асинхронність може стати дійсно складною і зробити код важко зрозумілим і підтримуваним. Таким чином Rx особливо корисно для цієї чисто об'єктно-орієнтованого середовища, оскільки воно спрощує роботу з асинхронними потоками. З його останніми випусками, починаючи з Java 8 сама Java зробила деякі спроби впровадити вбудовану реактивність, але ці спроби сьогодні не дуже популярні у розробників. Тим не менш, є деякі живі і регулярно обновлювані сторонні реалізації для реактивного програмування Java, які допомагають заощадити день і тому особливо цінуються розробниками Java.

    Kotlin: початковий тест продуктивності

    Реактивне програмування: поняття, навчання, особливості та поради фахівців
    У звичайному додатку для Android програмісти зазвичай неодноразово виконують деякі операції реактивного програмування з використанням RxJava, тому потрібно порівняти швидкість, використання процесора і пам'яті з тими ж операціями, які були реалізовані як з сопрограммами Kotlin, так і з RxJava. Це початковий тест продуктивності. Всякий раз, коли застосовується новий інструмент, який буде широко використовуватися у всьому кодексі, важливо зрозуміти, чи вплине воно на загальну продуктивність програми, перш ніж приймати рішення про те, наскільки доцільно використати його. Практика використання дає коротку відповідь: в більшості випадків користувачам варто подумати про заміну RxJava на співпрограми Kotlin, особливо в Android. Реактивне програмування з застосуванням RxJava може використовуватися в обмеженій кількості випадків, і в цих випадках можна змішувати, як RxJava, так і співпрограми. Прості причини:
  • Забезпечують набагато більшу гнучкість, ніж звичайне Rx.
  • Надає багатий набір операторів в колекціях, які будуть виглядати так само, як з операторами RxJava.
  • Реактивне програмування Kotlin можуть взаємодіяти при необхідності з використанням rxjava.
  • Вони дуже легкі і ефективні, враховуючи більш високий рівень використання ЦП для збору сміття зі всіх об'єктів, створених RxJava.
  • Реактивні розширення

    Reactive Extensions (ReactiveX або RX) - це бібліотека, яка слідує за принципами Rx, тобто складання асинхронних і заснованих на подіях програм з використанням спостережуваній послідовності. Ці бібліотеки надають безліч інтерфейсів і методів, які допомагають розробникам писати чистий і простий код. Реактивні розширення доступні на декількох мовах. Програмісти особливо зацікавлені в RxJava і RxAndroid, так як андроїд - це сама сфокусована область. Реактивне програмування з використанням RxJava - це реалізація Java Reactive Extension з Netflix. В основному це бібліотека, яка становить асинхронні події, дотримуючись шаблоном спостерігача. Можна створювати асинхронний трафік, перетворювати і споживати їх спостерігачем в різних потоках даних. Бібліотека пропонує широкий спектр дивовижних операторів, таких як карта, об'єднання і фільтр, які можуть бути застосовані до потоку даних. Коли програміст почне використовувати фактичні приклади коду, він дізнається більше про операторів і перетвореннях.

    Багатопоточність в додатках Android

    Android" class="if uuid-2938324" src="/misc/i/gallery/73564/2938324.jpg" /> Android реактивне програмування (RxAndroid) специфічний для платформи Android з кількома доданими класами поверх RxJava. Більш конкретно — планувальники представлені в RxAndroid (AndroidSchedulers.mainThread ()), який відіграє важливу роль у підтримці концепції багатопоточності в додатках для Android. Крім усього іншого, фахівці радять використовувати тільки бібліотеку RxJava. Навіть завдяки великій кількості планувальників, що використовуються в програмуванні для Android. Нижче наведено список планувальників і їх короткий зміст:
  • Schedulers.io () - використовується для виконання неинтенсивных операцій, таких як інтернет-дзвінки, читання дисків /файлів, операцій з базами даних і який підтримує пул потоків.
  • AndroidSchedulers.mainThread () - забезпечує доступ до основної теми Thread /UI. Зазвичай в цьому потоці відбуваються операції, такі як оновлення інтерфейсу взаємодії з користувачем. Фахівці радять користувачам, що вони не повинні виконувати будь-які інтенсивні операції над цим потоком, так як це може викликати кидок програми або діалог ANR.
  • Schedulers.newThread () використовуючи це, новий потік буде створено кожен раз, коли запланована завдання. Зазвичай пропонується не використовувати розклад для тривалих робіт. Нитки, створені з допомогою newThread (), не будуть повторно застосовуватися.
  • Schedulers.computation () - цей графік може застосовуватися для виконання інтенсивних операцій з процесором, по обробці величезних даних центру реактивного програмування, обробка растрових зображень. Кількість потоків, створених з використанням цього планувальника, повністю залежить від кількості доступних ядер ЦП.
  • Schedulers.single () - цей планувальник виконає всі завдання в такому порядку, що можна використовувати, коли потрібно необхідність послідовного виконання.
  • Schedulers.immediate () - цей планувальник виконує завдання негайно, одночасно блокуючи основний потік.
  • Schedulers.trampoline () - виконує завдання в режимі First In-First Out. Всі заплановані завдання будуть виконуватися одна за одною, обмежуючи кількість потоків фону одним.
  • Schedulers.from () - дозволяє створювати планувальник від виконавця, обмежуючи кількість створюваних потоків. Коли пул потоків зайнятий, завдання будуть поставлені в чергу.
  • Основні приклади RxJava

    Тепер, коли є хороші теоретичні знання про RxJava і RxAndroid, можна перейти до деяких прикладів коду, щоб краще зрозуміти концепцію. Для початку роботи потрібно додати залежності RxJava і RxAndroid до проектів build.gradle і синхронізувати проект. Основні етапи.
    Реактивне програмування: поняття, навчання, особливості та поради фахівців
    Програмування.
    Реактивне програмування: поняття, навчання, особливості та поради фахівців
    Observer підписують на Вами, щоб він міг почати отримувати дані, використовуючи два методи:
  • SubscribeOn (Schedulers.io ()) - говорить Вами, щоб запустити задачу у фоновому потоці.
  • ObservOn (AndroidSchedulers.mainThread ()) - вказує Observer отримувати дані в потоці користувальницького інтерфейсу Android.
  • Реактивне програмування: поняття, навчання, особливості та поради фахівців
    Ось і все, таким чином програміст зможе написати свою першу програму реактивного програмування з RxJava. Підприємства і постачальники проміжного програмного забезпечення почали використовувати Reactive, а в 2016 -2018 роках спостерігався величезний зростання корпоративної зацікавленості в прийнятті цієї парадигми. Rx пропонує продуктивність для розробників завдяки ресурсоефективності на рівні компонентів для внутрішньої логіки і перетворення потоку даних, в той час, як реактивні системи пропонують продуктивність для архітекторів і DevOps, завдяки стійкості й еластичності на рівні системи. Вони застосовуються для створення «Cloud Native» та інших широкомасштабних розподілених систем. На практиці також широко використовують книги про реактивному програмування Java з методами дозволяють комбінувати принципів проектування реактивних систем.