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.
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).
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.
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.
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.
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.
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):
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:
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;
}
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.
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:
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";
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