Ukuhlanganiswa kwesitayela se-BPM

Ukuhlanganiswa kwesitayela se-BPM

Mholweni, Khaya!

Inkampani yethu igxile ekuphuhliseni izisombululo zesoftware ye-ERP, isabelo sengonyama esihlala kwiinkqubo zentengiselwano kunye nesixa esikhulu sobuchule beshishini kunye nokuhamba koxwebhu lwe-EDMS. Iinguqulelo zangoku zeemveliso zethu zisekwe kubuchwephesha beJavaEE, kodwa sikwazama ngee-microservices. Enye yezona ndawo ziyingxaki kwizisombululo ezinjalo kukudityaniswa kweendlela ezisezantsi eziphantsi kwemimandla emeleneyo. Iingxaki zokudibanisa zisoloko zisinika intloko ebuhlungu, kungakhathaliseki ukuba ziziphi izitayile zokwakha, iingqokelela zeteknoloji kunye nesakhelo esisisebenzisayo, kodwa kutshanje kukho inkqubela phambili ekusombululeni iingxaki ezinjalo.

Kwinqaku endizisa ingqalelo yakho, ndiya kuthetha ngamava kunye nophando lwezakhiwo ukuba i-NPO Krista inalo kwindawo echongiweyo. Siza kuphinda sijonge umzekelo wesisombululo esilula kwingxaki yokudibanisa ukusuka kwindawo yokujonga umqambi wesicelo kwaye ufumanise ukuba yintoni efihliweyo emva kolu lula.

Ukuzihlangula

Izisombululo zezakhiwo kunye nezobugcisa ezichazwe kwinqaku zicetywayo ndim ngokusekelwe kumava omntu kumxholo wemisebenzi ethile. Ezi zisombululo azibangi ukuba zizonke kwaye zisenokungabi zilungileyo phantsi kwezinye iimeko zokusetyenziswa.

Idibene ngantoni iBPM nayo?

Ukuphendula lo mbuzo, kufuneka sijonge nzulu ngakumbi kwiingxaki ezisetyenzisiweyo zezisombululo zethu. Elona candelo liphambili lengqiqo yeshishini kwinkqubo yethu yentengiselwano eqhelekileyo kukungenisa idatha kwisiseko sedatha ngokusebenzisa ujongano lomsebenzisi, ukuqinisekiswa okwenziwa ngesandla kunye nokuzenzekelayo kwale datha, ukuyiqhuba ngokuhamba komsebenzi othile, ukuyipapasha kwenye inkqubo / uhlalutyo lwedatha / uvimba, kunye nokuvelisa iingxelo. . Ke, umsebenzi ophambili wenkqubo kubathengi kukuzenzekelayo kweenkqubo zabo zangaphakathi zoshishino.

Ukwenzela lula, sisebenzisa igama elithi "uxwebhu" kunxibelelwano njengokutsalwa kweseti yedatha edityaniswe sisitshixo esiqhelekileyo apho ukuhamba komsebenzi othile "kunokudityaniswa".
Kodwa kuthekani ngengqiqo yokudibanisa? Emva kwayo yonke loo nto, umsebenzi wokudibanisa uveliswa kuyilo lwenkqubo, ethi "inqunyulwe" ibe ngamacandelo AKUKHO ngokwesicelo somthengi, kodwa phantsi kweempembelelo zezinto ezahlukeneyo ngokupheleleyo:

  • phantsi komthetho kaConway;
  • njengesiphumo sokuphinda kusetyenziswe inkqubo engaphantsi komhlaba eyenzelwe ezinye iimveliso;
  • ngokwengqiqo yomakhi, ngokusekelwe kwiimfuno ezingasebenziyo.

Kukho isilingo esikhulu sokwahlula ingqiqo yokudityaniswa kwingqiqo yeshishini lokuhamba komsebenzi oyintloko, ukuze ungangcolisi ingqiqo yeshishini kunye nezinto ezidityanisiweyo kunye nokukhulula umphuhlisi wesicelo kwisidingo sokuphonononga kwiinkcukacha zendlela yoyilo lwenkqubo. Le ndlela ineengenelo ezininzi, kodwa ukuziqhelanisa kubonisa ukungasebenzi kwayo:

  • ukuxazulula iingxaki zokudibanisa ngokuqhelekileyo kubuyela kwiinketho ezilula ngendlela yeefowuni ezihambelanayo ngenxa yamanqaku okwandisa okulinganiselwe ekuphunyezweni komsebenzi oyintloko (izinto ezingalunganga zokudityaniswa kwe-synchronous zixoxwa ngezantsi);
  • izinto zakudala ezidityanisiweyo zisagqobhoza kwingqiqo yoshishino xa ingxelo esuka kwenye inkqubo engaphantsi ifuneka;
  • umphuhlisi wesicelo akayikuhoyi ukudibanisa kwaye unokuyiphula ngokulula ngokutshintsha ukuhamba komsebenzi;
  • inkqubo iyayeka ukuba yinto enye kumbono womsebenzisi, "i-seams" phakathi kwe-subsystems ibonakala, kwaye imisebenzi engasebenziyo ibonakala, iqalisa ukuhanjiswa kwedatha ukusuka kwi-subsystem ukuya kwenye.

Enye indlela kukuqwalasela unxibelelwano lokudibanisa njengenxalenye ebalulekileyo yengqiqo yoshishino kunye nokuhamba komsebenzi. Ukuthintela iziqinisekiso zomphuhlisi wesicelo ukusuka phezulu, ukudala intsebenziswano entsha yokudibanisa kufuneka kube lula kwaye kungabi namandla, kunye nethuba elincinci lokukhetha isisombululo. Oku kunzima ukwenza kunokuba kubonakala ngathi: isixhobo kufuneka sibe namandla ngokwaneleyo ukubonelela umsebenzisi ngeendlela ezahlukeneyo zokukhetha ukusetyenziswa kwayo, ngaphandle kokumvumela ukuba "azidubule ezinyaweni." Kukho imibuzo emininzi ekufuneka injineli iphendule kumxholo wemisebenzi yokudibanisa, kodwa ukuba umphuhlisi wesicelo akufanele acinge malunga nomsebenzi wakhe wemihla ngemihla: imida yentengiselwano, ukuhambelana, i-atomicity, ukhuseleko, ukulinganisa, umthwalo kunye nokusabalalisa izixhobo, umzila, ukuhambisa i-marshaling, unikezelo kunye nokutshintsha iimeko, njl. Kuyafuneka ukuba unikeze abaphuhlisi bezicelo ngokulula isisombululo setemplates apho iimpendulo kuyo yonke imibuzo enjalo sele zifihliwe. Ezi templates kufuneka zikhuseleke kakhulu: iingqiqo zeshishini zitshintsha rhoqo, oko kwandisa umngcipheko wokungenisa iimpazamo, iindleko zeempazamo kufuneka zihlale zisezantsi ngokufanelekileyo.

Kodwa i-BPM inento yokwenza nayo? Kukho iinketho ezininzi zokuphumeza ukuhamba komsebenzi ...
Enyanisweni, olunye ukuphunyezwa kweenkqubo zoshishino luthandwa kakhulu kwizisombululo zethu - ngokuchazwa kwenkcazo yedayagram yenguqu yelizwe kunye nokudibanisa kwabaphathi abanengqiqo yezoshishino kwiinguqu. Kule meko, urhulumente omisela indawo yangoku "yoxwebhu" kwinkqubo yoshishino luphawu "loxwebhu" ngokwalo.

Ukuhlanganiswa kwesitayela se-BPM
Le yindlela ekhangeleka ngayo inkqubo ekuqaleni kweprojekthi

Ukuthandwa kolu phunyezo kubangelwa ukulula kunye nesantya sokudala iinkqubo zoshishino ezihambelanayo. Nangona kunjalo, njengoko iinkqubo zesoftware zihlala ziba nzima ngakumbi, indawo ezenzekelayo yenkqubo yeshishini iyakhula kwaye iba nzima ngakumbi. Kukho imfuneko yokubola, ukusetyenziswa kwakhona kweengxenye zeenkqubo, kunye neenkqubo ze-branching ukwenzela ukuba isebe ngalinye lenziwe ngokufanayo. Ngaphantsi kweemeko ezinjalo, isixhobo siyaba nzima, kwaye umzobo wenguqu yelizwe ulahlekelwa ngumxholo wolwazi (ukudibanisa ukudibanisa akubonakali kumzobo nonke).

Ukuhlanganiswa kwesitayela se-BPM
Le yindlela ekhangeleka ngayo inkqubo emva kokuphindaphindwa kaninzi kweemfuno zokucaciswa.

Indlela yokuphuma kule meko yayikudityaniswa kwe-injini jBPM kwezinye iimveliso ezineenkqubo zoshishino ezinzima kakhulu. Ngexesha elifutshane, esi sisombululo saba nempumelelo ethile: kuye kwenzeka ukuba kuphunyezwe iinkqubo zoshishino ezintsonkothileyo ngelixa kugcinwe umzobo onolwazi kunye nofanelekileyo kwinqaku. BPMN2.

Ukuhlanganiswa kwesitayela se-BPM
Inxalenye encinci yenkqubo yoshishino olunzima

Ngexesha elide, isisombululo asizange siphile ngokulindelekileyo: ukunyanzeliswa komsebenzi ophezulu wokudala iinkqubo zoshishino ngokusebenzisa izixhobo ezibonakalayo azizange zivumele ukufezekisa izikhombisi zemveliso ezamkelekileyo, kwaye isixhobo ngokwaso saba sesona sithandwa kakhulu phakathi kwabaphuhlisi. Kwakhona kwakukho izikhalazo malunga nokwakhiwa kwangaphakathi kwe-injini, okukhokelela ekubonakaleni kweninzi "iipetshi" kunye "neentonga".

Owona mba ulungileyo wokusetyenziswa kwe-jBPM yayilulwazi ngeenzuzo kunye neengozi zokuba nemeko yenkqubo yeshishini eyazingisayo. Siphinde sabona ukuba kunokwenzeka ukusebenzisa indlela yenkqubo ukuphumeza iiprothokholi zokudibanisa eziyinkimbinkimbi phakathi kwezicelo ezahlukeneyo usebenzisa i-asynchronous interactions ngokusebenzisa imiqondiso kunye nemiyalezo. Ubukho belizwe elizingisayo budlala indima ebalulekileyo koku.

Ngokusekelwe koku kungasentla, sinokugqiba ngelithi: Inkqubo yenkqubo kwisitayela se-BPM isivumela ukuba sisombulule uluhlu olubanzi lwemisebenzi ukwenza ngokuzenzekelayo iinkqubo zoshishino ezikhulayo, ukulungelelanisa ngokufanelekileyo imisebenzi yokudibanisa kwezi nkqubo kunye nokugcina ukukwazi ukubonisa ngokubonakalayo inkqubo ephunyeziweyo kwi-notation efanelekileyo.

Ukungalungi kweefowuni ze-synchronous njengepatheni yokudibanisa

Udibaniso lwe-synchronous lubhekisa kolona cingo luthintelwayo lulula. Enye indlela esezantsi isebenza njengecala lomncedisi kwaye iveza i-API ngendlela efunekayo. Enye i-subsystem isebenza njengecala lomxhasi kwaye ngexesha elifanelekileyo yenza umnxeba kwaye ilinde umphumo. Ngokuxhomekeke kuyilo lwenkqubo, umxhasi kunye namacala omncedisi angafumaneka nokuba kwisicelo esifanayo kunye nenkqubo, okanye kwiindawo ezahlukeneyo. Kwimeko yesibini, kufuneka usebenzise ukuphunyezwa kwe-RPC kwaye unikeze ngokumakisha iiparamitha kunye nesiphumo somnxeba.

Ukuhlanganiswa kwesitayela se-BPM

Le pateni yokudibanisa ineseti enkulu ngokwaneleyo yezinto ezingalunganga, kodwa isetyenziswa ngokubanzi ekusebenzeni ngenxa yokulula kwayo. Isantya sokuphunyezwa sibamba kwaye sikunyanzele ukuba uyisebenzise kwakhona kwaye kwakhona xa ujongene nemihla yokugqibela, ukurekhoda isisombululo njengetyala lobugcisa. Kodwa kuyenzeka ukuba abaphuhlisi abangenamava bayisebenzise ngokungazi, bengayiqondi imiphumo emibi.

Ukongeza kokona kukhula okucacileyo kuqhagamshelo lwenkqubo engaphantsi, kukho iingxaki ezingacacanga kunye "nokukhula" kunye "nokwelula" ukuthengiselana. Enyanisweni, ukuba i-logic yezoshishino yenza utshintsho oluthile, ke ukuthengiselana akunakugwenywa, kwaye ukuthengiselana, kwakhona, ukuvimba izixhobo ezithile zesicelo ezichaphazelekayo ngolu tshintsho. Oko kukuthi, de enye i-subsystem ilinde impendulo evela kwenye, ayiyi kukwazi ukugqiba intengiselwano kwaye isuse izitshixo. Oku kwandisa kakhulu umngcipheko weziphumo ezahlukeneyo:

  • Ukuphendula kwenkqubo kulahlekile, abasebenzisi balinda ixesha elide kwiimpendulo zemibuzo;
  • umncedisi uyayeka ngokubanzi ukuphendula kwizicelo zomsebenzisi ngenxa yequla elixineneyo lomsonto: uninzi lwemisonto itshixiwe kwisixhobo esithathwe yintengiselwano;
  • I-Deadlocks iqala ukubonakala: amathuba okuba kwenzeke kuxhomekeke kakhulu kwixesha leentengiselwano, ubungakanani bengqiqo yezoshishino kunye nezitshixo ezibandakanyekayo kwintengiselwano;
  • Iimpazamo zokuphela kwentengiselwano ziyavela;
  • umncedisi "akaphumeleli" nge-OutOfMemory ukuba umsebenzi ufuna ukuqhutyelwa phambili kunye nokutshintsha inani elikhulu ledatha, kunye nobukho bokudibanisa okuhambelanayo kwenza kube nzima kakhulu ukwahlula ukusetyenzwa kwiintengiselwano "ezilula".

Ukususela kumbono wokwakha, ukusetyenziswa kweefowuni zokuvala ngexesha lokudibanisa kukhokelela ekulahlekelweni kolawulo kumgangatho we-subsystems ngamnye: akunakwenzeka ukuqinisekisa izikhombisi zekhwalithi ezijoliswe kuyo enye i-subsystem eyedwa ngaphandle kwezikhombisi zekhwalithi zesinye isistim. Ukuba ii-subsystems ziphuhliswa ngamaqela ahlukeneyo, le yingxaki enkulu.

Izinto ziba nomdla ngakumbi ukuba ii-subsystems ezidityanisiweyo zikwizicelo ezahlukeneyo kwaye kufuneka wenze utshintsho oluhambelanayo kumacala omabini. Ukuqinisekisa njani ukuthengiselana kolu tshintsho?

Ukuba utshintsho lwenziwe kwiintengiselwano ezahlukileyo, ngoko kuya kufuneka unikeze ukuphathwa ngokungafaniyo kunye nembuyekezo, kwaye oku kuphelisa ngokupheleleyo inzuzo ephambili yokudibanisa okuhambelanayo - ukulula.

Iintengiselwano ezisasazwayo nazo zifika engqondweni, kodwa asizisebenzisi kwizisombululo zethu: kunzima ukuqinisekisa ukuthembeka.

"Saga" njengesisombululo kwingxaki yentengiselwano

Ngokukhula kokuthandwa kwee-microservices, imfuno ye Umzekelo weSaga.

Le pateni isombulula ngokugqibeleleyo ezi ngxaki zikhankanywe ngasentla zentengiselwano ezinde, kwaye yandisa izakhono zokulawula imeko yenkqubo ukusuka kwicala lengqiqo yeshishini: imbuyekezo emva kwentengiselwano engaphumelelanga ayinakuphinda ibuyisele inkqubo kwimeko yayo yangaphambili, kodwa ibonelele. enye indlela yokusetyenzwa kwedatha. Oku kukuvumela ukuba ugweme ukuphinda amanyathelo okucubungula idatha agqitywe ngempumelelo xa uzama ukuzisa inkqubo "elungileyo" ekupheleni.

Okubangel 'umdla kukuba, kwiinkqubo ze-monolithic le pateni ikwabalulekile xa kufikwa ekudityanisweni kwenkqubo ephantsi edityaniswe ngokukhululekileyo kunye neziphumo ezibi ezibangelwa yintengiselwano yexesha elide kunye nezitshixo zezibonelelo ezihambelanayo ziyabonwa.

Ngokuphathelele kwiinkqubo zethu zoshishino kwisitayela se-BPM, kubonakala kulula kakhulu ukuphumeza "i-Sagas": amanyathelo omntu ngamnye we "Saga" angachazwa njengemisebenzi ngaphakathi kwenkqubo yeshishini, kunye nemeko eqhubekayo yenkqubo yeshishini nayo. imisela ubume bangaphakathi be "Saga". Oko kukuthi, asifuni nayiphi na indlela yokulungelelanisa ezongezelelweyo. Yonke into oyifunayo ngumthengisi womyalezo oxhasa "ubuncinci kanye" iziqinisekiso njengezothutho.

Kodwa esi sisombululo sikwanaso "ixabiso" laso:

  • ingqiqo yeshishini iba nzima ngakumbi: imbuyekezo kufuneka isetyenzwe;
  • kuya kufuneka ukuba ulahle ukuhambelana okupheleleyo, okunokuthi kube buhlungu ngokukodwa kwiinkqubo ze-monolithic;
  • I-architecture iba yinto encinci ngakumbi, kwaye imfuno eyongezelelweyo yomthengisi womyalezo ibonakala;
  • Izixhobo ezongezelelweyo zokubeka iliso kunye nokulawula ziya kufuneka (nangona ngokubanzi oku kulungile: umgangatho wenkonzo yenkqubo uya kwanda).

Kwiinkqubo ze-monolithic, ukulungelelaniswa kokusebenzisa "i-Sag" akubonakali kangako. Kwiinkonzo ezincinci kunye nezinye i-SOA, apho kunokwenzeka ukuba sele kukho i-broker, kwaye ukuhambelana okupheleleyo kunikelwa ekuqaleni kweprojekthi, izibonelelo zokusebenzisa le pateni zinokugqithisa kakhulu izinto ezingeloncedo, ngakumbi ukuba kukho i-API efanelekileyo kwingqiqo yezoshishino. inqanaba.

Ukufaka ingqiqo yoshishino kwiinkonzo ezincinci

Xa saqala ukuzama ii-microservices, kwavela umbuzo onengqiqo: apho ubeka khona i-logic ye-domain business logic ngokumalunga nenkonzo eqinisekisa ukuphikelela kwedatha yesizinda?

Xa ujonge ulwakhiwo lwee-BPMS ezahlukeneyo, kunokubonakala kunengqiqo ukwahlula ingqiqo yoshishino ekuzingiseni: yenza umaleko weqonga kunye ne-domain-ezimeleyo microservices ezenza indawo esingqongileyo kunye nesikhongozeli sokuphumeza ingqiqo yoshishino lwesizinda, kwaye uyilo ukuzingisa kwedatha yesizinda njengoko umaleko owahlukileyo we-microservices ezilula kakhulu kwaye zikhaphukhaphu. Iinkqubo zoshishino kule meko zenza i-orchestration yeenkonzo zoluhlu lokuzingisa.

Ukuhlanganiswa kwesitayela se-BPM

Le ndlela inenzuzo enkulu kakhulu: unokwandisa ukusebenza kweqonga njengoko uthanda, kwaye kuphela umaleko ohambelanayo we-platform microservices uya kuba "inqatha" kule nto. Iinkqubo zoshishino ezivela kuyo nayiphi na i-domain ziyakwazi ngokukhawuleza ukusebenzisa umsebenzi omtsha weqonga ngokukhawuleza xa ihlaziywa.

Uphononongo oluneenkcukacha ngakumbi lubonakalise ukungalungi okubalulekileyo kwale ndlela:

  • inkonzo yeqonga eyenza ingqiqo yoshishino lwemimandla emininzi ngaxeshanye ithwala imingcipheko enkulu njengenqaku elinye lokusilela. Utshintsho oluthe gqolo kwingqiqo yoshishino lwandisa umngcipheko weempazamo ezikhokelela ekungaphumelelini kwenkqubo ngokubanzi;
  • imiba yokusebenza: Ingqiqo yeshishini isebenza neenkcukacha zayo ngojongano olumxinwa nolucothayo:
    • idata iyakuphinda ihlawulwe kwaye imponthwe kwisitaki sothungelwano;
    • inkonzo ye-domain iya kuhlala ibonelela ngedatha engaphezulu kunokuba ifunekayo kwi-logic yezoshishino ukuba iqhutywe ngenxa yokungonelanga kwamandla ezicelo zeparameterizing kwinqanaba le-API yangaphandle yenkonzo;
    • iziqwenga ezininzi ezizimeleyo zengqiqo yeshishini zinokuphinda zicele idatha efanayo ukuba iqhutywe (le ngxaki inokuncitshiswa ngokudibanisa amacandelo eseshoni egcina idatha ye-cache, kodwa oku kwenza nzima ngakumbi ulwakhiwo kwaye kudala iingxaki zokufaneleka kwedatha kunye nokungasebenzi kwe-cache);
  • iingxaki zentengiselwano:
    • iinkqubo zoshishino kunye nombuso oqhubekayo, ogcinwe yinkonzo yesikhulumi, ayihambelani nedatha yesizinda, kwaye akukho zindlela ezilula zokusombulula le ngxaki;
    • ukubeka idatha yendawo yokuthintela ngaphandle kokuthengiselana: ukuba i-logic ye-domain business idinga ukwenza utshintsho emva kokujonga kuqala ukuchaneka kwedatha yangoku, kuyimfuneko ukungabandakanyi ithuba lokutshintsha okukhuphisanayo kwidatha ecutshungulwayo. Ukuvinjwa kwedatha yangaphandle kunokunceda ukuxazulula ingxaki, kodwa isisombululo esinjalo sithwala imingcipheko eyongezelelweyo kwaye sinciphisa ukuthembeka okupheleleyo kwenkqubo;
  • ubunzima obongezelelweyo xa uhlaziywa: kwezinye iimeko, inkonzo yokuzingisa kunye nengqiqo yeshishini kufuneka ihlaziywe ngokulandelelana okanye ngokulandelelana okungqongqo.

Ekugqibeleni, kwafuneka sibuyele kwizinto ezisisiseko: faka idatha yesizinda kunye nengqiqo yeshishini lesizinda kwi-microservice enye. Le ndlela yenza lula imbono ye-microservice njengenxalenye ebalulekileyo yenkqubo kwaye ayinikezi iingxaki ezingentla. Oku nako akunikwa simahla:

  • Ukumiswa kwe-API kuyafuneka ekusebenzisaneni nengqiqo yezoshishino (ngokukodwa, ukubonelela ngemisebenzi yomsebenzisi njengenxalenye yeenkqubo zoshishino) kunye neenkonzo zeqonga le-API; ifuna ingqwalasela ethe kratya kwiinguqu ze-API, ukuhambelana kwangaphambili kunye nomva;
  • Kuyimfuneko ukuba kongezwe amathala eencwadi exesha lokusebenza okongeziweyo ukuze kuqinisekiswe ukusebenza kwengqiqo yoshishino njengenxalenye yenkonzo encinci enjalo, kwaye oku kukhokelela kwiimfuno ezintsha zaloo mathala: ukukhaphukhaphu kunye nobuncinci bokuxhomekeka okuguqukayo;
  • abaphuhlisi bengqiqo yeshishini kufuneka babeke iliso kwiinguqulelo zethala leencwadi: ukuba i-microservice ayigqitywanga ixesha elide, ngoko ke iya kuqulatha uguqulelo oluphelelwe lixesha lwamathala eencwadi. Oku kunokuba ngumqobo ongalindelekanga wokongeza into entsha kwaye kunokufuna ukufuduswa kwengqiqo yeshishini elidala lenkonzo enjalo kwiinguqulelo ezintsha zamathala eencwadi ukuba bekukho utshintsho olungahambelaniyo phakathi kweenguqulelo.

Ukuhlanganiswa kwesitayela se-BPM

Uluhlu lweenkonzo zeqonga lukwakho kuyilo loyilo, kodwa olu luhlu alusenzi isitya sokwenza i-logic yeshishini lesizinda, kodwa yindawo engqongileyo kuphela, ebonelela ngemisebenzi encedisayo "yeqonga". Uluhlu olunjalo aludingeki nje kuphela ukugcina ubume obukhaphukhaphu be-domain microservices, kodwa kunye nokuphatha ulawulo.

Ngokomzekelo, imisebenzi yabasebenzisi kwiinkqubo zoshishino ivelisa imisebenzi. Nangona kunjalo, xa usebenza ngemisebenzi, umsebenzisi kufuneka abone imisebenzi evela kuzo zonke iindawo kuluhlu oluqhelekileyo, oku kuthetha ukuba kufuneka kubekho inkonzo yokubhalisa umsebenzi weqonga elihambelanayo, elicinyiweyo kwi-logic ye-domain business. Ukugcina i-encapsulation yengqiqo yeshishini kwimeko enjalo kuyingxaki kakhulu, kwaye oku kolunye ulungelelwaniso lolwakhiwo.

Ukudityaniswa kweenkqubo zoshishino ngamehlo omphuhlisi wesicelo

Njengoko kukhankanyiwe ngasentla, umphuhlisi wesicelo kufuneka akhutshwe kwiimpawu zobugcisa kunye nobunjineli bokuphumeza ukusebenzisana kwezicelo ezininzi ukwenzela ukuba umntu athembele kwimveliso yophuhliso oluhle.

Makhe sizame ukusombulula ingxaki enzima yokudibanisa, eyenzelwe inqaku. Oku kuya kuba ngumsebenzi "womdlalo" obandakanya izicelo ezintathu, apho ngamnye kubo echaza igama elithile lesizinda: "app1", "app2", "app3".

Ngaphakathi kwesicelo ngasinye, iinkqubo zoshishino ziqaliswa eziqala "ukudlala ibhola" ngebhasi yokudibanisa. Imiyalezo enegama elithi "Ibhola" iya kusebenza njengebhola.

Imigaqo yeMidlalo:

  • umdlali wokuqala ngumqalisi. Umema abanye abadlali kumdlalo, uqala umdlalo kwaye unokuwuphelisa nangaliphi na ixesha;
  • abanye abadlali babhengeza inxaxheba yabo kumdlalo, "bazane" kunye nomdlali wokuqala;
  • emva kokufumana ibhola, umdlali ukhetha omnye umdlali othatha inxaxheba kwaye ayigqithisele kuye ibhola. Inani lilonke lothumelo libaliwe;
  • Umdlali ngamnye "unamandla" anciphayo ngokupasa kwebhola ngakuloo mdlali. Xa amandla ephela, umdlali ushiya umdlalo, evakalisa ukuyeka kwakhe;
  • ukuba umdlali ushiywe yedwa, ngokukhawuleza uvakalisa ukuhamba kwakhe;
  • Xa bonke abadlali bekhutshiwe, umdlali wokuqala uxela ukuba umdlalo uphelile. Ukuba ushiya umdlalo kwangoko, uhlala elandela umdlalo ukuwugqiba.

Ukuyicombulula le ngxaki, ndiya kusebenzisa i-DSL yethu kwiinkqubo zoshishino, ezisivumela ukuba sichaze i-logic e-Kotlin ngokudibeneyo, kunye nobuncinci be-boilerplate.

Inkqubo yeshishini lomdlali wokuqala (owaziwa ngokuba ngumqalisi womdlalo) uya kusebenza kwisicelo se-app1:

iklasi 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}")
}

Ukongeza ekusebenziseni ingqiqo yezoshishino, ikhowudi engentla inokuvelisa imodeli yento yenkqubo yeshishini, enokuthi ibonwe ngendlela yomzobo. Asikayiphumezi i-visualizer okwangoku, ngoko kwafuneka sichithe ixesha elincinci lokuzoba (apha ndenze lula inqaku le-BPMN malunga nokusetyenziswa kwamasango ukuphucula ukuhambelana komzobo kunye nekhowudi engezantsi):

Ukuhlanganiswa kwesitayela se-BPM

app2 iya kubandakanya inkqubo ishishini lomnye umdlali:

iklasi 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}")
}

Umzobo:

Ukuhlanganiswa kwesitayela se-BPM

Kwisicelo se-app3 siya kwenza umdlali ngokuziphatha okwahlukileyo kancinci: endaweni yokukhetha ngokungenamkhethe umdlali olandelayo, uya kwenza ngokwe-algorithm ye-robin ejikelezayo:

iklasi 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}")
}

Ngaphandle koko, ukuziphatha komdlali akufani nokwangaphambili, ngoko umzobo awutshintshi.

Ngoku sifuna uvavanyo ukuze siqhube yonke le nto. Ndiya kunika kuphela ikhowudi yovavanyo ngokwayo, ukwenzela ukuba ungafaki inqaku nge-boilerplate (enyanisweni, ndasebenzisa indawo yokuvavanya eyenziwe ngaphambili ukuvavanya ukuhlanganiswa kwezinye iinkqubo zoshishino):

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;
}

Masiqhube uvavanyo kwaye sijonge kwilog:

imveliso ye-console

Взята блокировка ключа 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!

Kuzo zonke ezi zinto sinokufikelela kwizigqibo ezininzi ezibalulekileyo:

  • kunye nezixhobo eziyimfuneko, abaphuhlisi bezicelo banokudala intsebenziswano yokudibanisa phakathi kwezicelo ngaphandle kokuphazamisa ingqiqo yezoshishino;
  • ubunzima bomsebenzi wokudibanisa odinga ubuchule bobunjineli bunokufihlwa ngaphakathi kwesakhelo ukuba oku kuqukwa okokuqala kuyilo lwesakhelo. Ubunzima bengxaki abukwazi ukufihlakala, ngoko ke isisombululo sengxaki enzima kwikhowudi siya kufana nayo;
  • Xa kuphuhliswa ingqiqo yokudibanisa, kunyanzelekile ukuba kuthathelwe ingqalelo ukuhambelana kokugqibela kunye nokungabikho kolungelelwaniso lweenguqu kwimeko yabo bonke abathathi-nxaxheba bokudibanisa. Oku kusinyanzela ukuba senze nzima ingqiqo ukuze siyenze ingabi naluvelwano kulandelelwano ezenzeka ngalo iziganeko zangaphandle. Ngokomzekelo wethu, umdlali unyanzelekile ukuba athathe inxaxheba kumdlalo emva kokuchaza ukuphuma kwakhe kumdlalo: abanye abadlali baya kuqhubeka bedlulisela ibhola kuye de ulwazi malunga nokuphuma kwakhe lufikelele kwaye luqhutywe ngabo bonke abathathi-nxaxheba. Le ngqiqo ayilandeli kwimithetho yomdlalo kwaye sisisombululo sokulungelelaniswa ngaphakathi kwesakhelo soyilo olukhethiweyo.

Emva koko, siza kuthetha ngeendidi ezahlukahlukeneyo zesisombululo sethu, ukulungelelaniswa kunye namanye amanqaku.

Yonke imiyalezo ikumgca omnye

Zonke izicelo ezidibeneyo zisebenza ngebhasi enye yokudibanisa, evezwa ngendlela ye-broker yangaphandle, enye i-BPMQueue yemiyalezo kunye nesihloko se-BPTopic seempawu (iziganeko). Ukubeka yonke imiyalezo kumgca omnye kukwayiyo. Kwinqanaba lengqiqo yeshishini, ngoku ungazisa iintlobo ezininzi zemiyalezo emitsha njengoko uthanda ngaphandle kokwenza utshintsho kubume benkqubo. Oku kukwenza lula okubalulekileyo, kodwa kuthwala imingcipheko ethile, ethe ngokomxholo wemisebenzi yethu eqhelekileyo ayizange ibonakale ibaluleke kangako kuthi.

Ukuhlanganiswa kwesitayela se-BPM

Nangona kunjalo, kukho ubuqili obunye apha: isicelo ngasinye sihluza "yaso" imiyalezo emgceni ekungeneni, ngegama lesizinda sayo. Isizinda sinokuchazwa kwiimpawu ukuba ufuna ukunciphisa "umda wokubonakala" kwesignali kwisicelo esinye. Oku kufuneka kwandise ukuhamba kwebhasi, kodwa ingqiqo yezoshishino kufuneka isebenze ngoku ngamagama e-domain: ukujongana nemiyalezo - enyanzelekileyo, kwiimpawu - ezinqwenelekayo.

Ukuqinisekisa ukuThembeka kweBhasi yoManyano

Ukuthembeka kuqulathe amanqaku amaninzi:

  • Umthengisi womyalezo okhethiweyo licandelo elibalulekileyo lolwakhiwo kunye nenqaku elinye lokusilela: kufuneka ikwazi ukumelana neziphene ngokwaneleyo. Kufuneka usebenzise ukuphunyezwa okuvavanywa ixesha kuphela, ngenkxaso efanelekileyo kunye noluntu olukhulu;
  • kuyimfuneko ukuqinisekisa ukufumaneka okuphezulu kwe-broker yomyalezo, apho kufuneka kuhlulwe ngokwasemzimbeni kwizicelo ezidibeneyo (ukufumaneka okuphezulu kwezicelo kunye nengqiqo yoshishino olusetyenzisiweyo kunzima kakhulu kwaye kuyabiza kakhulu ukuqinisekisa);
  • umthengisi unyanzelekile ukuba abonelele "ubuncinci kube kanye" iziqinisekiso zokuhanjiswa. Oku kuyimfuneko enyanzelekileyo ekusebenzeni okuthembekileyo kwebhasi yokudibanisa. Akukho mfuneko yeziqinisekiso zenqanaba "kanye kanye": iinkqubo zoshishino, njengomthetho, azikhathaleli ukufika ngokuphindaphindiweyo kwemiyalezo okanye iziganeko, kwaye kwimisebenzi ekhethekileyo apho oku kubalulekile, kulula ukongeza iitshekhi ezongezelelweyo kwishishini. ingqiqo kunokusebenzisa rhoqo iziqinisekiso "ezixabisa kakhulu" ";
  • ukuthumela imiyalezo kunye nemiqondiso kufuneka kubandakanyeke kwintengiselwano ngokubanzi kunye notshintsho kwimeko yeenkqubo zoshishino kunye neenkcukacha zesizinda. Inketho ekhethiweyo iya kuba kukusebenzisa ipateni Ibhokisi yokuphuma yentengiselwano, kodwa iya kufuna itafile eyongezelelweyo kwisiseko sedatha kunye nokuphindaphinda. Kwizicelo zeJEE, oku kunokwenziwa lula ngokusebenzisa umphathi weJTA yobulali, kodwa uxhulumaniso kumthengisi okhethiweyo kufuneka lukwazi ukusebenza XA;
  • abaphathi bemiyalezo engenayo kunye neziganeko kufuneka kwakhona basebenze ngentengiselwano etshintsha imeko yenkqubo yeshishini: ukuba loo ntengiselwano ibuyiselwe umva, ngoko ke ukufunyanwa komyalezo kufuneka kucinywe;
  • imiyalezo engathunyelwanga ngenxa yeempazamo kufuneka igcinwe kwindawo eyahlukileyo I-DLQ (Uluhlu lweeleta ezifileyo). Ngenxa yale njongo, senze i-microservice yeqonga eyahlukileyo egcina imiyalezo enjalo kwisitoreji sayo, izalathise ngeempawu (ukwenza amaqela ngokukhawuleza kunye nokukhangela), kwaye iveze i-API yokujonga, ukuthumela kwakhona kwidilesi yendawo, kunye nokucima imiyalezo. Abalawuli benkqubo banokusebenza nale nkonzo ngojongano lwewebhu;
  • kwizicwangciso zomthengisi, kufuneka uhlengahlengise inani lokuzama kwakhona konikezelo kunye nolibaziseko phakathi kokuhanjiswa ukuze unciphise amathuba okuba imiyalezo ingene kwi-DLQ (phantse akunakwenzeka ukubala eyona parameters ilungileyo, kodwa ungenza amandla kwaye uhlengahlengise ngexesha lomsebenzi. );
  • Ivenkile ye-DLQ kufuneka ibekwe esweni ngokuqhubekayo, kwaye inkqubo yokubeka iliso kufuneka ilumkise abalawuli beesistim ukwenzela ukuba xa imiyalezo engathunyelwanga ivela, banokuphendula ngokukhawuleza. Oku kuya kunciphisa "indawo echaphazelekayo" yokusilela okanye impazamo yengqiqo yeshishini;
  • ibhasi yokudibanisa kufuneka ingabi naluvelwano kukungabikho okwethutyana kwezicelo: imirhumo kwisihloko kufuneka ihlale ixesha elide, kwaye igama lesizinda sesicelo kufuneka libe lodwa ukuze ngelixa isicelo singekho, omnye umntu akayi kuzama ukucubungula imiyalezo evela umgca.

Ukuqinisekisa ukhuseleko lomsonto kwingqiqo yeshishini

Umzekelo ofanayo wenkqubo yeshishini unokufumana imiyalezo emininzi kunye neziganeko ngexesha elinye, ukuqhutyelwa phambili kuya kuqala ngokuhambelana. Ngexesha elifanayo, kumphuhlisi wesicelo, yonke into kufuneka ibe lula kwaye ikhuseleke ngentambo.

Ingqiqo yeshishini yenkqubo iqhuba isiganeko ngasinye sangaphandle esichaphazela inkqubo yoshishino ngabanye. Iziganeko ezinjalo zinokuba:

  • ukusungula umzekelo wenkqubo yeshishini;
  • isenzo somsebenzisi esinxulumene nomsebenzi ngaphakathi kwenkqubo yeshishini;
  • ukufumana umyalezo okanye umqondiso apho inkqubo yeshishini ibhalisiwe;
  • ukuxhokonxa isibali-xesha esisekwe ngumzekelo wenkqubo yeshishini;
  • ukulawula isenzo nge-API (umzekelo, ukuphazamiseka kwenkqubo).

Isiganeko ngasinye esinjalo sinokutshintsha imeko yenkqubo yeshishini: eminye imisebenzi inokuphela kwaye eminye inokuqala, kwaye amaxabiso eepropathi eziqhubekayo anokutshintsha. Ukuvala nawuphi na umsebenzi kunokubangela ukuba kusebenze enye okanye ngaphezulu kwale misebenzi ilandelayo. Abo, nabo, banokuyeka ukulinda ezinye iziganeko okanye, ukuba abafuni nayiphi na idatha eyongezelelweyo, banokugqiba kwintengiselwano efanayo. Ngaphambi kokuvala ukuthengiselana, imeko entsha yenkqubo yeshishini igcinwa kwi-database, apho iya kulinda isiganeko esilandelayo sangaphandle.

Idatha yenkqubo yeshishini eqhubekayo egcinwe kwisiseko sedatha yobudlelwane yindawo efanelekileyo kakhulu yokulungelelanisa ukuba usebenzisa KHETHA UHLAZIYO. Ukuba enye intengiselwano ikwazile ukufumana imeko yenkqubo yeshishini ukusuka kwisiseko sokutshintsha, ke akukho nto enye intengiselwano ngokuhambelana iya kukwazi ukufumana imeko efanayo yolunye utshintsho, kwaye emva kokugqitywa kwentengiselwano yokuqala, eyesibini. uqinisekisiwe ukufumana imeko esele itshintshiwe.

Ukusebenzisa izitshixo ezingenathemba kwicala le-DBMS, sizalisekisa zonke iimfuno eziyimfuneko I-ACID, kunye nokugcina ukukwazi ukulinganisa isicelo ngengqiqo yezoshishino ngokwandisa inani leemeko ezisebenzayo.

Nangona kunjalo, izitshixo ezingenathemba zisigrogrisa ngokuvalwa, nto leyo ethetha ukuba KHETHA UKUHLAZIYA kufuneka kusafuneka kuthintelwe ixesha elithile elifanelekileyo ukuba kunokwenzeka ukuba ukuvalwa kwexesha kusenzeka kwiimeko ezithile ezimandundu kwingcinga yeshishini.

Enye ingxaki kukulungelelaniswa kokuqala kwenkqubo yeshishini. Nangona kungekho mzekelo wenkqubo yeshishini, akukho mbuso kwisiseko sedatha, ngoko indlela echazwe ngayo ayiyi kusebenza. Ukuba ufuna ukuqinisekisa ukungafani komzekelo wenkqubo yeshishini kwi-scope ethile, ngoko uya kufuna uhlobo oluthile lwento yongqamaniso ehambelana neklasi yenkqubo kunye nobubanzi obuhambelanayo. Ukusombulula le ngxaki, sisebenzisa indlela eyahlukileyo yokutshixa esivumela ukuba sithathe iqhaga kwisixhobo esinesizathu esichazwe sisitshixo kwifomathi ye-URI ngenkonzo yangaphandle.

Kwimizekelo yethu, inkqubo yeshishini ye-InitialPlayer iqulethe isibhengezo

uniqueConstraint = UniqueConstraints.singleton

Ke ngoko, ilogi iqulethe imiyalezo malunga nokuthatha kunye nokukhulula isitshixo sesitshixo esihambelanayo. Akukho miyalezo enjalo yezinye iinkqubo zoshishino: uniqueConstraint ayimiselwanga.

Iingxaki zeenkqubo zoshishino kunye nombuso oqhubekayo

Ngamanye amaxesha ukuba nemeko eqhubekayo akuncedi nje kuphela, kodwa kwakhona kuthintela ngokwenene uphuhliso.
Iingxaki ziqala xa utshintsho kufuneka lwenziwe kwingqiqo yeshishini kunye / okanye imodeli yenkqubo yeshishini. Ayilulo lonke utshintsho olunjalo oluhambelana nemeko yakudala yeenkqubo zoshishino. Ukuba kukho iimeko ezininzi eziphilayo kwisiseko sedatha, ngoko ukwenza utshintsho olungahambelaniyo kunokubangela ingxaki enkulu, esasihlala sidibana nayo xa sisebenzisa i-jBPM.

Ngokuxhomekeke kubunzulu botshintsho, unokwenza ngeendlela ezimbini:

  1. yenza uhlobo olutsha lwenkqubo yeshishini ukwenzela ukuba ungenzi utshintsho olungahambelaniyo kumdala, kwaye uyisebenzise endaweni yendala xa usungula iimeko ezintsha. Iikopi ezindala ziya kuqhubeka zisebenza “njengangaphambili”;
  2. fuduka imeko ethe gqolo yeenkqubo zoshishino xa uhlaziya ingqiqo yeshishini.

Indlela yokuqala ilula, kodwa inemida kunye nokungonakali, umzekelo:

  • ukuphindaphinda ingqiqo yoshishino kwiimodeli ezininzi zenkqubo yoshishino, ukwandisa umthamo wengqiqo yoshishino;
  • Ngokuqhelekileyo utshintsho olukhawulezileyo kwingqiqo yeshishini elitsha luyafuneka (ngokwemigaqo yemisebenzi yokudibanisa - phantse rhoqo);
  • umphuhlisi akazi ukuba yeyiphi na indawo imifuziselo ephelelwe lixesha inokucinywa.

Ngokuziqhelanisa sisebenzisa iindlela zombini, kodwa senze inani lezigqibo ukwenza ubomi bethu bube lula:

  • Kwisiseko sedatha, imeko eqhubekayo yenkqubo yeshishini igcinwa kwifomu efundeka lula kwaye iqhutywe ngokulula: kumtya wefomathi ye-JSON. Oku kuvumela ukufuduka ukuba kwenziwe zombini ngaphakathi kwesicelo nangaphandle. Njengento yokugqibela, ungayilungisa ngesandla (iluncedo ngakumbi kuphuhliso ngexesha lokulungisa iimpazamo);
  • ingqiqo yoshishino lokudibanisa ayisebenzisi amagama eenkqubo zoshishino, ukwenzela ukuba nangaliphi na ixesha kunokwenzeka ukubuyisela ukuphunyezwa kwenkqubo enye yokuthatha inxaxheba kunye nentsha enegama elitsha (umzekelo, "InitialPlayerV2"). Ukubophelela kwenzeka ngomyalezo kunye namagama emiqondiso;
  • imodeli yenkqubo inenombolo yoguqulelo, esiyinyusayo ukuba senza utshintsho olungahambelaniyo kulo mzekelo, kwaye eli nani ligcinwa kunye nemeko yomzekelo wenkqubo;
  • imeko eqhubekayo yenkqubo ifundwa kwisiseko sedatha kuqala ibe yimodeli yento efanelekileyo, apho inkqubo yokufuduka inokusebenza nayo ukuba inombolo yenguqulo yomzekelo itshintshile;
  • inkqubo yokufuduka ibekwe ecaleni kwengqiqo yeshishini kwaye ibizwa ngokuba "yivila" kwimeko nganye yenkqubo yeshishini ngexesha lokubuyiselwa kwayo kwisiseko sedatha;
  • ukuba ufuna ukufudusa imeko yazo zonke iimeko zenkqubo ngokukhawuleza nangexeshanye, izisombululo zokufuduka zesiseko sedata ziyasetyenziswa, kodwa kufuneka usebenze nge JSON.

Ngaba ufuna esinye isakhelo seenkqubo zoshishino?

Izisombululo ezichazwe kweli nqaku zisivumele ukuba sibenze lula ubomi bethu, sandise uluhlu lwemiba esonjululwe kwinqanaba lophuhliso lwesicelo, kwaye senze umbono wokwahlula ingqiqo yeshishini kwiinkonzo ezincinci zibe nomtsalane ngakumbi. Ukufezekisa oku, umsebenzi omningi wenziwa, isakhelo "esilula" kakhulu seenkqubo zoshishino senziwe, kunye namacandelo eenkonzo zokusombulula iingxaki ezichongiweyo kumxholo weengxaki ezininzi zezicelo. Sinomnqweno wokwabelana ngezi ziphumo kwaye senze uphuhliso lwamacandelo aqhelekileyo luvuleleke ukufikelela phantsi kwelayisensi yasimahla. Oku kuya kufuna umgudu kunye nexesha. Ukuqonda imfuno yezisombululo ezinjalo kunokuba yinkuthazo eyongezelelweyo kuthi. Kwinqaku elicetywayo, ingqwalasela encinci ihlawulwa kwizakhono zesakhelo ngokwawo, kodwa ezinye zazo zibonakala kwimizekelo enikeziweyo. Ukuba siyayipapasha isakhelo sethu, inqaku elahlukileyo liya kunikezelwa kulo. Okwangoku, siya kuba nombulelo ukuba ushiya ingxelo encinci ngokuphendula umbuzo:

Ngabasebenzisi ababhalisiweyo kuphela abanokuthatha inxaxheba kuphando. Ngena, ndiyacela.

Ngaba ufuna esinye isakhelo seenkqubo zoshishino?

  • 18,8%Ewe kudala ndiyikhangela into enje

  • 12,5%Ndinomdla wokufunda ngakumbi malunga nokuphunyezwa kwakho, kunokuba luncedo2

  • 6,2%Sisebenzisa esinye sezikhokelo ezikhoyo, kodwa sicinga ngokubuyisela1

  • 18,8%Sisebenzisa esinye sezikhokelo ezikhoyo, yonke into ilungile3

  • 18,8%silawula ngaphandle kwesakhelo3

  • 25,0%bhala eyakho4

Bali-16 abasebenzisi abavotileyo. Abasebenzisi abasi-7 abakhange.

umthombo: www.habr.com

Yongeza izimvo