ORIGINAL SOURCE: http://www.coopsoft.com/ar/ReactiveArticle.html

Генератор / дистрибутер на реактивен тек на Java

Реактивно програмирање е мејнстрим. Дури и Java9 вклучува интерфејси кои поддржуваат рамка за објавување и претплата на реактивни струи (JEP 266.) Реактивно програмирање е програмирање со асинхрони текови на податоци. Овој вовед не го опфаќа основното прашање за тоа како да креирате / дистрибуирате прилив на настани. Откако ќе го имате потокот, има сеприсутни програми за справување со потокот. Креирање / дистрибуција на поток е предмет на овој напис. (1100 зборови)
 

Едвард Харен (eh at coopsoft dot com, @ed_harned)
Виш развивач, кооперативни софтверски системи, Inc.
Октомври 2015 година [ажурирано јануари 2018]

Предговор

  1. Едноставен проблем бара едноставно решение.

    За еден претплатник со услов за притисок, еден Издавач може да управува со тој претплатник. Еден издавач исто така може да управува со повеќе претплатници, сите со ист услов за притисок.

    single subscriber/publisher  single subscriber/publisher ... single subscriber/publisher multiple subscriber/publisher
  2. Сложениот проблем бара повеќе размислување.

Кога на повеќе претплатници со различни барања (да речеме различни побарувања за филтрирање) им треба ист асинхрон тек, тогаш еден Издавач со повеќе навои за работа може да управува со тие претплатници.

single subscriber/publisher with multiple threads

Меѓутоа, кога има многу (десетици / стотици) претплатници, тогаш има потреба од подобро решение.

  1. Далечен, комплексен проблем бара уште повеќе размислување.

Кога повеќе претплатници престојуваат на различни локации, а Издавачот престојува одвоено од останатите, тогаш тоа е сосема нова игра со топки.

remote subscriber/publisher with multiple threads

Секој претплатник и издавач живеат во свој JVM. Повеќе издавачи, толку повеќе JVM. Кога има многу (десетици / стотици) издавачи, тогаш има потреба од подобро решение.

  1. Сложениот проблем бара најмногу размислување.

Кога постои комбинација на еден претплатник, мулти-претплатник, комплексен и оддалечен претплатник и има многу (десетици / стотици) од овие претплатници и издавачи, тогаш има потреба од уникатно решение.

single subscriber/publisher  single subscriber/publisher ... single subscriber/publisher    multiple subscriber/publisher   multiple subscriber/publisher with threads  remote subscriber/publisher with multiple threads

Проблемот

Многу издавачи значат многу JVM. Имањето еден-на-еден кога има стотици издавачи може да резултира во состојба на ресурс.

Многу издавачи кои живеат во истата JVM бараат метод за следење на тие издавачи. Кога на секој издавач му е потребна нишка, може да резултира со излез од состојбата на ресурсите.

Рамка на Java9 Flow (JEP 266) со SubmissionPublisher Class е премногу ефикасен во плукање на Предмети за задачите на потрошувачите, но неговото прекумерно создавање на Оbject () може да резултира во Грешки надвор од меморијата. (Може да го преземете изворниот код за демо што користи SubmissionPublisher: DemoOut.java подолу.)

На кој било начин да го погледнете, волуменот менува сè.

Решението

Клучот за успех е создавање полу-постојана Задача за секој претплатник (претплатник-предмет.) Издавачот ја турка операцијата директно до редот на претплатникот-предмет; нема потреба од создавање нова задача. Предмет на претплатник потоа ги испраќа поттикнатите предмети до Претплатникот, локално или од далечина. Секоја задача извршува во ефикасна микросервиса со повеќе задачи со добро управувани нишки. Cлика вреди илјада зборови.

Tymeac за генерирање реактивен тек е решението за следење на повеќекратни операции на притискање од кој било број на издавачи со најмалку количества нишки.

Тајмак е

  1. Ефикасна услуга за повеќе задачи која им овозможува на многу апликации интензивни на ресурси да коегзистираат во една микро услуга.

  2. Ефикасен притисок мотор дозволува (Реактивен тек) Издавачите ќе генерираат асинхрони потоци за рутирање на претплатници. Tymeac не е самиот „издавач“. Меѓутоа, Бидејќи Издавачот ја извезува претплатата за претплата (филтер, итн.) Во Задачи, Издавачот може да работи како Tymeac Task и не треба да врзе нишка.

  3. 100% чист Java притисок мотор. Tymeac не се потпира на пакетите однадвор на мултитаскар. Без преработувачи, нема време на траење, нема ограничувања за хардверот. Ако вашата апликација работи на Java SE, таа работи без никакви измени или дополнителни преземања со Tymeac.

  4. Флексибилен мотор на притисок кој поддржува не блокирачко притискање наназад. Може да откажете (со причина), да паузирате / продолжите и да ја менувате секоја апликација во секое време.

  5. Еластичен притисок на моторот кој поддржува повеќе сценарија за тајмаут за да се справат со неодговорни апликации.

  6. Подвижен придвижуван мотор бидејќи Задачите се одвоени од навои.

  7. Целосен опремен мотор со притисок. Tymeac доаѓа со деветнаесет JavaFX GUI и пристап до програмата на клиентот, за да можете да ги надгледувате / менувате извршувањето на барањето и серверот. И уште пет JavaFX GUI за поставување на заднина.

                        Tymeac Menu
     

  8. Прилагодлив притисок на моторот. Секој ред и нишка има структура на управување за да го олесни подесувањето.

  9. Разноврсен мотор со притисок со поддршка за локален пристап (ист JVM) и далечински пристап (RMI).

  10. Добро документиран притисок на моторот. Додека JavaDoc е убаво за API, професионалната микро услуга бара професионална документација.


Tymeac поддржува и комунална и различна обработка.

Како работи комуналната обработка:

Комунална значи заедница. Во заедница, играчите играат убаво едни со други. Оние што не играат убаво го уништуваат за секого. Ако некој играч не игра убаво, тогаш тој играч спаѓа во "различни" игралиште.

Задачата е срцето на обработка. Задача ги содржи променливите / методите Tymeac треба да бара повеќе задачи. Сите класи на корисници мора да ја прошират оваа класа. Задача може да биде

  • активно пресметување струја или
  • временско чекање на ресурс (пристап до база на податоци / датотеки, пристап до Интернет или друг пристап до услугата) Истекувањето на времето е начин да се справи со пристапите кои не одговараат,
  • чекајќи да се заврши испраќањето (onNext, итн.)

Додека таа задача чека нешто, Тајмек може да ја стави задачата во суспензија ослободувајќи ја низата за друга работа. Ова е едноставно управување со задачи што повеќето оперативни системи го користат за да закажат работа на процесорите. Tymeac не може да направи прекинувач за контекст. Tymeac се потпира на Задачата што соработува со поставувањето Task во очекување на дејствието (треба испраќање, треба ресурс) и враќање од повикот на методот наместо блокирање.

Tymeac користи три редици: активни, испраќање и суспендирани. Секоја редица има посветен базен со нишки.

Active Queue Sending Queue Suspended Queue

На Активен ред е за темите да ги донесат Задачите [ниско користење на процесорот Издавачи и претплатници-предмети], така што задачите можат да го пресметаат она што го прават. Кога на задачата му е потребен ресурс, Задачата започнува со асинхрониот пристап, поставува проценето време на одложување, за кое верува дека пристапот може да трае (акцијата што чека во тек е одложување за да се очекува завршување) и се враќа, освен ако не треба да испраќа податоци. Кога Задачата треба да испрати поток (onNext, итн.), Задача поставува испраќање (во очекување на акција) и се враќа. Ако има испраќање во тек, Tymeac ја преместува задачата до Испраќање на редицата. Ако нема испраќање во тек, но има задоцнување во очекување на Tymeac ја поместува задачата до Суспендиран ред.

На Суспендиран ред е за темите да ги превземат Задачите и да го користат претплатникот <T> за да го испратите асинхрониот поток (на следниот / Грешка / Завршено.) Штом испраќањето ќе заврши, Тајмакот ја поместува задачата назад кон Активен ред, или, ако сè уште има задоцнување, Тајмак ја преместува задачата до Суспендиран ред.

На Суспендиран ред е да чекате да се заврши настанот (одложување до истекот или еден од оние асинхрони пристапи да се заврши.) Штом настанот ќе заврши, Tymeac ја враќа задачата назад кон Активен / различен ред.

На овој начин Задачите соработуваат со други Задачи со тоа што не се врзуваат нишки со блокирачки повици. Пресметајте го тоа што ви треба. Опуштете ја низата кога треба да почекате. Системот може да поддржува стотици / илјадници активни барања со само неколку теми.

Колку работи различна обработка:

Tymeac користи една редица: Различни. Редицата има посветен базен со нишки.

На Различен ред е за [издавач на висока употреба на процесорот] Задачи да направат сè што прават; пристап до ресурси, почекај за тие ресурси. Задачите не можат да ги испраќаат со задача на испраќање. Задачите секако може да извршат каква било комуникација што им е потребна, само не користејќи го редот на испраќање, тоа е само за комунални задачи. Откако овде, тие ќе останат тука сè додека барањето не заврши. Разликата помеѓу општата нишка на базенот и обработката на „Дистинкција“ е во тоа што Tymeac управува со упорност, пораки, редици, редови, откривање и обновување на тезги, рекурзија, сеча, статистика, кориснички интерфејс и многу повеќе.

Слика од решението, погоре:

Легенда

SubscriberSubscriberSubscriber Претплатници
subscriber-objectsubscriber-objectsubscriber-object Предмет на претплатници што работат како Задачи на Тјемак.
Кодот што претплатниците го користат за да го повикаат Издавачот или директно да го повикаат Tymeac.
Publisher Издавачи што работат како Задачи на Тајмак.
Tymeac Тајмак
Communal Редица на задачи за комунални услуги / Теми на Tymeac.
Distinct Покажи задача за одредување на задачи / Теми на Tymeac.

Слика

local JVM      Remote JVM
            Локален JVM                                               Далечински JVM

Заклучок

Ако ви треба безбеден, сигурен, управувачки и толерантен на грешки Асинхрон струја градител / дистрибутер за какви било намени и не сакате да започнете на почетокот дизајнирање и тестирање на себе, тогаш ви треба Tymeac.

Референци

Преземете го изворниот код за статијата овде.

Преземете го проектот од SourceForge.net, проект: TymeacRSE

JEP 266
http://openjdk.java.net/jeps/266

Вовед во реактивно програмирање
https://gist.github.com/staltz/868e7e9bc2a7b8c1f754

Реактивни струи org
http://www.reactive-streams.org/

за авторот

Ед Харен е развивач на софтвер со повеќе од триесет години искуство во индустријата. Тој прво водеше проекти како вработен во поголемите индустрии, а потоа работеше како независен консултант. Денес, Ед е висок развивач во Кооперативни софтверски системи, Inc., каде што, во последните осумнаесет години, тој го користел програмирањето Java to за да донесе паралелни решенија за широк спектар на задачи.

© 2015 - 2017  E.P. Harned  Сите права се задржани