BPM maitiro ekubatanidza

BPM maitiro ekubatanidza

Mhoroi Habr!

Kambani yedu inoshanda mukuvandudza ERP-kirasi software mhinduro, iyo shumba inogarwa nematransaction masisitimu ane huwandu hukuru hwebhizinesi logic uye gwaro rinoyerera la EDMS. Mavhezheni azvino ezvigadzirwa zvedu akavakirwa paJavaEE tekinoroji, asi isu tiri kushingaira kuedza nemicroservices. Imwe yenzvimbo dzinonyanya kunetsa dzemhinduro dzakadaro kubatanidzwa kweakasiyana masisitimu ari ematunhu ari padyo. Matambudziko ekubatanidza agara achitipa musoro wakakura, zvisinei nemagadzirirwo ezvitaera, matekinoroji uye marongero atinoshandisa, asi munguva pfupi yapfuura kwave nekufambira mberi mukugadzirisa matambudziko akadai.

Muchinyorwa chandinounza kwauri, ndichataura nezve ruzivo uye tsvakiridzo yekuvaka iyo NPO Krista inayo munzvimbo yakatarwa. Isu tichatarisawo muenzaniso wemhinduro yakapusa kune dambudziko rekubatanidza kubva pakuona kwemugadziri wekushandisa uye toona chakavanzika kuseri kwekureruka uku.

Disclaimer

Zvigadziriso zvekugadzira uye zvehunyanzvi zvinotsanangurwa muchinyorwa zvinokurudzirwa neni zvichibva pane ruzivo rwemunhu mumamiriro ezvinhu emamwe mabasa. Aya mhinduro haataure kuti ndeyepasirese uye anogona kunge asina kunaka pasi pemamwe mamiriro ekushandiswa.

BPM ine chekuita nei nazvo?

Kuti tipindure mubvunzo uyu, isu tinofanirwa kuongorora zvakadzama mune chaiyo yeanoshandiswa matambudziko emhinduro dzedu. Chikamu chikuru chebhizinesi repfungwa mune yedu yakajairwa transactional system iri kupinda data mudhatabhesi kuburikidza nemushandisi interface, manyorero uye otomatiki ongororo yeiyi data, kuiitisa kuburikidza nekumwe kufambiswa kwebasa, kuishambadzira kune imwe system / analytical dhatabhesi / archive, ichigadzira mishumo. . Nekudaro, iro rakakosha basa rehurongwa hwevatengi ndiko otomatiki kwemaitiro avo emukati bhizinesi.

Kuti zvive nyore, isu tinoshandisa izwi rekuti "gwaro" mukukurukurirana seimwe yekubvisa seti yedata yakabatanidzwa nekiyi yakajairwa iyo kumwe kufambiswa kwebasa kunogona "kubatanidzwa".
Asi zvakadini nekubatanidza pfungwa? Mushure mezvose, basa rekubatanidza rinogadzirwa nekuvakwa kweiyo system, iyo "yakachekwa" kuita zvikamu KWETE pakukumbira kwemutengi, asi pasi pesimba rezvinhu zvakasiyana zvachose:

  • pasi pemutemo waConway;
  • nekuda kwekushandisazve subsystems dzakambogadzirwa kune zvimwe zvigadzirwa;
  • pakufunga kwemugadziri, zvichibva pane zvisiri zvekushanda zvinodiwa.

Pane muyedzo wakakura wekuparadzanisa kusanganisa mantiki kubva kune bhizinesi logic yeiyo main workflow, kuti usasvibise iyo bhizinesi pfungwa nekubatanidza zvigadzirwa uye chengetedza mugadziri wekushandisa kubva pakudiwa kwekuongorora mukati mezvimiro zvenzvimbo yekuvaka yehurongwa. Iyi nzira ine mabhenefiti akati wandei, asi kudzidzira kunoratidza kusashanda kwayo:

  • kugadzirisa matambudziko ekubatanidza kazhinji kunowira kumashure kune zvakapusa sarudzo muchimiro chekufona kwechinofanana nekuda kweiyo shoma yekuwedzera mapoinzi mukushandiswa kweiyo huru yekufambisa basa (zvisina kunaka zvekubatanidzwa kwe synchronous zvinokurukurwa pazasi);
  • kubatanidza zvigadzirwa zvichiri kupinda mukati meiyo bhizinesi logic kana mhinduro kubva kune imwe subsystem ichidikanwa;
  • mushandisi wekushandisa anoregeredza kubatanidzwa uye anogona kuripwanya nyore nyore nekushandura mafambiro ebasa;
  • iyo sisitimu inomira kuita imwe chete kubva pakuona kwemushandisi, "seams" pakati pe subsystems inooneka, uye kusashanda kwevashandisi kunoonekwa, kutanga kutamisa data kubva kune imwe subsystem kuenda kune imwe.

Imwe nzira ndeyekufunga kusanganisa kupindirana sechikamu chakakosha cheiyo yakakosha bhizinesi logic uye mafambiro ebasa. Kudzivirira zvikumbiro zvemugadziri wekushandisa kubva mudenga, kugadzira kutsva kwekubatanidza kunofanirwa kuve kuri nyore uye kusashanda, nemukana mudiki wekusarudza mhinduro. Izvi zvakaoma kuita pane zvazvinoita: chishandiso chinofanira kunge chakasimba zvakakwana kuti chipe mushandisi akasiyana anodiwa esarudzo dzekushandisa, pasina kumutendera kuti "azvipfure mutsoka." Pane mibvunzo mizhinji iyo mainjiniya anofanira kupindura mumamiriro ezvinhu ekubatanidza mabasa, asi iyo mugadziri wekushandisa haafanire kufunga nezvayo mubasa rake rezuva nezuva: miganhu yekutengeserana, kuwirirana, atomicity, chengetedzo, kuyera, mutoro uye kugovera zviwanikwa, routing, marshaling, kugovera uye kushandura mamiriro, nezvimwe. Izvo zvinodikanwa kupa vanogadzira maapplication zviri nyore nyore mhinduro matemplate umo mhinduro dzemibvunzo yese yakadai dzakatovigwa. Aya matemplate anofanirwa kuve akachengeteka: bhizinesi logic inoshanduka kazhinji, izvo zvinowedzera njodzi yekuunza zvikanganiso, mutengo wekukanganisa unofanirwa kuramba uri padanho rakaderera.

Asi BPM inei nazvo? Pane zvakawanda zvingasarudzwa zvekushandisa workflow...
Chokwadi, kumwe kuitiswa kwemaitiro ebhizinesi kwakakurumbira mumhinduro dzedu - kuburikidza netsanangudzo inotsanangudza yedhiyagiramu yeshanduko yenyika uye kubatana kwevanobata vane bhizinesi logic yekuchinja. Muchiitiko ichi, hurumende inosarudza nzvimbo yezvino ye "gwaro" muhutano hwebhizimisi hunhu hwe "gwaro" pacharo.

BPM maitiro ekubatanidza
Izvi ndizvo zvinoita maitiro ekutanga kweprojekiti

Kuzivikanwa kwekuita uku kunokonzerwa nekureruka uye nekukurumidza kwekugadzira mutsara bhizinesi maitiro. Nekudaro, sezvo masoftware masisitimu anoramba achiwedzera kuoma, iyo otomatiki chikamu chebhizinesi maitiro inokura uye inova yakaoma. Pane kudiwa kwekuora, kushandiswazve kwezvikamu zvemaitiro, pamwe chete nematanho ekugadzirisa mapazi kuitira kuti bazi rimwe nerimwe riitwe zvakafanana. Pasi pemamiriro ezvinhu akadaro, chishandiso chinova chinokanganisa, uye dhizaini yeshanduko yehurumende inorasikirwa neruzivo rwayo (kusanganisa kupindirana hakuratidzwi mudhayagiramu zvachose).

BPM maitiro ekubatanidza
Izvi ndizvo zvinoita maitiro mushure mekudzokorora kwakati wandei kwezvinodiwa kujekeswa.

Nzira yekubuda mumamiriro ezvinhu aya yaive kubatanidzwa kweinjini jBPM mune zvimwe zvigadzirwa zvine maitiro akaomarara ebhizinesi. Nenguva pfupi, mhinduro iyi yakave nebudiriro: zvakave zvichigoneka kuita mabhizinesi akaomarara uku uchichengeta dhayagiramu ine ruzivo uye yakakodzera mune notation. BPMN2.

BPM maitiro ekubatanidza
Chikamu chiduku chekushanda kwebhizimisi rakaoma

Nekufamba kwenguva, mhinduro haina kurarama maererano nezvaitarisirwa: kusimba kwepamusoro kwekushanda kwekugadzira bhizinesi maitiro kuburikidza nemidziyo yekuona haina kubvumira kuwana zvinogamuchirika zviratidzo zvekugadzira, uye chishandiso pachacho chakava chimwe chevakanyanya kusada pakati pevagadziri. Paivawo nekunyunyuta pamusoro pechimiro chemukati chejini, izvo zvakaita kuti pave nekuonekwa kwe "zvigamba" zvakawanda uye "madondoro".

Chinhu chikuru chakanaka chekushandisa jBPM kwaive kuziva mabhenefiti uye kukuvadza kwekuve nebhizinesi maitiro emamiriro ega anoshingirira. Isu takaona zvakare mukana wekushandisa maitiro ekutemesa akaomesesa ekubatanidza mapuroteni pakati pezvishandiso zvakasiyana uchishandisa asynchronous kupindirana kuburikidza nemasaini nemameseji. Kuvepo kwechimiro chinoshingirira kunoita basa rakakosha mune izvi.

Kubva pane zviri pamusoro, tinogona kugumisa: Maitiro ekuita muchimiro cheBPM anotibvumira kugadzirisa huwandu hwemabasa ekuita otomatiki ari kuwedzera kuomarara mabhizinesi maitirwo, zvinopindirana kuenderana zviitiko zvekubatanidza mune aya maitiro uye kuchengetedza kugona kuratidza nemeso maitiro akaitwa mune yakakodzera notation.

Kuipa kwekufona kwe synchronous senzira yekubatanidza

Synchronous yekubatanidza inoreva kune yakapusa kuvharira kufona. Imwe subsystem inoshanda sedivi reseva uye inoburitsa iyo API nenzira inodiwa. Imwe subsystem inoita sedivi remutengi uye panguva yakakodzera inofona uye inomirira mhedzisiro. Zvichienderana nehurongwa hwekuvaka, mutengi uye maseva mativi anogona kuwanikwa mune imwechete application uye maitiro, kana mune akasiyana. Muchiitiko chechipiri, iwe unofanirwa kushandisa imwe RPC kuita uye kupa marshalling yemaparamita uye mhedzisiro yekufona.

BPM maitiro ekubatanidza

Iyi pateni yekubatanidza ine yakaringana yakakura seti yezvisina kunaka, asi inoshandiswa zvakanyanya mukuita nekuda kwekureruka kwayo. Iko kumhanya kwekuita kunokwezva uye kunokumanikidza kuti uishandise zvakare uye zvakare pamberi pekudzvanya mazuva ekupedzisira, kurekodha mhinduro sechikwereti chehunyanzvi. Asi zvinoitikawo kuti vagadziri vasina ruzivo vanoishandisa vasingazivi, vasingazivi migumisiro yakaipa.

Pamusoro pekuwedzera kuri pachena kweiyo subsystem yekubatanidza, kune zvakare zvishoma zviri pachena matambudziko ne "kukura" uye "kutambanudza" kutengeserana. Chokwadi, kana pfungwa yebhizinesi ikaita shanduko, saka kutengeserana hakugone kudzivirirwa, uye kutengeserana, kunovhara zvimwe zviwanikwa zvekushandisa zvakakanganiswa nekuchinja uku. Ndokunge, kudzamara imwe subsystem yakamirira mhinduro kubva kune imwe, haizokwanisi kupedzisa kutengeserana uye kubvisa makiyi. Izvi zvakanyanya kuwedzera njodzi yezvakasiyana mhedzisiro:

  • Kupindura kwehurongwa kwakarasika, vashandisi vanomirira kwenguva yakareba mhinduro kune zvikumbiro;
  • sevha kazhinji inomira kupindura kune zvikumbiro zvevashandisi nekuda kwedziva reshinda rakawandisa: tambo zhinji dzakavharirwa pane sosi inobatwa nekutengesa;
  • Deadlocks inotanga kuoneka: mukana wekuitika kwavo zvakanyanya zvinoenderana nenguva yekutengeserana, huwandu hwebhizinesi logic uye makiyi anobatanidzwa mukutengeserana;
  • zvikanganiso zvenguva yekutengeserana zvinoonekwa;
  • sevha "inokundikana" neOutOfMemory kana basa racho richida kugadziriswa uye kushandura huwandu hwe data, uye kuvapo kwekubatanidzwa kwe synchronous kunoita kuti zvive zvakaoma kuparadzanisa kushandiswa mu "lighter" transactions.

Kubva pakuona kwekuvaka, kushandiswa kwekuvhara mafoni panguva yekubatanidza kunotungamira mukurasikirwa kwekutonga pamusoro pemhando yega subsystems: hazvibviri kuve nechokwadi chetariro yemhando yezviratidzo zveimwe subsystem mukuparadzaniswa kubva kune yemhando zviratidzo zveimwe subsystem. Kana ma subsystems akagadzirwa nezvikwata zvakasiyana, iri idambudziko hombe.

Zvinhu zvinowedzera kunakidza kana ma subsystems ari kubatanidzwa ari mune akasiyana maapplication uye iwe unofanirwa kuita shanduko dzinoenderana pamativi ese. Nzira yekuona sei transactional yekuchinja uku?

Kana shanduko dzakaitwa mukutengeserana kwakasiyana, ipapo iwe uchafanirwa kupa yakavimbika yekusarudzika kubata uye muripo, uye izvi zvinobvisa zvachose kubatsirwa kukuru kwekubatanidzwa kwe synchronous - nyore.

Kugoverwa kwekutengeserana kunouyawo mupfungwa, asi isu hatizvishandise mumhinduro dzedu: zvakaoma kuona kuvimbika.

"Saga" semhinduro kune dambudziko rekutengesa

Nekuwedzera kukurumbira kwemamicroservices, kudiwa kwe Sravana Sameeralu Serial XNUMXth Saga Pattern.

Iyi pateni inogadzirisa zvakakwana matambudziko ataurwa pamusoro pekutengeserana kwenguva refu, uye zvakare inowedzera kugona kwekutonga mamiriro ehurongwa kubva kudivi rebhizinesi logic: muripo mushure mekutadza kwekutengeserana haugone kudzosera system kune yayo yekutanga, asi kupa. imwe nzira yekugadzirisa data. Izvi zvakare zvinokutendera iwe kuti udzivise kudzokorora zvakabudirira kupedza data kugadzirisa matanho paunenge uchiedza kuunza maitiro kumagumo "akanaka".

Sezvineiwo, mune monolithic masisitimu iyi pateni yakakoshawo kana zvasvika pakubatanidzwa kweyakasununguka yakabatana subsystems uye yakaipa mhedzisiro inokonzerwa nekureba-ichimhanya kutengeserana uye inoenderana zvigadziriso zvivharo zvinoonekwa.

Zvichienderana nemaitiro edu ebhizinesi muBPM maitiro, zvinova nyore kwazvo kushandisa "Sagas": nhanho dzega dze "Saga" dzinogona kutsanangurwa sezviitwa mukati mebhizinesi maitiro, uye inoenderera mamiriro ebhizinesi maitiro zvakare. inogadzirisa mamiriro emukati e "Saga". Ndiko kuti, isu hatidi chero yekuwedzera coordination mechanism. Zvese zvaunoda meseji broker inotsigira "kamwe kamwe" inovimbisa seyekufambisa.

Asi iyi mhinduro inewo yayo "mutengo":

  • Bhizinesi pfungwa inova yakaoma kunzwisisa: muripo unoda kugadziriswa;
  • zvichave zvakakosha kusiya kuenderana kwakazara, izvo zvinogona kunyanya kunzwisiswa kune monolithic masisitimu;
  • Iyo dhizaini inova yakanyanya kuoma, uye chimwe chinodiwa chemeseji broker chinooneka;
  • mamwe maturusi ekutarisa uye ekutonga achadikanwa (kunyangwe kazhinji izvi zvakanaka: mhando yebasa rehurongwa huchawedzera).

Kune monolithic masisitimu, kururamisa kwekushandisa "Sag" hakusi pachena. Kune ma microservices uye imwe SOA, uko kunowanzo kunge kwatove nebroker, uye kuenderana kwakazara kunobairwa pakutanga kweprojekiti, mabhenefiti ekushandisa iyi pateni anogona kupfuudza zvakanyanya kuipa, kunyanya kana paine API iri nyore pane bhizinesi logic. level.

Encapsulating bhizinesi pfungwa mune microservices

Patakatanga kuyedza ne microservices, mubvunzo unonzwisisika wakamuka: kupi kwekuisa iyo domain bhizinesi logic zvine chekuita nesevhisi inovimbisa kushingirira kwedomeni data?

Kana uchitarisa magadzirirwo eakasiyana BPMSs, zvingaite sezvine musoro kuparadzanisa bhizinesi logic kubva pakushingirira: gadzira dhizaini yepuratifomu uye domain-yakazvimirira mamicroservices anoumba nharaunda uye mudziyo wekuita domain bhizinesi logic, uye gadzira kuenderera kwedome data senge. chikamu chakasiyana chezvakareruka uye lightweight microservices. Maitiro ebhizinesi mune iyi kesi anoita orchestration yemasevhisi ekushingirira layer.

BPM maitiro ekubatanidza

Iyi nzira ine mukana wakakura kwazvo: iwe unogona kuwedzera mashandiro epuratifomu sezvaunoda, uye chete iyo inoenderana layer yeplatform microservices ichava "mafuta" kubva pane izvi. Maitirwo ebhizinesi kubva kune chero dura anongokwanisa kushandisa iyo nyowani mashandiro epuratifomu nekukurumidza painovandudzwa.

Ongororo yakadzama yakaratidza kusakosha kwakanyanya kweiyi nzira:

  • sevhisi yepapuratifomu inoita iyo bhizinesi logic yenzvimbo dzakawanda panguva imwechete inotakura njodzi huru sechinhu chimwe chekutadza. Kuwanzochinja kune bhizinesi logic kunowedzera njodzi yezvikanganiso zvinotungamira kune system-yakawanda kutadza;
  • kuita nyaya: bhizinesi logic inoshanda nedata rayo kuburikidza neyakamanikana uye inononoka interface:
    • iyo data ichave zvakare yakarongedzwa uye kupomba kuburikidza netiweki stack;
    • domain sevhisi inowanzopa data rakawanda kupfuura rinodiwa kuti bhizinesi logic igadziriswe nekuda kwekusakwana kugona kweparameterizing zvikumbiro pamwero wekunze API yesevhisi;
    • akati wandei akazvimirira zvidimbu zvebhizinesi zvine musoro zvinogona kudzokorodza kukumbirazve iyo yakafanana data yekugadzirisa (dambudziko iri rinogona kudzikiswa nekuwedzera zvikamu zvesesheni izvo cache data, asi izvi zvinowedzera kuomesa dhizaini uye zvinogadzira matambudziko ekukoshera kwedata uye kusashanda kwecache);
  • matambudziko ekutengeserana:
    • maitiro ebhizimisi ane hurumende inopfuurira, iyo inochengetwa nesevhisi yepapuratifomu, haienderani nedhesi data, uye hapana nzira dziri nyore dzekugadzirisa dambudziko iri;
    • kuisa domain data ichivharira kunze kwekutengeserana: kana iyo domain bhizinesi logic inoda kuita shanduko mushure mekutanga kutarisa kurongeka kweiyo data iripo, zvinodikanwa kusabvisa mukana wekuchinja kwemakwikwi mune yakagadziriswa data. Kunze kwekuvhara data kunogona kubatsira kugadzirisa dambudziko, asi mhinduro yakadaro inotakura dzimwe njodzi uye inoderedza kuvimbika kwese kwehurongwa;
  • mamwe matambudziko kana uchigadziridza: mune dzimwe nguva, iyo yekushingirira sevhisi uye bhizinesi logic inoda kuvandudzwa synchronously kana mukutevedzana kwakasimba.

Pakupedzisira, taifanira kudzokera kune zvakakosha: encapsulate domain data uye domain bhizinesi logic mune imwe microservice. Iyi nzira inorerutsa maonero eiyo microservice sechinhu chakakosha cheiyo system uye haipe matambudziko ari pamusoro apa. Izvi zvakare hazvipihwe mahara:

  • API yakajairwa inodiwa pakudyidzana nebhizinesi logic (kunyanya, kupa mushandisi zviitiko sechikamu chebhizinesi maitiro) uye API papuratifomu masevhisi; inoda kutarisisa zvakanyanya kune shanduko yeAPI, kumberi uye kumashure kuenderana;
  • zvinodikanwa kuwedzera mamwe maraibhurari ekumhanya kuti ave nechokwadi chekushanda kwebhizinesi logic sechikamu chega yega microservice yakadaro, uye izvi zvinopa kusimuka kune zvitsva zvinodikanwa kumaraibhurari akadaro: kureruka uye kushomeka kwekutsamira;
  • Vagadziri vebhizinesi vane hunyanzvi vanofanirwa kutarisa shanduro dzeraibhurari: kana microservice isati yapedzwa kwenguva yakareba, saka inogona kunge iine vhezheni yechinyakare yemaraibhurari. Ichi chinogona kuve chipingamupinyi chisingatarisirwe pakuwedzera chinhu chitsva uye zvingangoda kutamisa bhizinesi rekare logic yesevhisi yakadaro kuenda kushanduro itsva dzemaraibhurari kana paine shanduko dzisingaenderane pakati peshanduro.

BPM maitiro ekubatanidza

Mutsara wemasevhisi epuratifomu uripowo mukuvaka kwakadai, asi iyi layer haichagadziri mudziyo wekuita domain bhizinesi logic, asi nharaunda yayo chete, inopa anobatsira "platform" mabasa. Yakadaro dhizaini inodiwa kwete chete kuchengetedza huremu hunhu hwedomasi microservices, asiwo kuisa pakati manejimendi.

Semuenzaniso, zviitiko zvevashandisi mumabhizinesi maitiro zvinogadzira mabasa. Nekudaro, kana uchishanda nemabasa, mushandisi anofanirwa kuona mabasa kubva kune ese madomasi mune yakajairika runyorwa, izvo zvinoreva kuti panofanirwa kunge paine inoenderana papuratifomu basa rekunyoresa sevhisi, yakacheneswa yedomendi bhizinesi logic. Kuchengeta encapsulation yebhizinesi logic mumamiriro ezvinhu akadaro kunetse, uye uku ndiko kumwe kukanganisa kweiyi dhizaini.

Kubatanidzwa kwebhizinesi maitiro kuburikidza nemeso emugadziri wekushandisa

Sezvambotaurwa pamusoro, mugadziri weapplication anofanirwa kubviswa kubva kune tekinoroji uye mainjiniya maficha ekuita kupindirana kwezvishandiso zvakati wandei kuitira kuti munhu agone kuvimba nebudiriro yakanaka yebudiriro.

Ngatiedzei kugadzirisa dambudziko rakaoma rekubatanidza, rakagadzirirwa chinyorwa. Iri richava "mutambo" basa rinosanganisira matatu maapplication, apo imwe neimwe yadzo inotsanangura rimwe zita rezita: "app1", "app2", "app3".

Mukati mese application, mabhizinesi maitiro anotangwa anotanga "kutamba bhora" kuburikidza nebhazi rekubatanidza. Mameseji ane zita rekuti "Bhora" achaita sebhora.

Mitemo yemutambo:

  • mutambi wekutanga ndiye muvambi. Anokoka vamwe vatambi kumutambo, anotanga mutambo uye anogona kuupedza chero nguva;
  • vamwe vatambi vanozivisa kubatanidzwa kwavo mumutambo, "kuziva" mumwe nemumwe uye mutambi wekutanga;
  • mushure mekugamuchira bhora, mutambi anosarudza mumwe mutambi anotora chikamu uye anotambidza bhora kwaari. Huwandu hwese hwekutapurirana hunoverengwa;
  • Mutambi wega wega ane "simba" iro rinodzikira nekupfuura kwega kwebhora nemutambi iyeye. Apo simba rinopera, mutambi anosiya mutambo, achizivisa kurega kwake;
  • kana mutambi akasiyiwa ari oga, anobva angozivisa kuenda kwake;
  • Kana vatambi vese vabviswa, mutambi wekutanga anoti mutambo wapera. Kana akakurumidza kusiya mutambo, anoramba achitevera mutambo kuti aupedze.

Kugadzirisa dambudziko iri, ini ndichashandisa DSL yedu yebhizinesi maitiro, izvo zvinotitendera kutsanangura iyo logic muKotlin compactly, ine hushoma hwe boilerplate.

Iyo bhizinesi maitiro emutambi wekutanga (aka iye akatanga mutambo) achashanda muapp1 application:

kirasi InitialPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.constraint.UniqueConstraints
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.dsl.taskOperation
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList : ArrayList<PlayerInfo>()

// Π­Ρ‚ΠΎ класс экзСмпляра процСсса: инкапсулируСт Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС
class InitialPlayer : ProcessImpl<InitialPlayer>(initialPlayerModel) {
    var playerName: String by persistent("Player1")
    var energy: Int by persistent(30)
    var players: PlayersList by persistent(PlayersList())
    var shotCounter: Int = 0
}

// Π­Ρ‚ΠΎ дСкларация ΠΌΠΎΠ΄Π΅Π»ΠΈ процСсса: создаСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ всСми
// экзСмплярами процСсса ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса
val initialPlayerModel = processModel<InitialPlayer>(name = "InitialPlayer",
                                                     version = 1) {

    // По ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ³Ρ€ΠΎΠΊ являСтся ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ³Ρ€Ρ‹ ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ СдинствСнным
    uniqueConstraint = UniqueConstraints.singleton

    // ОбъявляСм активности, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… состоит бизнСс-процСсс
    val sendNewGameSignal = signal<String>("NewGame")
    val sendStopGameSignal = signal<String>("StopGame")
    val startTask = humanTask("Start") {
        taskOperation {
            processCondition { players.size > 0 }
            confirmation { "ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΎΡΡŒ ${players.size} ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ². НачинаСм?" }
        }
    }
    val stopTask = humanTask("Stop") {
        taskOperation {}
    }
    val waitPlayerJoin = signalWait<String>("PlayerJoin") { signal ->
        players.add(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        println("... join player ${signal.data} ...")
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        println("... player ${signal.data} is out ...")
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val throwStartBall = messageSend<Int>("Ball") {
        messageData = { 1 }
        activation = { selectNextPlayer() }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    // Π’Π΅ΠΏΠ΅Ρ€ΡŒ конструируСм Π³Ρ€Π°Ρ„ процСсса ΠΈΠ· ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… активностСй
    startFrom(sendNewGameSignal)
            .fork("mainFork") {
                next(startTask)
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut)
                        .branch("checkPlayers") {
                            ifTrue { players.isEmpty() }
                                    .next(sendStopGameSignal)
                                    .terminate()
                            ifElse().next(waitPlayerOut)
                        }
            }
    startTask.fork("afterStart") {
        next(throwStartBall)
                .branch("mainLoop") {
                    ifTrue { energy < 5 }.next(sendPlayerOut).next(waitBall)
                    ifElse().next(waitBall).next(throwBall).loop()
                }
        next(stopTask).next(sendStopGameSignal)
    }

    // НавСшаСм Π½Π° активности Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для логирования
    sendNewGameSignal.onExit { println("Let's play!") }
    sendStopGameSignal.onExit { println("Stop!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<InitialPlayer, Int>.selectNextPlayer() {
    val player = process.players.random()
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

Pamusoro pekuita bhizinesi logic, iyo iri pamusoro kodhi inogona kuburitsa chinhu modhi yemaitiro ebhizinesi, iyo inogona kuoneswa muchimiro chemufananidzo. Isu hatisati taita chiratidziro parizvino, saka taifanira kupedza nguva shoma tichidhirowa (pano ini ndakarerutsa BPMN notation maererano nekushandiswa kwemasuwo kuvandudza kuenderana kwedhiyagiramu nekodhi iri pazasi):

BPM maitiro ekubatanidza

app2 inosanganisira bhizinesi remumwe mutambi maitiro:

kirasi RandomPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList: ArrayList<PlayerInfo>()

class RandomPlayer : ProcessImpl<RandomPlayer>(randomPlayerModel) {

    var playerName: String by input(persistent = true, 
                                    defaultValue = "RandomPlayer")
    var energy: Int by input(persistent = true, defaultValue = 30)
    var players: PlayersList by persistent(PlayersList())
    var allPlayersOut: Boolean by persistent(false)
    var shotCounter: Int = 0

    val selfPlayer: PlayerInfo
        get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}

val randomPlayerModel = processModel<RandomPlayer>(name = "RandomPlayer", 
                                                   version = 1) {

    val waitNewGameSignal = signalWait<String>("NewGame")
    val waitStopGameSignal = signalWait<String>("StopGame")
    val sendPlayerJoin = signal<String>("PlayerJoin") {
        signalData = { playerName }
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
        eventCondition = { signal ->
            signal.sender.processInstanceId != process.id 
                && !process.players.any { signal.sender.processInstanceId == it.id}
        }
        handler = { signal ->
            players.add(PlayerInfo(
                    signal.data!!,
                    signal.sender.domain,
                    signal.sender.processInstanceId))
        }
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        allPlayersOut = players.isEmpty()
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val receiveHandshake = messageWait<String>("Handshake") { message ->
        if (!players.any { message.sender.processInstanceId == it.id}) {
            players.add(PlayerInfo(
                    message.data!!, 
                    message.sender.domain, 
                    message.sender.processInstanceId))
        }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    startFrom(waitNewGameSignal)
            .fork("mainFork") {
                next(sendPlayerJoin)
                        .branch("mainLoop") {
                            ifTrue { energy < 5 || allPlayersOut }
                                    .next(sendPlayerOut)
                                    .next(waitBall)
                            ifElse()
                                    .next(waitBall)
                                    .next(throwBall)
                                    .loop()
                        }
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut).next(waitPlayerOut)
                next(receiveHandshake).next(receiveHandshake)
                next(waitStopGameSignal).terminate()
            }

    sendPlayerJoin.onExit { println("$playerName: I'm here!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<RandomPlayer, Int>.selectNextPlayer() {
    val player = if (process.players.isNotEmpty()) 
        process.players.random() 
    else 
        process.selfPlayer
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

Mufananidzo:

BPM maitiro ekubatanidza

Muapp3 application tichaita mutambi ane hunhu hwakasiyana: pachinzvimbo chekusarudza mutambi anotevera, achaita zvinoenderana nekutenderera-robin algorithm:

kirasi RoundRobinPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList: ArrayList<PlayerInfo>()

class RoundRobinPlayer : ProcessImpl<RoundRobinPlayer>(roundRobinPlayerModel) {

    var playerName: String by input(persistent = true, 
                                    defaultValue = "RoundRobinPlayer")
    var energy: Int by input(persistent = true, defaultValue = 30)
    var players: PlayersList by persistent(PlayersList())
    var nextPlayerIndex: Int by persistent(-1)
    var allPlayersOut: Boolean by persistent(false)
    var shotCounter: Int = 0

    val selfPlayer: PlayerInfo
        get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}

val roundRobinPlayerModel = processModel<RoundRobinPlayer>(
        name = "RoundRobinPlayer", 
        version = 1) {

    val waitNewGameSignal = signalWait<String>("NewGame")
    val waitStopGameSignal = signalWait<String>("StopGame")
    val sendPlayerJoin = signal<String>("PlayerJoin") {
        signalData = { playerName }
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
        eventCondition = { signal ->
            signal.sender.processInstanceId != process.id 
                && !process.players.any { signal.sender.processInstanceId == it.id}
        }
        handler = { signal ->
            players.add(PlayerInfo(
                    signal.data!!, 
                    signal.sender.domain, 
                    signal.sender.processInstanceId))
        }
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!, 
                signal.sender.domain, 
                signal.sender.processInstanceId))
        allPlayersOut = players.isEmpty()
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val receiveHandshake = messageWait<String>("Handshake") { message ->
        if (!players.any { message.sender.processInstanceId == it.id}) {
            players.add(PlayerInfo(
                    message.data!!, 
                    message.sender.domain, 
                    message.sender.processInstanceId))
        }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    startFrom(waitNewGameSignal)
            .fork("mainFork") {
                next(sendPlayerJoin)
                        .branch("mainLoop") {
                            ifTrue { energy < 5 || allPlayersOut }
                                    .next(sendPlayerOut)
                                    .next(waitBall)
                            ifElse()
                                    .next(waitBall)
                                    .next(throwBall)
                                    .loop()
                        }
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut).next(waitPlayerOut)
                next(receiveHandshake).next(receiveHandshake)
                next(waitStopGameSignal).terminate()
            }

    sendPlayerJoin.onExit { println("$playerName: I'm here!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<RoundRobinPlayer, Int>.selectNextPlayer() {
    var idx = process.nextPlayerIndex + 1
    if (idx >= process.players.size) {
        idx = 0
    }
    process.nextPlayerIndex = idx
    val player = if (process.players.isNotEmpty()) 
        process.players[idx] 
    else 
        process.selfPlayer
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

Zvikasadaro, maitiro emutambi haasiyane neapfuura, saka dhayagiramu haichinji.

Zvino tinoda bvunzo kuti tiite zvese izvi. Ini ndinongopa iyo kodhi yebvunzo pachayo, kuti usaranganise chinyorwa ne boilerplate (muchokwadi, ini ndakashandisa bvunzo nharaunda yakagadzirwa kare kuyedza kubatanidzwa kwemamwe mabhizinesi maitiro):

testGame()

@Test
public void testGame() throws InterruptedException {
    String pl2 = startProcess(app2, "RandomPlayer", playerParams("Player2", 20));
    String pl3 = startProcess(app2, "RandomPlayer", playerParams("Player3", 40));
    String pl4 = startProcess(app3, "RoundRobinPlayer", playerParams("Player4", 25));
    String pl5 = startProcess(app3, "RoundRobinPlayer", playerParams("Player5", 35));
    String pl1 = startProcess(app1, "InitialPlayer");
    // Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° ΠΈΠ³Ρ€ΠΎΠΊΠΈ "познакомятся" Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ.
    // Π–Π΄Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· sleep - ΠΏΠ»ΠΎΡ…ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π·Π°Ρ‚ΠΎ самоС простоС. 
    // НС Π΄Π΅Π»Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊ Π² ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… тСстах!
    Thread.sleep(1000);
    // ЗапускаСм ΠΈΠ³Ρ€Ρƒ, закрывая ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ
    assertTrue(closeTask(app1, pl1, "Start"));
    app1.getWaiting().waitProcessFinished(pl1);
    app2.getWaiting().waitProcessFinished(pl2);
    app2.getWaiting().waitProcessFinished(pl3);
    app3.getWaiting().waitProcessFinished(pl4);
    app3.getWaiting().waitProcessFinished(pl5);
}

private Map<String, Object> playerParams(String name, int energy) {
    Map<String, Object> params = new HashMap<>();
    params.put("playerName", name);
    params.put("energy", energy);
    return params;
}

Ngatimhanyei bvunzo uye titarise irogi:

console kubuda

Взята Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΊΠ»ΡŽΡ‡Π° lock://app1/process/InitialPlayer
Let's play!
Бнята Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΊΠ»ΡŽΡ‡Π° lock://app1/process/InitialPlayer
Player2: I'm here!
Player3: I'm here!
Player4: I'm here!
Player5: I'm here!
... join player Player2 ...
... join player Player4 ...
... join player Player3 ...
... join player Player5 ...
Step 1: Player1 >>> Player3
Step 2: Player3 >>> Player5
Step 3: Player5 >>> Player3
Step 4: Player3 >>> Player4
Step 5: Player4 >>> Player3
Step 6: Player3 >>> Player4
Step 7: Player4 >>> Player5
Step 8: Player5 >>> Player2
Step 9: Player2 >>> Player5
Step 10: Player5 >>> Player4
Step 11: Player4 >>> Player2
Step 12: Player2 >>> Player4
Step 13: Player4 >>> Player1
Step 14: Player1 >>> Player4
Step 15: Player4 >>> Player3
Step 16: Player3 >>> Player1
Step 17: Player1 >>> Player2
Step 18: Player2 >>> Player3
Step 19: Player3 >>> Player1
Step 20: Player1 >>> Player5
Step 21: Player5 >>> Player1
Step 22: Player1 >>> Player2
Step 23: Player2 >>> Player4
Step 24: Player4 >>> Player5
Step 25: Player5 >>> Player3
Step 26: Player3 >>> Player4
Step 27: Player4 >>> Player2
Step 28: Player2 >>> Player5
Step 29: Player5 >>> Player2
Step 30: Player2 >>> Player1
Step 31: Player1 >>> Player3
Step 32: Player3 >>> Player4
Step 33: Player4 >>> Player1
Step 34: Player1 >>> Player3
Step 35: Player3 >>> Player4
Step 36: Player4 >>> Player3
Step 37: Player3 >>> Player2
Step 38: Player2 >>> Player5
Step 39: Player5 >>> Player4
Step 40: Player4 >>> Player5
Step 41: Player5 >>> Player1
Step 42: Player1 >>> Player5
Step 43: Player5 >>> Player3
Step 44: Player3 >>> Player5
Step 45: Player5 >>> Player2
Step 46: Player2 >>> Player3
Step 47: Player3 >>> Player2
Step 48: Player2 >>> Player5
Step 49: Player5 >>> Player4
Step 50: Player4 >>> Player2
Step 51: Player2 >>> Player5
Step 52: Player5 >>> Player1
Step 53: Player1 >>> Player5
Step 54: Player5 >>> Player3
Step 55: Player3 >>> Player5
Step 56: Player5 >>> Player2
Step 57: Player2 >>> Player1
Step 58: Player1 >>> Player4
Step 59: Player4 >>> Player1
Step 60: Player1 >>> Player4
Step 61: Player4 >>> Player3
Step 62: Player3 >>> Player2
Step 63: Player2 >>> Player5
Step 64: Player5 >>> Player4
Step 65: Player4 >>> Player5
Step 66: Player5 >>> Player1
Step 67: Player1 >>> Player5
Step 68: Player5 >>> Player3
Step 69: Player3 >>> Player4
Step 70: Player4 >>> Player2
Step 71: Player2 >>> Player5
Step 72: Player5 >>> Player2
Step 73: Player2 >>> Player1
Step 74: Player1 >>> Player4
Step 75: Player4 >>> Player1
Step 76: Player1 >>> Player2
Step 77: Player2 >>> Player5
Step 78: Player5 >>> Player4
Step 79: Player4 >>> Player3
Step 80: Player3 >>> Player1
Step 81: Player1 >>> Player5
Step 82: Player5 >>> Player1
Step 83: Player1 >>> Player4
Step 84: Player4 >>> Player5
Step 85: Player5 >>> Player3
Step 86: Player3 >>> Player5
Step 87: Player5 >>> Player2
Step 88: Player2 >>> Player3
Player2: I'm out!
Step 89: Player3 >>> Player4
... player Player2 is out ...
Step 90: Player4 >>> Player1
Step 91: Player1 >>> Player3
Step 92: Player3 >>> Player1
Step 93: Player1 >>> Player4
Step 94: Player4 >>> Player3
Step 95: Player3 >>> Player5
Step 96: Player5 >>> Player1
Step 97: Player1 >>> Player5
Step 98: Player5 >>> Player3
Step 99: Player3 >>> Player5
Step 100: Player5 >>> Player4
Step 101: Player4 >>> Player5
Player4: I'm out!
... player Player4 is out ...
Step 102: Player5 >>> Player1
Step 103: Player1 >>> Player3
Step 104: Player3 >>> Player1
Step 105: Player1 >>> Player3
Step 106: Player3 >>> Player5
Step 107: Player5 >>> Player3
Step 108: Player3 >>> Player1
Step 109: Player1 >>> Player3
Step 110: Player3 >>> Player5
Step 111: Player5 >>> Player1
Step 112: Player1 >>> Player3
Step 113: Player3 >>> Player5
Step 114: Player5 >>> Player3
Step 115: Player3 >>> Player1
Step 116: Player1 >>> Player3
Step 117: Player3 >>> Player5
Step 118: Player5 >>> Player1
Step 119: Player1 >>> Player3
Step 120: Player3 >>> Player5
Step 121: Player5 >>> Player3
Player5: I'm out!
... player Player5 is out ...
Step 122: Player3 >>> Player5
Step 123: Player5 >>> Player1
Player5: I'm out!
Step 124: Player1 >>> Player3
... player Player5 is out ...
Step 125: Player3 >>> Player1
Step 126: Player1 >>> Player3
Player1: I'm out!
... player Player1 is out ...
Step 127: Player3 >>> Player3
Player3: I'm out!
Step 128: Player3 >>> Player3
... player Player3 is out ...
Player3: I'm out!
Stop!
Step 129: Player3 >>> Player3
Player3: I'm out!

Kubva pane izvi zvose tinogona kutora mhedziso dzakawanda dzinokosha:

  • nezvishandiso zvinodikanwa, vanogadzira maapplication vanogona kugadzira kusanganisa kwekudyidzana pakati pezvishandiso pasina kukanganisa bhizinesi pfungwa;
  • kuoma kwebasa rekubatanidza rinoda unyanzvi hweinjiniya hunogona kuvanzwa mukati megadziriro kana izvi zvakatanga kubatanidzwa mukuvakwa kwegadziriro. Kuoma kwedambudziko hakugoni kuvanzwa, saka mhinduro yedambudziko rakaoma mukodhi ichaita seyo;
  • Paunenge uchigadzira yekubatanidza mantiki, zvakakosha kuti titarise pakupedzisira kuenderana uye kushaikwa kwemutsara wekuchinja kwechinjo munharaunda yevose vatori vechikamu. Izvi zvinotimanikidza kuomesa pfungwa kuitira kuti isave nehanya nehurongwa hunoitika zviitiko zvekunze. Mumuenzaniso wedu, mutambi anomanikidzwa kutora chikamu mumutambo mushure mekunge ataura kubuda kwake kubva mumutambo: vamwe vatambi vacharamba vachimupfuudza bhora kusvikira ruzivo rwekubuda kwake rwasvika uye rwunogadziriswa nevose vatori vechikamu. Iyi pfungwa haiteveri kubva kumitemo yemutambo uye imhinduro yekukanganisa mukati megadziriro yezvivakwa zvakasarudzwa.

Zvadaro, tichataura pamusoro pezvakasiyana-siyana zvakaoma zvekugadzirisa kwedu, zvibvumirano uye mamwe mapoinzi.

Mameseji ese ari mumutsara mumwe

Zvese zvakabatanidzwa zvikumbiro zvinoshanda nebhazi rimwe rekubatanidza, iro rinounzwa muchimiro chekunze bhuroka, imwe BPMQueue yemameseji uye imwe BPMTopic musoro wezviratidzo (zviitiko). Kuisa mameseji ese kuburikidza nemutsara mumwe chete iko kukanganisa. Payero yebhizinesi logic level, iwe unogona ikozvino kuunza akawanda emhando meseji mhando sezvaunoda pasina kuita shanduko kune sisitimu chimiro. Uku kurerutsa kwakakosha, asi kunotakura njodzi, izvo mumamiriro ezvinhu emabasa edu chaiwo zvaisaita seakakosha kwatiri.

BPM maitiro ekubatanidza

Nekudaro, pane humwe hunyengeri pano: yega yega application inosefa "yayo" mameseji kubva pamutsetse uri pamusuwo, nezita renzvimbo yayo. Iyo domain inogona zvakare kutsanangurwa mumasaini kana iwe uchida kudzikamisa "chiyero chekuonekwa" chechiratidzo kune imwechete application. Izvi zvinofanirwa kuwedzera kubuda kwebhazi, asi iyo bhizinesi logic inofanirwa kushanda nemazita emazita: ekugadzirisa mameseji - anosungirwa, ezviratidzo - anodiwa.

Kuve nechokwadi cheKubatanidza Bhazi Kuvimbika

Kuvimbika kunosanganisira akati wandei:

  • Iyo yakasarudzwa meseji bhuroka chinhu chakakosha cheiyo dhizaini uye imwe poindi yekutadza: inofanirwa kuve inoshivirira zvakakwana kukanganisa. Iwe unofanirwa kushandisa chete-nguva-yakaedzwa mashandisirwo, nerutsigiro rwakanaka uye nharaunda yakakura;
  • zvinodikanwa kuve nechokwadi chekuwanikwa kwepamusoro kwemeseji broker, iyo inofanirwa kuparadzaniswa kubva kune yakasanganiswa maapplication (kuwanikwa kwepamusoro kwezvikumbiro zvine bhizinesi rekushandisa logic yakanyanya kuoma uye inodhura kuve nechokwadi);
  • bhuroka anosungirwa kupa "kamwe kamwe" vimbiso yekuendesa. Ichi chinhu chinosungirwa chekushanda kwakavimbika kwebhazi rekubatanidza. Iko hakuna kudikanwa kwe "chaiyo kamwe" nhanho vimbiso: bhizinesi maitiro, sekutonga, haana hanya nekudzokororwa kusvika kwemameseji kana zviitiko, uye mumabasa akakosha uko izvi zvakakosha, zviri nyore kuwedzera mamwe macheki kubhizinesi. pfungwa pane kugara uchishandisa "zvinodhura" "zvivimbiso;
  • kutumira mameseji uye masaini kunofanirwa kuve nekubatanidzwa mune yakazara kutengeserana nekuchinja kwemamiriro ebhizinesi maitiro uye domain data. Sarudzo inosarudzika ingave yekushandisa patani Transactional Outbox, asi zvinoda imwe tafura mudhatabhesi uye inodzokorora. Mumashandisirwo eJEE, izvi zvinogona kurerutswa nekushandisa maneja weJTA wepanzvimbo, asi kubatana kune bhuroka rakasarudzwa kunofanira kukwanisa kushanda mukati. XA;
  • vabati vemashoko anouya uye zviitiko vanofanirawo kushanda nekutengeserana kunoshandura mamiriro ekugadzirisa bhizinesi: kana kutengeserana kwakadaro kwakadzoserwa shure, ipapo kugamuchirwa kwemashoko kunofanira kubviswa;
  • mameseji aisakwanisa kuunzwa nekuda kwekukanganisa anofanira kuchengetwa mune imwe nzvimbo yekuchengetedza D.L.Q. (Mutsara Wetsamba Yakafa). Nechinangwa ichi, isu takagadzira yakaparadzana papuratifomu microservice inochengeta mameseji akadaro mukuchengetedza kwayo, inoaisa nehunhu (yekukurumidza kuunganidza nekutsvaga), uye inofumura API yekuona, kutumira kune kero yekuenda, uye kudzima meseji. Vatariri vehurongwa vanogona kushanda nebasa iri kuburikidza newebhu interface yavo;
  • mune zvigadziriso zvebhuroka, unofanirwa kugadzirisa huwandu hwekuyedzazve uye kunonoka pakati pekutumira kuitira kuti uderedze mukana wemeseji kupinda muDLQ (zvinenge zvisingaite kuverenga iyo yakakwana paramita, asi unogona kuita zvine simba nekuzvigadzirisa panguva yekushanda. );
  • Chitoro cheDLQ chinofanirwa kugara chichitariswa, uye iyo yekutarisa system inofanirwa kuzivisa vatariri vehurongwa kuitira kuti kana mameseji asina kutumirwa aitika, vanogona kupindura nekukurumidza sezvinobvira. Izvi zvinoderedza "nzvimbo yakakanganiswa" yekutadza kana bhizinesi logic kukanganisa;
  • bhazi rekubatanidza rinofanira kunge risina hanya nekushaikwa kwenguva pfupi kwezvikumbiro: kunyoreswa kune musoro kunofanirwa kuve kwakasimba, uye zita renzvimbo yechikumbiro rinofanira kunge rakasiyana kuitira kuti nepo chikumbiro chisipo, mumwe munhu haazoyedze kugadzirisa mameseji kubva mutsara.

Kuve nechokwadi chekuchengetedzwa kwetambo kwebhizinesi logic

Iyo yakafanana chiitiko chebhizinesi maitiro inogona kugamuchira akati wandei mameseji uye zviitiko kamwechete, iyo kugadzirisa kwayo kunotanga mukufanana. Panguva imwecheteyo, kune mugadziri wekushandisa, zvese zvinofanirwa kunge zviri nyore uye tambo-yakachengeteka.

Iyo bhizinesi pfungwa yemaitiro inobata chiitiko chega chega chekunze chinobata iyo bhizinesi maitiro ega. Zviitiko zvakadaro zvinogona kuva:

  • kutanga chirongwa chebhizinesi chiitiko;
  • chiito chemushandisi chine chekuita nebasa mukati mebhizinesi maitiro;
  • kugamuchira meseji kana chiratidzo icho chiitiko chebhizinesi chakanyoreswa;
  • kukonzeresa yenguva yakatarwa neyakagadziriswa bhizinesi muenzaniso;
  • kudzora chiito kuburikidza neAPI (semuenzaniso, kukanganisa kwemaitiro).

Chiitiko chega chega chakadaro chinogona kushandura mamiriro ebhizinesi maitiro emuenzaniso: zvimwe zviitiko zvinogona kupera uye zvimwe zvinogona kutanga, uye kukosha kwezvivakwa zvinoramba zvichichinja. Kuvhara chero chiitiko kunogona kukonzera kuvhurwa kweimwe kana akawanda ezviitwa zvinotevera. Avo, zvakare, vanogona kumira kumirira zvimwe zviitiko kana, kana vasingade chero imwe data, vanogona kupedzisa mune imwechete kutengeserana. Usati wavhara kutengeserana, hutsva hutsva hwebhizimisi hunochengetedzwa mu database, iyo ichamirira chiitiko chekunze chinotevera kuitika.

Inoramba ichienderera bhizinesi process data yakachengetwa mune yehukama dhatabhesi inzvimbo iri nyore yekuwiriranisa kugadzirisa kana iwe ukashandisa SARUDZA KUTI UPDATE. Kana imwe kutengeserana yakakwanisa kuwana mamiriro ebhizinesi rekuita kubva pachigadziko chekuchishandura, saka hapana kumwe kutengeserana kwakafanana kuchakwanisa kuwana mamiriro akafanana kune imwe shanduko, uye mushure mekupedzwa kwekutanga kutengeserana, yechipiri kuvimbiswa kugamuchira mamiriro atochinja.

Tichishandisa makiyi asina tariro padivi reDBMS, tinozadzisa zvese zvinodiwa ACID, uye zvakare chengetedza kugona kuyera application nebhizinesi logic nekuwedzera huwandu hwekumhanya zviitiko.

Nekudaro, makiyi asina tariro anotityisidzira neakafa, zvinoreva kuti SARUDZA YEKUSVIKIRA inofanira kuramba yakaganhurirwa kune imwe nguva inonzwisisika yekumira kana zvikaitika zvikaitika pane dzimwe nyaya dzinotyisa mubhizinesi pfungwa.

Rimwe dambudziko nderekuwiriranisa kwekutanga kwebhizinesi maitiro. Kunyange zvazvo pasina chiitiko chekushanda kwebhizimisi, hapana hurumende mu database, saka nzira yakatsanangurwa haizoshande. Kana iwe uchida kuona kusarudzika kwechiitiko chebhizinesi mune yakatarwa chiyero, saka iwe unozoda imwe mhando yechinhu chekubatanidza chakabatana nekirasi yemaitiro uye inoenderana chiyero. Kuti tigadzirise dambudziko iri, tinoshandisa imwe nzira yekuvhara iyo inotibvumira kutora kiyi pane yakasarudzika sosi inotsanangurwa nekiyi muURI fomati kuburikidza nesevhisi yekunze.

Mune yedu mienzaniso, iyo InitialPlayer bhizinesi maitiro ane chiziviso

uniqueConstraint = UniqueConstraints.singleton

Naizvozvo, irogi rine mameseji ekutora uye kuburitsa kukiya kwekiyi inoenderana. Iko hakuna mameseji akadaro kune mamwe mabhizinesi maitiro: uniqueConstraint haina kuiswa.

Matambudziko emaitiro ebhizinesi ane inoenderera nyika

Dzimwe nguva kuva nechimiro chinopfuurira hakungobatsiri chete, asiwo kunotadzisa kubudirira.
Matambudziko anotanga apo shanduko dzinoda kuitwa kune bhizinesi logic uye / kana bhizinesi maitiro modhi. Haisi shanduko yese yakadaro inopindirana nemamiriro ekare ebhizinesi maitiro. Kana pane zvakawanda zvipenyu zviitiko mu database, zvino kuita shanduko dzisingaenderani kunogona kukonzera matambudziko mazhinji, ataiwanzosangana nawo pakushandisa jBPM.

Zvichienderana nekudzika kwekuchinja, unogona kuita nenzira mbiri:

  1. gadzira bhizinesi idzva rekuita mhando kuitira kuti usaite shanduko dzisingaenderani kune yekare, uye shandisa iyo pane yekare yekare paunotanga zviitiko zvitsva. Makopi ekare acharamba achishanda β€œsakare”;
  2. fambisa iyo inopfuurira mamiriro ebhizinesi maitiro kana uchivandudza bhizinesi pfungwa.

Nzira yekutanga iri nyore, asi ine painogumira uye nekuipa kwayo, semuenzaniso:

  • kudzokororwa kwebhizinesi logic mune akawanda bhizinesi maitiro modhi, kuwedzera huwandu hwebhizinesi logic;
  • Kazhinji shanduko yekukurumidza kune nyowani bhizinesi logic inodiwa (maererano nemabasa ekubatanidza - kanenge nguva dzose);
  • mugadziri haazive kuti ndepapi mamodheru echinyakare anogona kudzimwa.

Mukuita isu tinoshandisa nzira mbiri, asi takaita akati wandei sarudzo kuti hupenyu hwedu huve nyore:

  • Mune dhatabhesi, iyo inopfuurira mamiriro ebhizinesi maitiro anochengetwa mune inoverengeka uye nyore kugadziriswa fomu: mune JSON fomati tambo. Izvi zvinobvumira kutama kuti kuitwe zvese mukati mekushandisa uye kunze. Sechisarudzo chekupedzisira, iwe unogona kuzvigadzirisa nemaoko (kunyanya inobatsira mukusimudzira panguva yekugadzirisa);
  • iyo yekubatanidza bhizinesi logic haishandisi mazita emabhizinesi maitiro, kuitira kuti chero nguva zvinokwanisika kutsiva kushandiswa kweimwe yemaitiro ekutora chikamu neimwe nyowani ine zita idzva (semuenzaniso, "InitialPlayerV2"). Kusunga kunoitika kuburikidza nemeseji nemazita emasaini;
  • iyo nzira yemuenzaniso ine nhamba yeshanduro, iyo yatinowedzera kana tikaita shanduko dzisingaenderani kune iyi modhi, uye iyi nhamba inochengetwa pamwe chete nemamiriro echiitiko chechiitiko;
  • iyo inopfuurira mamiriro ekuita inoverengwa kubva kudhatabhesi kutanga kuenda kune yakanakira chinhu modhi, iyo nzira yekutama inogona kushanda nayo kana iyo modhi shanduro nhamba yachinja;
  • iyo nzira yekufambisa inoiswa padivi peiyo bhizinesi logic uye inonzi "simbe" kune yega yega chiitiko chebhizinesi panguva yekudzoreredzwa kwayo kubva kudhatabhesi;
  • kana iwe uchida kutamisa mamiriro ezvese maitirwo ezviitiko nekukurumidza uye synchronously, mamwe emhando yepamusoro dhatabhesi yekufambisa mhinduro anoshandiswa, asi iwe unofanirwa kushanda neJSON.

Unoda imwe hurongwa hwemabhizinesi maitiro?

Mhinduro dzakatsanangurwa muchinyorwa dzakatibvumira kurerutsa zvakanyanya hupenyu hwedu, kuwedzera huwandu hwezvinhu zvinogadziriswa padanho rekusimudzira application, uye kuita kuti pfungwa yekuparadzanisa bhizinesi riite kuita mamicroservices riwedzere kutaridzika. Kuti uite izvi, basa rakawanda rakaitwa, yakanyatso "lightweight" yemaitiro ebhizinesi yakagadzirwa, pamwe chete nezvikamu zvebasa rekugadzirisa matambudziko akaonekwa mumamiriro ezvinhu ematambudziko akawanda ekushandiswa. Isu tine chishuwo chekugovera izvi mhedzisiro uye kuita kuti kuvandudzwa kwezvikamu zvakajairika kuvhure kupinda pasi perezinesi remahara. Izvi zvinoda kushanda nesimba uye nguva. Kunzwisisa kudiwa kwemhinduro dzakadaro kunogona kuva imwezve kukurudzira kwatiri. Muchinyorwa chakarongwa, kutarisisa kushoma kunobhadharwa kune kugona kweiyo chimiro pachayo, asi mamwe acho anoonekwa kubva mumienzaniso yakapihwa. Kana tikaburitsa dhizaini yedu, chinyorwa chakasiyana chinopihwa kwachiri. Panguva ino, tingave tichitenda kana ukasiya mhinduro shoma nekupindura mubvunzo:

Vashandisi vakanyoresa chete ndivo vanogona kutora chikamu muongororo. Nyorera mu, Munogamuchirwa.

Unoda imwe hurongwa hwemabhizinesi maitiro?

  • 18,8%Hongu, ndanga ndichitsvaga chinhu chakadai kwenguva refu

  • 12,5%Ndiri kufarira kudzidza zvakawanda nezve kuita kwako, zvinogona kubatsira2

  • 6,2%Isu tinoshandisa imwe yearipo masisitimu, asi tiri kufunga nezve kutsiva1

  • 18,8%Isu tinoshandisa imwe yemaitiro aripo, zvese zvakanaka3

  • 18,8%isu tinodzora pasina chimiro3

  • 25,0%nyora zvako4

16 vashandisi vakavhota. 7 vashandisi vakaramba.

Source: www.habr.com

Voeg