Amalachadh stoidhle BPM

Amalachadh stoidhle BPM

Halò, Habr!

Tha a ’chompanaidh againn gu sònraichte a’ leasachadh fuasglaidhean bathar-bog clas ERP, anns a bheil cuibhreann an leòmhann air a ghabhail thairis le siostaman malairt le tòrr loidsig gnìomhachais agus sruth-obrach a la EDMS. Tha dreachan ùr-nodha de na toraidhean againn stèidhichte air teicneòlasan JavaEE, ach tha sinn cuideachd gu gnìomhach a’ feuchainn le microservices. Is e aon de na raointean as duilghe de fhuasglaidhean mar sin amalachadh diofar fo-shiostaman co-cheangailte ri raointean faisg air làimh. Tha gnìomhan amalachaidh an-còmhnaidh air ceann goirt a thoirt dhuinn, ge bith dè na stoidhlichean ailtireachd, cruachan teicneòlais agus frèaman a bhios sinn a’ cleachdadh, ach o chionn ghoirid chaidh adhartas a dhèanamh ann a bhith a’ fuasgladh dhuilgheadasan mar sin.

Anns an artaigil a chaidh a thoirt gu d ’aire, bruidhnidh mi mu eòlas agus rannsachadh ailtireachd NPO Krista anns an raon ainmichte. Beachdaichidh sinn cuideachd air eisimpleir de fhuasgladh sìmplidh air duilgheadas amalachaidh bho shealladh leasaiche tagraidh agus gheibh sinn a-mach dè a tha falaichte air cùl na sìmplidheachd seo.

Àicheadh

Tha na fuasglaidhean ailtireil is teignigeach a tha air am mìneachadh san artaigil air an tabhann leam stèidhichte air eòlas pearsanta ann an co-theacsa gnìomhan sònraichte. Chan eil na fuasglaidhean sin ag ràdh gu bheil iad uile-choitcheann agus is dòcha nach bi iad as fheàrr fo chumhachan cleachdaidh eile.

Dè a th’ aig BPM ri dhèanamh leis?

Gus a’ cheist seo a fhreagairt, feumaidh sinn beagan rannsachaidh a dhèanamh air na duilgheadasan gnìomhaichte anns na fuasglaidhean againn. Is e am prìomh phàirt de loidsig gnìomhachais anns an t-siostam malairt àbhaisteach againn inntrigeadh dàta a-steach don stòr-dàta tro eadar-aghaidh luchd-cleachdaidh, dearbhadh làimhe agus fèin-ghluasadach den dàta seo, ga thoirt tro chuid de shruth-obrach, ga fhoillseachadh gu siostam eile / stòr-dàta anailis / tasglann, a’ gineadh aithisgean. Mar sin, is e prìomh obair an t-siostaim airson luchd-ceannach fèin-ghluasad nam pròiseasan gnìomhachais a-staigh aca.

Airson goireasachd, bidh sinn a’ cleachdadh an fhacail “sgrìobhainn” ann an conaltradh mar beagan tarraing air seata dàta, aonaichte le iuchair chumanta, ris am faodar sruth-obrach sònraichte a bhith “ceangailte”.
Ach dè mu dheidhinn loidsig amalachaidh? Às deidh na h-uile, tha an obair amalachaidh air a chruthachadh le ailtireachd an t-siostaim, a tha “air a shàbhadh” ann am pàirtean NACH EIL air iarrtas an neach-ceannach, ach fo bhuaidh factaran gu tur eadar-dhealaichte:

  • fo bhuaidh lagh Chonaill;
  • mar thoradh air ath-chleachdadh fo-shiostaman a chaidh a leasachadh roimhe airson toraidhean eile;
  • mar a chaidh a cho-dhùnadh leis an ailtire, stèidhichte air riatanasan neo-ghnìomhach.

Tha buaireadh mòr ann an loidsig amalachaidh a sgaradh bho loidsig gnìomhachais a’ phrìomh shruth-obrach gus nach truailleadh iad loidsig a’ ghnìomhachais le artifacts amalachaidh agus gus leasaiche an tagraidh a shàbhaladh bho bhith a’ dol a-steach do nithean sònraichte cruth-tìre ailtireachd an t-siostaim. Tha grunn bhuannachdan aig an dòigh-obrach seo, ach tha cleachdadh a 'sealltainn cho neo-èifeachdach' sa tha e:

  • mar as trice bidh fuasgladh dhuilgheadasan amalachaidh a’ sleamhnachadh sìos gu na roghainnean as sìmplidh ann an cruth gairmean sioncronaich mar thoradh air na puingean leudachaidh cuibhrichte ann am buileachadh a’ phrìomh shruth-obrach (barrachd air easbhaidhean amalachadh sioncronaich gu h-ìosal);
  • bidh artifacts amalachaidh fhathast a’ dol a-steach do phrìomh loidsig a’ ghnìomhachais nuair a tha feum air fios air ais bho fho-shiostam eile;
  • bidh leasaiche an tagraidh a’ seachnadh an aonachadh agus is urrainn dha a bhriseadh gu furasta le bhith ag atharrachadh an t-sruth-obrach;
  • sguir an siostam a bhith na aon iomlan bho shealladh an neach-cleachdaidh, bidh “seams” eadar fo-shiostaman a’ tighinn am follais, tha coltas ann gu bheil gnìomhachd cleachdaiche gun fheum a’ tòiseachadh gluasad dàta bho aon fho-shiostam gu fear eile.

Is e dòigh eile a bhith a’ beachdachadh air eadar-obrachaidhean amalachaidh mar phàirt riatanach de phrìomh loidsig gnìomhachais agus sruth-obrach. Gus riatanasan sgil luchd-leasachaidh tagraidh a chumail bho bhith a’ sìor fhàs, bu chòir eadar-obrachaidhean amalachaidh ùra a chruthachadh gu furasta agus gu nàdarra, le glè bheag de roghainnean airson fuasgladh a thaghadh. Tha seo nas duilghe na tha e a 'coimhead: feumaidh an inneal a bhith cumhachdach gu leòr gus am measgachadh riatanach de roghainnean a thoirt don neach-cleachdaidh airson a chleachdadh agus aig an aon àm gun a bhith a' leigeil leotha fhèin a bhith air a losgadh sa chas. Tha mòran cheistean ann a dh’ fheumas innleadair a fhreagairt ann an co-theacsa gnìomhan amalachaidh, ach nach bu chòir do leasaiche tagraidh smaoineachadh orra san obair làitheil aca: crìochan malairt, cunbhalachd, atomachd, tèarainteachd, sgèileadh, cuairteachadh luchdan is ghoireasan, slighe, marasgal, Tha e riatanach teamplaidean co-dhùnaidh gu math sìmplidh a thabhann do luchd-leasachaidh tagraidh, anns a bheil freagairtean nan ceistean sin uile falaichte mu thràth. Bu chòir na pàtrain sin a bhith tèarainte gu leòr: bidh an loidsig gnìomhachais ag atharrachadh gu math tric, a tha a 'meudachadh chunnart mearachdan a thoirt a-steach, bu chòir cosgais mhearachdan fuireach aig ìre gu math ìosal.

Ach fhathast, dè a th’ aig BPM ri dhèanamh leis? Tha mòran roghainnean ann airson sruth-obrach a bhuileachadh ...
Gu dearbh, tha buileachadh eile de phròiseasan gnìomhachais gu math tarraingeach anns na fuasglaidhean againn - tro shuidheachadh dearbhach an diagram gluasaid stàite agus a 'ceangal luchd-làimhseachaidh le loidsig gnìomhachais ris na h-eadar-ghluasadan. Aig an aon àm, tha an stàit a tha a 'dearbhadh suidheachadh làithreach an "sgrìobhainn" anns a' phròiseas gnìomhachais na fheart den "sgrìobhainn" fhèin.

Amalachadh stoidhle BPM
Seo mar a tha am pròiseas coltach aig toiseach a’ phròiseict

Tha fèill mhòr air a leithid de bhuileachadh mar thoradh air cho sìmplidh agus cho luath sa tha cruthachadh pròiseasan gnìomhachais sreathach. Ach, mar a bhios siostaman bathar-bog a’ fàs nas iom-fhillte, bidh am pàirt fèin-ghluasadach den phròiseas gnìomhachais a’ fàs agus a’ fàs nas iom-fhillte. Tha feum air lobhadh, ath-chleachdadh pàirtean de phròiseasan, a bharrachd air pròiseasan forking gus am bi gach meur air a chur gu bàs ann an co-shìnte. Fo chumhachan mar sin, bidh an inneal a ’fàs mì-ghoireasach, agus bidh an diagram gluasaid stàite a’ call an t-susbaint fiosrachaidh aige (chan eil eadar-obrachaidhean amalachaidh air an nochdadh anns an diagram idir).

Amalachadh stoidhle BPM
Seo cò ris a bhios am pròiseas coltach às deidh grunn thursan gus na riatanasan a shoilleireachadh

B 'e an t-slighe a-mach às an t-suidheachadh seo amalachadh an einnsean jBPM a-steach do chuid de thoraidhean leis na pròiseasan gnìomhachais as iom-fhillte. Anns a’ gheàrr-ùine, bha beagan soirbheachais air a bhith aig an fhuasgladh seo: bha e comasach pròiseasan gnìomhachais iom-fhillte a chuir an gnìomh agus aig an aon àm a’ cumail suas diagram a bha gu math fiosrachail agus as ùire anns a’ chomharra BPMN2.

Amalachadh stoidhle BPM
Pàirt bheag de phròiseas gnìomhachais iom-fhillte

San fhad-ùine, cha do choinnich am fuasgladh ris na bha dùil: cha do leig an dian saothair ann a bhith a’ cruthachadh phròiseasan gnìomhachais tro innealan lèirsinneach comharran cinneasachd iomchaidh, agus thàinig an inneal fhèin gu bhith mar aon den fheadhainn nach do chòrd am measg luchd-leasachaidh. Bha gearanan ann cuideachd mu structar taobh a-staigh an einnsein, a lean gu coltas mòran de "pàircidhean" agus "crutches".

B’ e am prìomh thaobh adhartach de bhith a’ cleachdadh jBPM a bhith a’ toirt a-mach na buannachdan agus na cronan a tha an cois a staid sheasmhach fhèin a bhith ann airson pròiseas gnìomhachais. Chunnaic sinn cuideachd comasachd dòigh-obrach pròiseas a chleachdadh gus protocolaidhean amalachaidh iom-fhillte a chuir an gnìomh eadar diofar thagraidhean a’ cleachdadh eadar-obrachaidhean asyncronach tro chomharran agus teachdaireachdan. Tha àite deatamach aig làthaireachd stàite leantainneach ann an seo.

Stèidhichte air na tha gu h-àrd, faodaidh sinn a cho-dhùnadh: Tha an dòigh-obrach pròiseas ann an stoidhle BPM a’ toirt cothrom dhuinn raon farsaing de ghnìomhan fhuasgladh airson pròiseasan gnìomhachais a tha a’ sìor fhàs nas iom-fhillte a dhèanamh fèin-ghluasadach, gnìomhan amalachaidh a chuir a-steach gu co-chòrdail anns na pròiseasan sin agus an comas am pròiseas gnìomhaichte a thaisbeanadh gu fradharcach ann an comharradh iomchaidh.

Eas-bhuannachdan gairmean sioncronaich mar phàtran amalachaidh

Tha amalachadh sioncronaich a ’toirt iomradh air a’ ghairm bacadh as sìmplidh. Bidh aon fho-shiostam ag obair mar thaobh an fhrithealaiche agus a’ nochdadh an API leis an dòigh a tha thu ag iarraidh. Bidh fo-shiostam eile ag obair mar thaobh teachdaiche agus, aig an àm cheart, a’ dèanamh gairm le dùil ri toradh. A rèir ailtireachd an t-siostaim, faodar taobhan an neach-dèiligidh agus an fhrithealaiche a chumail an dàrna cuid san aon iarrtas agus pròiseas, no ann an feadhainn eadar-dhealaichte. Anns an dàrna cùis, feumaidh tu cuid de bhuileachadh RPC a chuir an sàs agus stiùireadh a thoirt seachad air na paramadairean agus toradh a ’ghairm.

Amalachadh stoidhle BPM

Tha seata mòr de eas-bhuannachdan aig a leithid de phàtran amalachaidh, ach tha e air a chleachdadh gu farsaing ann an cleachdadh air sgàth cho sìmplidh ‘s a tha e. Bidh astar buileachaidh a ’glacadh agus a’ toirt ort a chuir an sàs a-rithist agus a-rithist ann an suidheachaidhean cinn-latha “losgadh”, a ’sgrìobhadh am fuasgladh gu fiachan teicnigeach. Ach tha e cuideachd a 'tachairt gu bheil luchd-leasachaidh gun eòlas ga chleachdadh gun mhothachadh, dìreach gun a bhith a' toirt a-mach na buaidhean àicheil.

A bharrachd air an àrdachadh as follaisiche ann an ceangal fo-shiostaman, tha duilgheadasan nach eil cho follaiseach ann le gnothaichean "sgaoileadh" agus "sìneadh". Gu dearbh, ma nì loidsig gnìomhachais atharrachaidhean sam bith, tha gnothaichean riatanach, agus bidh gnothaichean, an uair sin, a’ glasadh cuid de ghoireasan tagraidh air an tug na h-atharrachaidhean sin buaidh. Is e sin, gus am bi aon fho-shiostam a’ feitheamh ri freagairt bho neach eile, cha bhith e comasach dha an gnothach a chrìochnachadh agus glasan a leigeil ma sgaoil. Tha seo a 'meudachadh gu mòr an cunnart bho dhiofar bhuaidhean:

  • tha freagairteachd an t-siostaim air a chall, bidh luchd-cleachdaidh a 'feitheamh ùine mhòr airson freagairtean air iarrtasan;
  • mar as trice bidh am frithealaiche a’ stad a bhith a’ freagairt iarrtasan luchd-cleachdaidh mar thoradh air cruinneachadh snàithlean a tha a’ cur thairis: bidh a’ mhòr-chuid de na snàithleanan “nan seasamh” air glas a’ ghoireas a tha an gnothach a’ gabhail thairis;
  • bidh glasan-glasaidh a’ tòiseachadh a’ nochdadh: tha an coltachd gun tachair iad gu mòr an urra ri fad nan gnothaichean, an ìre de loidsig gnìomhachais agus glasan a tha an sàs sa ghnothach;
  • nochdaidh mearachdan crìochnachaidh ùine malairt;
  • bidh am frithealaiche “a’ tuiteam ”air OutOfMemory ma dh’ fheumas a ’ghnìomh a bhith a’ giullachd agus ag atharrachadh mòran dàta, agus gu bheil làthaireachd aonachadh sioncronaich ga dhèanamh glè dhoirbh an giollachd a roinn ann an gnothaichean “nas aotroime”.

Bho shealladh ailtireil, tha cleachdadh gairmean bacaidh aig àm amalachaidh a’ leantainn gu call smachd càileachd air fo-shiostaman fa leth: tha e do-dhèanta dèanamh cinnteach à targaidean càileachd aon fho-shiostam leotha fhèin bho thargaidean càileachd fo-shiostam eile. Ma thèid fo-shiostaman a leasachadh le diofar sgiobaidhean, tha seo na dhuilgheadas mòr.

Bidh cùisean a’ fàs eadhon nas inntinniche ma tha na fo-shiostaman a tha air am filleadh a-steach ann an diofar thagraidhean agus feumar atharrachaidhean sioncronaich a dhèanamh air gach taobh. Ciamar a nì thu na h-atharrachaidhean sin malairt?

Ma thèid atharrachaidhean a dhèanamh ann an gnothaichean fa leth, feumar làimhseachadh eisgeachd làidir agus dìoladh a thoirt seachad, agus tha seo gu tur a’ cur às do phrìomh bhuannachd aonachadh sioncronaich - sìmplidheachd.

Bidh gnothaichean sgaoilte cuideachd a’ tighinn gu inntinn, ach cha bhith sinn gan cleachdadh nar fuasglaidhean: tha e duilich dèanamh cinnteach à earbsachd.

"Saga" mar fhuasgladh air an duilgheadas de ghnothaichean

Leis mar a tha fèill mhòr air microservices, tha iarrtas a’ sìor fhàs Pàtran Saga.

Bidh am pàtran seo gu foirfe a’ fuasgladh nan duilgheadasan gu h-àrd a thaobh gnothaichean fada, agus cuideachd a’ leudachadh na cothroman air staid an t-siostaim a riaghladh bho thaobh loidsig gnìomhachais: is dòcha nach bi airgead-dìolaidh às deidh gnothach neo-shoirbheachail a’ toirt air ais an siostam chun an t-suidheachaidh thùsail aige, ach a’ toirt seachad roghainn eile. slighe giollachd dàta. Leigidh e leat cuideachd gun a bhith ag ath-aithris ceumannan giollachd dàta a chaidh a chrìochnachadh gu soirbheachail nuair a dh’ fheuchas tu ris a’ phròiseas a thoirt gu crìch “math”.

Gu inntinneach, ann an siostaman monolithic, tha am pàtran seo cuideachd buntainneach nuair a thig e gu bhith ag amalachadh fo-shiostaman ceangailte gu fuasgailte agus tha droch bhuaidh air adhbhrachadh le gnothaichean fada agus na glasan ghoireasan co-fhreagarrach.

A thaobh ar pròiseasan gnìomhachais ann an stoidhle BPM, tha e a ’tionndadh a-mach gu bheil e gu math furasta na Sagas a bhuileachadh: faodar ceumannan fa leth nan Sagas a shuidheachadh mar ghnìomhachd taobh a-staigh a’ phròiseas gnìomhachais, agus tha staid leantainneach a ’phròiseas gnìomhachais a’ dearbhadh, am measg nithe eile, staid a staigh nan Sagas. Is e sin, chan eil feum againn air uidheamachd co-òrdanachaidh a bharrachd. Chan eil agad ach broker teachdaireachd le taic airson gealltanasan “co-dhiù aon uair” mar chòmhdhail.

Ach tha a "phrìs" fhèin aig fuasgladh mar seo:

  • bidh loidsig gnìomhachais a’ fàs nas iom-fhillte: feumaidh tu airgead-dìolaidh obrachadh a-mach;
  • bidh feum air làn-sheasmhachd a thrèigsinn, a dh'fhaodas a bhith gu sònraichte mothachail airson siostaman monolithic;
  • bidh an ailtireachd a’ fàs beagan nas iom-fhillte, tha feum a bharrachd air broker teachdaireachd;
  • bidh feum air innealan sgrùdaidh is rianachd a bharrachd (ged a tha seo san fharsaingeachd eadhon math: àrdaichidh càileachd seirbheis siostam).

Airson siostaman monolithic, chan eil am fìreanachadh airson a bhith a 'cleachdadh "Sags" cho follaiseach. Airson microservices agus SOAn eile, far a bheil, nas coltaiche, gu bheil broker ann mu thràth, agus chaidh làn sheasmhachd a thoirt seachad aig toiseach a ’phròiseict, faodaidh na buannachdan bho bhith a’ cleachdadh a ’phàtran seo gu mòr a bhith nas àirde na na h-eas-bhuannachdan, gu sònraichte ma tha API goireasach aig an ìre loidsig gnìomhachais.

Gabhail a-steach logic gnìomhachas ann am microservices

Nuair a thòisich sinn a’ feuchainn le microservices, dh’ èirich ceist reusanta: càite an cuir thu loidsig gnìomhachas an fhearainn a thaobh na seirbheis a bheir seachad seasmhachd dàta fearainn?

Nuair a bhios tu a’ coimhead air ailtireachd diofar BPMS, dh’ fhaodadh gum biodh e reusanta loidsig gnìomhachais a sgaradh bho sheasmhachd: cruthaich sreath de àrd-ùrlar agus meanbh-sheirbheisean a tha neo-eisimeileach air fearann ​​​​a bhios mar an àrainneachd agus an soitheach airson loidsig gnìomhachais fearainn a chuir an gnìomh, agus cuir air dòigh seasmhachd dàta fearainn mar rud air leth. sreath de mhicro-sheirbheisean gu math sìmplidh agus aotrom. Bidh pròiseasan gnìomhachais sa chùis seo a’ stiùireadh seirbheisean an t-sreath seasmhachd.

Amalachadh stoidhle BPM

Tha buannachd mhòr aig an dòigh-obrach seo: faodaidh tu gnìomhachd an àrd-ùrlar àrdachadh cho mòr ‘s as toil leat, agus is e dìreach an ìre co-fhreagarrach de mhicro-sheirbheisean àrd-ùrlar a gheibh“ geir ”bho seo. Bidh pròiseasan gnìomhachais bho raon sam bith a’ faighinn cothrom sa bhad comas-gnìomh ùr an àrd-ùrlar a chleachdadh cho luath ‘s a thèid ùrachadh.

Nochd sgrùdadh nas mionaidiche easbhaidhean mòra san dòigh-obrach seo:

  • seirbheis àrd-ùrlar a bhios a’ cur an gnìomh loidsig gnìomhachais iomadh raon aig an aon àm a’ giùlan chunnartan mòra mar aon phuing fàiligeadh. Bidh atharrachaidhean tric ann an loidsig gnìomhachais ag àrdachadh cunnart bho bhiteagan a’ leantainn gu fàilligidhean air feadh an t-siostaim;
  • cùisean dèanadais: bidh loidsig gnìomhachais ag obair leis an dàta aige tro eadar-aghaidh caol agus slaodach:
    • thèid an dàta a stiùireadh a-rithist agus a phumpadh tron ​​stac lìonra;
    • gu tric bidh an t-seirbheis fearainn a’ tilleadh barrachd dàta na tha a dhìth air loidsig a’ ghnìomhachais airson a ghiullachd, air sgàth ‘s nach eil comasan parameter ceist gu leòr aig ìre API taobh a-muigh na seirbheis;
    • faodaidh grunn phìosan neo-eisimeileach de loidsig gnìomhachais ath-iarraidh a-rithist air an aon dàta airson a ghiullachd (faodaidh tu an duilgheadas seo a lasachadh le bhith a’ cur pònairean seisean ris a bhios a’ tasgadh dàta, ach tha seo a’ dèanamh tuilleadh iom-fhillte air an ailtireachd agus a’ cruthachadh dhuilgheadasan a thaobh ùrachadh dàta agus neo-dhligheachadh tasgadan);
  • cùisean malairt:
    • tha pròiseasan gnìomhachais le staid leantainneach air an stòradh le seirbheis an àrd-ùrlair neo-chunbhalach le dàta fearainn, agus chan eil dòighean furasta ann gus an duilgheadas seo fhuasgladh;
    • gluasad glas dàta fearainn a-mach às a’ ghnothach: ma dh’ fheumas loidsig gnìomhachas an fhearainn atharrachaidhean a dhèanamh, às deidh sgrùdadh a dhèanamh an-toiseach air ceartachd an dàta fhèin, feumar casg a chuir air comasachd atharrachadh farpaiseach san dàta giullachd. Faodaidh bacadh dàta bhon taobh a-muigh cuideachadh le fuasgladh fhaighinn air an duilgheadas, ach tha fuasgladh mar sin a’ giùlan chunnartan a bharrachd agus a’ lughdachadh earbsachd iomlan an t-siostaim;
  • duilgheadasan a bharrachd nuair a bhios tu ag ùrachadh: ann an cuid de chùisean, feumaidh tu an t-seirbheis leantainneachd agus loidsig gnìomhachais ùrachadh gu sioncronaich no ann an òrdugh teann.

Aig a 'cheann thall, b' fheudar dhomh a dhol air ais gu bunaitean: cuir a-steach dàta fearainn agus loidsig gnìomhachas fearainn ann an aon microservice. Tha an dòigh-obrach seo a 'sìmpleachadh a' bheachd gu bheil am microservice mar phàirt riatanach den t-siostam agus chan eil e ag adhbhrachadh na duilgheadasan gu h-àrd. Chan eil seo an-asgaidh cuideachd:

  • Tha feum air cunbhalachadh API airson eadar-obrachadh le loidsig gnìomhachais (gu sònraichte, gus gnìomhan luchd-cleachdaidh a thoirt seachad mar phàirt de phròiseasan gnìomhachais) agus seirbheisean àrd-ùrlar API; feumar aire nas faiceallach a thoirt do atharrachaidhean API, co-fhreagarrachd air adhart agus air ais;
  • feumar leabharlannan runtime a bharrachd a chuir ris gus dèanamh cinnteach gu bheil loidsig a’ ghnìomhachais ag obair mar phàirt de gach meanbh-sheirbheis mar sin, agus tha seo ag adhbhrachadh riatanasan ùra airson leithid de leabharlannan: aotromachd agus co-dhiù eisimeileachd tar-ghluasadach;
  • feumaidh luchd-leasachaidh loidsig gnìomhachais sùil a chumail air dreachan leabharlainn: mura deach microservice a thoirt gu crìch airson ùine mhòr, bidh e coltach gum bi dreach seann-fhasanta de na leabharlannan ann. Faodaidh seo a bhith na chnap-starra ris nach robh dùil a thaobh feart ùr a chur ris agus dh’ fhaodadh gum feumar seann loidsig gnìomhachais seirbheis mar sin a ghluasad gu dreachan ùra de na leabharlannan nam biodh atharrachaidhean neo-fhreagarrach eadar dreachan.

Amalachadh stoidhle BPM

Tha sreath de sheirbheisean àrd-ùrlair cuideachd an làthair ann an leithid de dh'ailtireachd, ach chan eil an ìre seo a-nis na inneal airson a bhith a 'cur an gnìomh loidsig gnìomhachais fearainn, ach a-mhàin an àrainneachd, a' toirt seachad gnìomhan "àrd-ùrlar" cuideachail. Tha feum air a leithid de chòmhdach chan ann a-mhàin airson a bhith a 'cumail suas cho aotrom' sa tha microservices fearainn, ach cuideachd gus riaghladh a mheadhanachadh.

Mar eisimpleir, bidh gnìomhan luchd-cleachdaidh ann am pròiseasan gnìomhachais a’ gineadh gnìomhan. Ach, nuair a bhios e ag obair le gnìomhan, feumaidh an neach-cleachdaidh gnìomhan fhaicinn bho gach raon air an liosta choitcheann, a tha a’ ciallachadh gum feum seirbheis àrd-ùrlar clàraidh gnìomh iomchaidh a bhith ann, air a ghlanadh le loidsig gnìomhachas fearainn. Tha e gu math duilich a bhith a’ cumail a-steach loidsig gnìomhachais sa cho-theacsa seo, agus is e co-rèiteachadh eile a tha seo den ailtireachd seo.

Amalachadh phròiseasan gnìomhachais tro shùilean leasaiche tagraidh

Mar a chaidh ainmeachadh gu h-àrd, feumaidh leasaiche an tagraidh a bhith air a thoirt a-mach à feartan teicnigeach agus innleadaireachd buileachadh eadar-obrachadh grunn thagraidhean gus a bhith comasach air cunntadh air cinneasachd leasachaidh math.

Feuchaidh sinn ri fuasgladh fhaighinn air duilgheadas amalachaidh caran duilich, a chaidh a chruthachadh gu sònraichte airson an artaigil. Is e gnìomh “geama” a bhios ann le trì tagraidhean, far am bi gach fear dhiubh a’ mìneachadh ainm fearainn: “app1”, “app2”, “app3”.

Taobh a-staigh gach tagradh, thèid pròiseasan gnìomhachais a chuir air bhog a thòisicheas “cluich ball” tron ​​​​bhus amalachaidh. Bidh teachdaireachdan leis an ainm "Ball" mar bhall.

Riaghailtean a 'gheama:

  • is e a’ chiad chluicheadair an neach-tòiseachaidh. Bidh e a 'toirt cuireadh do chluicheadairean eile chun gheama, a' tòiseachadh a 'gheama agus faodaidh e crìoch a chur air aig àm sam bith;
  • bidh cluicheadairean eile ag innse gu bheil iad a 'gabhail pàirt sa gheama, "faigh eòlas" air a chèile agus a' chiad chluicheadair;
  • às deidh dha am ball fhaighinn, taghaidh an cluicheadair cluicheadair eile a tha a’ gabhail pàirt agus bheir e am ball thuige. Tha àireamh iomlan nam pasan air an cunntadh;
  • tha “lùth” aig gach cluicheadair, a lùghdaicheas le gach pas ball leis a’ chluicheadair sin. Nuair a ruitheas an lùth a-mach, thèid an cluicheadair a chuir a-mach às a’ gheama, ag ainmeachadh gu bheil iad a’ leigeil dhiubh an dreuchd;
  • ma tha an cluicheadair air fhàgail leis fhèin, tha e sa bhad ag innse gu bheil e air falbh;
  • nuair a thèid na cluicheadairean uile a chuir às, bidh a’ chiad chluicheadair ag ainmeachadh deireadh a’ gheama. Ma dh'fhàg e an geama na bu tràithe, tha e fhathast ri leantainn a 'gheama gus a chrìochnachadh.

Gus an duilgheadas seo fhuasgladh, cleachdaidh mi an DSL againn airson pròiseasan gnìomhachais, a leigeas leat cunntas a thoirt air an loidsig ann an Kotlin gu teann, le co-dhiù clàr-goileadair.

Anns an tagradh app1, obraichidh pròiseas gnìomhachais a’ chiad chluicheadair (tha e cuideachd na neach-tòiseachaidh air a’ gheama):

clas tòiseachaidh cluicheadair

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

A bharrachd air a bhith a’ cur an gnìomh loidsig gnìomhachais, faodaidh an còd gu h-àrd modal nì de ​​phròiseas gnìomhachais a thoirt gu buil a dh’ fhaodar fhaicinn mar dhiagram. Chan eil sinn air an inneal-seallaidh a chuir an gnìomh fhathast, agus mar sin bha againn ri beagan ùine a chaitheamh a’ tarraing (an seo rinn mi beagan sìmpleachadh air a’ chomharra BPMN a thaobh cleachdadh gheataichean gus cunbhalachd an diagram leis a’ chòd gu h-àrd a leasachadh):

Amalachadh stoidhle BPM

Bidh app2 a’ toirt a-steach pròiseas gnìomhachais cluicheadair eile:

RandomPlayer clas

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

Diagram:

Amalachadh stoidhle BPM

Anns an tagradh app3, nì sinn an cluicheadair le giùlan beagan eadar-dhealaichte: an àite a bhith a’ taghadh an ath chluicheadair air thuaiream, bidh e ag obair a rèir an algairim robin cruinn:

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

Rud eile, chan eil giùlan a’ chluicheadair eadar-dhealaichte bhon fhear roimhe, agus mar sin chan eil an diagram ag atharrachadh.

A-nis feumaidh sinn deuchainn airson a h-uile càil a ruith. Cha toir mi ach còd na deuchainn fhèin, gus nach cuir mi dragh air an artaigil le boilerplate (gu dearbh, chleachd mi an àrainneachd deuchainn a chaidh a chruthachadh na bu thràithe gus deuchainn a dhèanamh air amalachadh phròiseasan gnìomhachais eile):

Gèam deuchainn()

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

Ruith an deuchainn, thoir sùil air an loga:

toradh tòcan

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

Faodar grunn cho-dhùnaidhean cudromach a tharraing bho seo uile:

  • ma tha na h-innealan riatanach rim faighinn, faodaidh luchd-leasachaidh tagradh eadar-obrachaidhean amalachaidh a chruthachadh eadar tagraidhean gun a bhith a’ briseadh air falbh bho loidsig gnìomhachais;
  • faodar iom-fhillteachd (iom-fhillteachd) gnìomh amalachaidh a dh’ fheumas comasan innleadaireachd fhalach am broinn an fhrèam ma tha e air a chuir sìos an toiseach ann an ailtireachd an fhrèam. Chan urrainnear duilgheadas na h-obrach (duilgheadas) a bhith falaichte, agus mar sin seallaidh am fuasgladh air obair dhoirbh sa chòd a rèir sin;
  • nuair a bhios tu a’ leasachadh loidsig amalachaidh, feumar suim a ghabhail aig a’ cheann thall cunbhalachd agus dìth loidhnealachd atharrachadh stàite a h-uile com-pàirtiche amalachaidh. Bheir seo oirnn an loidsig a dhèanamh iom-fhillte gus a dhèanamh neo-mhothachail don òrdugh anns am bi tachartasan taobh a-muigh a’ tachairt. Anns an eisimpleir againn, feumaidh an cluicheadair pàirt a ghabhail sa gheama às deidh dha ainmeachadh gu bheil e a-mach às a ’gheama: leanaidh cluicheadairean eile a’ toirt am ball thuige gus an ruig am fiosrachadh mun t-slighe a-mach agus bidh a h-uile com-pàirtiche air a phròiseasadh. Chan eil an loidsig seo a’ leantainn bho riaghailtean a’ gheama agus tha e na fhuasgladh co-rèiteachaidh taobh a-staigh frèam na h-ailtireachd taghte.

An ath rud, bruidhnidh sinn mu na diofar subtleties den fhuasgladh againn, co-rèiteachaidhean agus puingean eile.

A h-uile brath ann an aon ciudha

Bidh a h-uile tagradh amalaichte ag obair le aon bhus amalachaidh, a tha air a riochdachadh mar broker taobh a-muigh, aon BPMQueue airson teachdaireachdan agus aon chuspair BPTopic airson comharran (tachartasan). Tha a bhith a’ toirt a h-uile teachdaireachd tro aon ciudha ann fhèin na cho-rèiteachadh. Aig ìre loidsig gnìomhachais, faodaidh tu a-nis na h-uimhir de sheòrsan ùra de theachdaireachdan a thoirt a-steach agus a tha thu ag iarraidh gun a bhith a’ dèanamh atharrachaidhean air structar an t-siostaim. Is e sìmpleachadh mòr a tha seo, ach tha cuid de chunnartan ann, a bha, ann an co-theacsa ar gnìomhan àbhaisteach, a’ coimhead nach robh cho cudromach dhuinn.

Amalachadh stoidhle BPM

Ach, tha aon fho-bheachd an seo: bidh gach aplacaid a’ sìoladh teachdaireachdan “a” bhon ciudha aig an t-slighe a-steach, le ainm an àrainn aige. Cuideachd, faodar an àrainn a shònrachadh anns na comharran, ma dh'fheumas tu "raon" a 'chomharra a chuingealachadh gu aon iarrtas. Bu chòir seo leud-bann a’ bhus a mheudachadh, ach feumaidh loidsig a’ ghnìomhachais a-nis obrachadh le ainmean fearainn: èigneachail airson dèiligeadh ri teachdaireachdan, ion-mhiannaichte airson comharran.

A’ dèanamh cinnteach à earbsachd a’ bhus amalachaidh

Tha earbsa air a dhèanamh suas de ghrunn rudan:

  • Tha am broker teachdaireachd taghte na phàirt riatanach den ailtireachd agus na aon phuing fàilligeadh: feumaidh e a bhith fulangach gu leòr ri lochdan. Cha bu chòir dhut ach buileachadh le deuchainn ùine a chleachdadh le deagh thaic agus coimhearsnachd mhòr;
  • feumar dèanamh cinnteach gu bheil am broker teachdaireachd ri fhaighinn gu mòr, airson am feumar a sgaradh gu corporra bho na tagraidhean aonaichte (tha ruigsinneachd àrd de thagraidhean le loidsig gnìomhachais gnìomhaichte tòrr nas duilghe agus nas daoire a thoirt seachad);
  • tha e mar dhleastanas air a’ bhròcair geallaidhean lìbhrigidh “co-dhiù aon uair” a thoirt seachad. Tha seo na riatanas èigneachail airson obrachadh earbsach a’ bhus amalachaidh. Chan eil feum air barrantasan ìre “dìreach aon uair”: mar as trice chan eil pròiseasan gnìomhachais mothachail air faighinn a-rithist de theachdaireachdan no thachartasan, agus ann an gnìomhan sònraichte far a bheil seo cudromach, tha e nas fhasa sgrùdaidhean a bharrachd a chuir ri loidsig gnìomhachais na bhith an-còmhnaidh a ’cleachdadh an àite sin. barrantasan "daor" ";
  • feumaidh teachdaireachdan agus comharran a chuir a-steach a bhith an sàs ann an malairt cumanta le atharrachadh ann an staid pròiseasan gnìomhachais agus dàta fearainn. B’ e an roghainn a b’ fheàrr am pàtran a chleachdadh Bogsa a-mach malairt, ach bidh feum air clàr a bharrachd san stòr-dàta agus sealaidheachd. Ann an tagraidhean JEE, faodar seo a dhèanamh nas sìmplidhe le bhith a’ cleachdadh manaidsear JTA ionadail, ach feumaidh an ceangal ris a’ bhròcair taghte a bhith comasach air obrachadh ann am modh XA;
  • feumaidh luchd-làimhseachaidh teachdaireachdan is tachartasan a tha a’ tighinn a-steach obrachadh cuideachd leis a’ ghnothach gus staid a’ phròiseas gnìomhachais atharrachadh: ma thèid a leithid de ghnothach a thoirt air ais, feumar cuideachd cuidhteas na teachdaireachd a chuir dheth;
  • bu chòir teachdaireachdan nach b' urrainn a bhith air an lìbhrigeadh air sgàth mhearachdan a bhith air an stòradh ann an stòr air leth D.L.Q. (Ciutha Litir Marbh). Gus seo a dhèanamh, chruthaich sinn meanbh-sheirbheis àrd-ùrlair air leth a bhios a’ stòradh teachdaireachdan mar sin na stòradh, gan clàr-amais a rèir buadhan (airson cruinneachadh sgiobalta agus sgrùdadh), agus a’ nochdadh an API airson a choimhead, a chuir air ais chun t-seòladh ceann-uidhe, agus cuir às do theachdaireachdan. Faodaidh luchd-rianachd an t-siostaim obrachadh leis an t-seirbheis seo tron ​​eadar-aghaidh lìn aca;
  • ann an suidheachaidhean a ’bhròcair, feumaidh tu an àireamh de ath-chuiridhean lìbhrigidh agus dàil eadar lìbhrigeadh atharrachadh gus an coltas gum bi teachdaireachdan a’ faighinn a-steach don DLQ a lughdachadh (tha e cha mhòr do-dhèanta obrachadh a-mach na paramadairean as fheàrr, ach faodaidh tu obrachadh gu empirigeach agus an atharrachadh rè ùine. obrachadh);
  • bu chòir sùil leantainneach a chumail air stòr DLQ, agus bu chòir don t-siostam sgrùdaidh fios a chuir gu rianadairean an t-siostaim gus an urrainn dhaibh freagairt cho luath ‘s a ghabhas nuair a thig teachdaireachdan nach deach an lìbhrigeadh. Lùghdaichidh seo an “sòn milleadh” de fhàilligeadh no mearachd loidsig gnìomhachais;
  • feumaidh am bus amalachaidh a bhith neo-mhothachail a thaobh dìth thagraidhean sealach: feumaidh fo-sgrìobhaidhean cuspair a bhith seasmhach, agus feumaidh ainm àrainn an tagraidh a bhith gun samhail gus nach feuch cuideigin eile ris an teachdaireachd aige bhon ciudha a phròiseasadh nuair nach eil an tagradh ann.

Dèanamh cinnteach à sàbhailteachd snàithlean logic gnìomhachas

Faodaidh an aon eisimpleir de phròiseas gnìomhachais grunn theachdaireachdan agus thachartasan fhaighinn aig an aon àm, agus tòisichidh an làimhseachadh aig an aon àm. Aig an aon àm, airson leasaiche tagraidh, bu chòir a h-uile dad a bhith sìmplidh agus sàbhailte.

Bidh loidsig gnìomhachais pròiseas a ’giullachd gach tachartas taobh a-muigh a bheir buaidh air a’ phròiseas gnìomhachais seo leotha fhèin. Faodaidh na tachartasan seo a bhith:

  • cur air bhog eisimpleir de phròiseas gnìomhachais;
  • gnìomh neach-cleachdaidh co-cheangailte ri gnìomhachd taobh a-staigh pròiseas gnìomhachais;
  • faighinn teachdaireachd no comharra ris a bheil eisimpleir pròiseas gnìomhachais air a ghabhail a-steach;
  • crìoch a chur air an timer a chaidh a shuidheachadh leis an eisimpleir pròiseas gnìomhachais;
  • smachd a chumail air gnìomh tro API (me stad pròiseas).

Faodaidh gach tachartas mar seo suidheachadh pròiseas gnìomhachais atharrachadh: faodaidh cuid de ghnìomhachd tighinn gu crìch agus cuid eile tòiseachadh, faodaidh luachan thogalaichean leantainneach atharrachadh. Le bhith a’ dùnadh gnìomhachd sam bith dh’ fhaodadh gun tèid aon no barrachd de na gnìomhan a leanas a chur an gnìomh. Faodaidh an fheadhainn sin, an uair sin, stad a bhith a 'feitheamh airson tachartasan eile, no, mura h-eil feum aca air dàta a bharrachd, faodaidh iad crìoch a chur air an aon ghnothach. Mus dùin an gnothach, tha staid ùr a’ phròiseas gnìomhachais air a stòradh san stòr-dàta, far am fuirich e airson an ath thachartas a-muigh.

Tha dàta pròiseas gnìomhachais seasmhach air a stòradh ann an stòr-dàta dàimh na phuing sioncronaidh giollachd gu math goireasach nuair a bhios tu a’ cleachdadh SELECT FOR UPDATE. Ma chaidh aig aon ghnothach air suidheachadh a 'phròiseis gnìomhachais fhaighinn bhon bhonn gus atharrachadh, cha bhith e comasach do ghnothach sam bith eile an aon staid fhaighinn airson atharrachadh eile, agus an dèidh crìoch a chur air a' chiad ghnothach, is e an dàrna fear cinnteach gum faigh e an stàit a tha air atharrachadh mar-thà.

A’ cleachdadh glasan dubhach air taobh DBMS, bidh sinn a’ coileanadh nan riatanasan riatanach uile ACID, agus cuideachd an comas an tagradh a sgèileadh le loidsig gnìomhachais le bhith ag àrdachadh an àireamh de shuidheachaidhean ruith.

Ach, tha glasan eu-dòchasach a’ bagairt oirnn le glasan-stad, a tha a’ ciallachadh gum bu chòir SELECT FOR ÙRACHADH a bhith fhathast cuibhrichte gu ùine reusanta gun fhios nach bi glasan-stad ann air cuid de chùisean uamhasach ann an loidsig gnìomhachais.

Is e duilgheadas eile a th 'ann an sioncronadh toiseach a' phròiseas gnìomhachais. Ged nach eil eisimpleir de phròiseas gnìomhachais ann, chan eil stàit sam bith san stòr-dàta nas motha, agus mar sin chan obraich an dòigh a chaidh a mhìneachadh. Ma tha thu airson dèanamh cinnteach gu bheil pròiseas gnìomhachais sònraichte mar eisimpleir ann an raon sònraichte, feumaidh tu seòrsa de nì sioncronaidh co-cheangailte ris a’ chlas pròiseas agus an raon co-fhreagarrach. Gus an duilgheadas seo fhuasgladh, bidh sinn a’ cleachdadh inneal glasaidh eadar-dhealaichte a leigeas leinn glas a ghabhail air goireas neo-riaghailteach a tha air a shònrachadh le iuchair ann an cruth URI tro sheirbheis bhon taobh a-muigh.

Anns na h-eisimpleirean againn, tha dearbhadh ann am pròiseas gnìomhachais BeginPlayer

uniqueConstraint = UniqueConstraints.singleton

Mar sin, tha teachdaireachdan anns an log mu bhith a’ gabhail agus a’ leigeil ma sgaoil glas na h-iuchrach co-fhreagarrach. Chan eil teachdaireachdan mar sin ann airson pròiseasan gnìomhachais eile: chan eil cuingealachadh sònraichte air a shuidheachadh.

Duilgheadasan pròiseas gnìomhachais le staid leantainneach

Uaireannan bidh staid leantainneach chan ann a-mhàin a 'cuideachadh, ach cuideachd a' cur bacadh air leasachadh.
Bidh duilgheadasan a 'tòiseachadh nuair a dh'fheumas tu atharrachaidhean a dhèanamh air loidsig gnìomhachais agus / no modail pròiseas gnìomhachais. Chan eilear a’ faighinn a-mach gu bheil atharrachadh mar sin co-chosmhail ri seann staid nam pròiseasan gnìomhachais. Ma tha mòran shuidheachaidhean “beò” san stòr-dàta, faodaidh atharrachaidhean neo-fhreagarrach tòrr trioblaid adhbhrachadh, ris an do thachair sinn gu tric nuair a bha sinn a’ cleachdadh jBPM.

A rèir doimhneachd an atharrachaidh, faodaidh tu obrachadh ann an dà dhòigh:

  1. cruthaich seòrsa pròiseas gnìomhachais ùr gus nach dèan thu atharrachaidhean neo-fhreagarrach air an t-seann fhear, agus cleachd e an àite an t-seann fhear nuair a thòisicheas tu air suidheachaidhean ùra. Leanaidh seann shuidheachaidhean ag obair "an t-seann dòigh";
  2. imrich staid leantainneach phròiseasan gnìomhachais nuair a bhios tu ag ùrachadh loidsig gnìomhachais.

Tha a 'chiad dòigh nas sìmplidh, ach tha na crìochan agus na h-eas-bhuannachdan aige, mar eisimpleir:

  • dùblachadh loidsig gnìomhachais ann am mòran mhodalan pròiseas gnìomhachais, àrdachadh anns an àireamh de loidsig gnìomhachais;
  • gu tric feumar gluasad sa bhad gu loidsig gnìomhachais ùr (cha mhòr an-còmhnaidh a thaobh gnìomhan amalachaidh);
  • chan eil fios aig an leasaiche cuin a tha e comasach cuir às do mhodalan seann-fhasanta.

Ann an cleachdadh, bidh sinn a’ cleachdadh an dà dhòigh-obrach, ach tha sinn air grunn cho-dhùnaidhean a dhèanamh gus ar beatha a dhèanamh nas sìmplidhe:

  • anns an stòr-dàta, tha staid leantainneach a 'phròiseis gnìomhachais air a stòradh ann an cruth a tha furasta a leughadh agus a phròiseasadh gu furasta: ann an sreang cruth JSON. Leigidh seo leat imrich a dhèanamh taobh a-staigh an tagraidh agus a-muigh. Ann an cùisean fìor, faodaidh tu cuideachd a tweak le làmhan (gu sònraichte feumail ann an leasachadh rè debugging);
  • chan eil loidsig gnìomhachas amalachaidh a’ cleachdadh ainmean phròiseasan gnìomhachais, gus am bi e comasach aig àm sam bith fear ùr a chuir an àite buileachadh aon de na pròiseasan com-pàirteach, le ainm ùr (mar eisimpleir, “InitialPlayerV2”). Bidh an ceangal a 'tachairt tro ainmean teachdaireachdan agus comharran;
  • tha àireamh tionndaidh aig a 'mhodail pròiseas, a bhios sinn a' meudachadh ma nì sinn atharrachaidhean neo-fhreagarrach air a 'mhodail seo, agus tha an àireamh seo air a stòradh còmhla ri suidheachadh a' phròiseis;
  • tha staid leantainneach a’ phròiseis air a leughadh bhon bhonn an toiseach gu modal nì goireasach leis an obraich am modh imrich ma tha àireamh tionndaidh a’ mhodail air atharrachadh;
  • tha am modh imrich air a chuir ri taobh loidsig a’ ghnìomhachais agus canar “leisg” ris airson gach suidheachadh den phròiseas gnìomhachais aig àm a thoirt air ais bhon stòr-dàta;
  • ma dh’ fheumas tu suidheachadh a h-uile pròiseas imrich a dhèanamh gu sgiobalta agus gu sioncronach, thathas a ’cleachdadh fuasglaidhean imrich stòr-dàta nas clasaigeach, ach feumaidh tu obrachadh le JSON an sin.

A bheil feum agam air frèam eile airson pròiseasan gnìomhachais?

Leig na fuasglaidhean a tha air am mìneachadh san artaigil leinn ar beatha a dhèanamh nas sìmplidhe gu mòr, leudachadh a dhèanamh air an raon de chùisean a chaidh fhuasgladh aig ìre leasachadh tagraidh, agus am beachd a bhith a’ sgaradh loidsig gnìomhachais gu microservices nas tarraingiche. Airson seo, chaidh tòrr obrach a dhèanamh, chaidh frèam gu math “aotrom” airson pròiseasan gnìomhachais a chruthachadh, a bharrachd air pàirtean seirbheis airson fuasgladh fhaighinn air na duilgheadasan a chaidh ainmeachadh ann an co-theacsa raon farsaing de ghnìomhan gnìomhaichte. Tha miann againn na toraidhean sin a cho-roinn, gus leasachadh phàirtean cumanta a thoirt gu ruigsinneachd fosgailte fo chead an-asgaidh. Feumaidh seo beagan oidhirp agus ùine. Dh’ fhaodadh tuigse air an iarrtas airson fuasglaidhean mar seo a bhith na bhrosnachadh a bharrachd dhuinn. Anns an artaigil a thathar a 'moladh, chan eil mòran aire ga thoirt do chomasan an fhrèam fhèin, ach tha cuid dhiubh rim faicinn bho na h-eisimpleirean a tha air an taisbeanadh. Ma dh’fhoillsicheas sinn ar frèam-obrach ge-tà, thèid artaigil air leth a thoirt dha. Anns an eadar-ama, bidh sinn taingeil ma dh’ fhàgas tu beagan fios air ais le bhith a’ freagairt na ceiste:

Chan fhaod ach luchd-cleachdaidh clàraichte pàirt a ghabhail san sgrùdadh. Soidhnig a-steach, mas e do thoil e.

A bheil feum agam air frèam eile airson pròiseasan gnìomhachais?

  • 18,8%Tha, tha mi air a bhith a’ coimhead airson rudeigin mar seo airson ùine mhòr.

  • 12,5%tha e inntinneach barrachd ionnsachadh mu do bhuileachadh, is dòcha gum bi e feumail2

  • 6,2%bidh sinn a’ cleachdadh aon de na frèaman a th’ ann mar-thà, ach tha sinn a’ smaoineachadh air fear eile a chur na àite1

  • 18,8%bidh sinn a’ cleachdadh aon de na frèaman a th’ ann mar-thà, tha a h-uile dad a’ freagairt3

  • 18,8%dèiligeadh gun fhrèam3

  • 25,0%sgrìobh do chuid fhèin4

Bhòt 16 neach-cleachdaidh. Sheall 7 neach-cleachdaidh.

Source: www.habr.com

Cuir beachd ann