Ny orinasanay dia manam-pahaizana manokana amin'ny famolavolana vahaolana rindrambaiko kilasy ERP, ny anjara liona amin'izany dia fehezin'ny rafitra transactional miaraka amin'ny lojikan'ny raharaham-barotra sy ny fikorianan'ny antontan-taratasy a la EDMS. Ny dikan-teny amin'izao fotoana izao amin'ny vokatray dia mifototra amin'ny teknolojia JavaEE, fa izahay koa dia mazoto manao fanandramana amin'ny microservices. Ny iray amin'ireo faritra tena manahirana amin'ny vahaolana toy izany dia ny fampidirana ireo subsystem isan-karazany an'ny sehatra mifanila. Ny olana amin'ny fampifangaroana dia nahatonga antsika ho marary mafy foana, na inona na inona endrika ara-javakanto, teknolojia sy rafitra ampiasaintsika, saingy vao haingana dia nisy fandrosoana tamin'ny famahana olana toy izany.
Ao amin'ny lahatsoratra entiko ho an'ny sainao dia hiresaka momba ny traikefa sy fikarohana momba ny maritrano izay ananan'i NPO Krista ao amin'ny faritra voatondro aho. Hojerentsika ihany koa ny ohatra iray amin'ny vahaolana tsotra amin'ny olan'ny fampidirana avy amin'ny fomba fijerin'ny mpamorona fampiharana ary hahita izay miafina ao ambadik'io fahatsorana io.
Disclaimer
Ny vahaolana ara-javakanto sy ara-teknika voalaza ao amin'ny lahatsoratra dia natolotro mifototra amin'ny traikefa manokana amin'ny sehatry ny asa manokana. Ireo vahaolana ireo dia tsy milaza ho an'ny rehetra ary mety tsy ho tsara indrindra amin'ny fepetra fampiasana hafa.
Inona no ifandraisan'ny BPM amin'izany?
Mba hamaliana an'io fanontaniana io dia mila manadihady lalindalina kokoa amin'ny antsipiriany momba ny olana ampiharina amin'ny vahaolana ataontsika isika. Ny ampahany lehibe amin'ny lojikan'ny fandraharahana ao amin'ny rafitra transactional mahazatra antsika dia ny fampidirana angon-drakitra ao amin'ny angon-drakitra amin'ny alΓ lan'ny interface interfaces, ny fanamarinana manual sy automatique an'ity angon-drakitra ity, manatanteraka izany amin'ny alΓ lan'ny workflow sasany, mamoaka izany amin'ny rafitra hafa / angona angona / arisiva, mamorona tatitra. . Noho izany, ny asan'ny rafitra ho an'ny mpanjifa dia ny automatique ny fizotran'ny orinasa anatiny.
Ho fanamorana, mampiasa ny teny hoe "tahirin-kevitra" izahay amin'ny fifandraisana ho toy ny abstraction sasany amin'ny angon-drakitra mitambatra amin'ny lakile iraisana izay ahafahan'ny workflow iray "mifandray".
Ahoana anefa ny amin'ny lojika fampidirana? Rehefa dinihina tokoa, ny asa fampidirana dia novokarin'ny rafitra rafitra, izay "tapaka" ho ampahany TSY noho ny fangatahan'ny mpanjifa, fa eo ambany fitarihan'ny anton-javatra hafa tanteraka:
eo ambanin'ny lalΓ n'i Conway;
vokatry ny fampiasana indray ny subsystems efa novolavolaina ho an'ny vokatra hafa;
araka ny fanapahan-kevitry ny mpanao mari-trano, mifototra amin'ny fepetra tsy miasa.
Misy fakam-panahy lehibe hanasaraka ny lojika fampidirana amin'ny lojika fandraharahana amin'ny workflow lehibe, mba tsy handoto ny lojika raharaham-barotra miaraka amin'ny artifacts fampidirana ary hamonjy ny mpamorona fampiharana amin'ny filΓ na ny filΓ na ny endriky ny tontolon'ny maritrano amin'ny rafitra. Ity fomba fiasa ity dia manana tombony maromaro, saingy ny fampiharana dia mampiseho ny tsy fahombiazany:
ny famahana ny olana fampidirana matetika dia miverina amin'ny safidy tsotra indrindra amin'ny endrika antso synchronous noho ny teboka fanitarana voafetra amin'ny fampiharana ny workflow lehibe (ny fatiantoka amin'ny fampidirana synchronous dia resahina etsy ambany);
mbola miditra amin'ny lojikan'ny fandraharahana fototra ny artifacts fampidirana rehefa ilaina ny tamberina avy amin'ny subsystem hafa;
ny mpamorona fampiharana dia tsy miraharaha ny fampidirana ary afaka manapaka izany mora foana amin'ny fanovana ny workflow;
mitsahatra tsy ho iray manontolo intsony ny rafitra amin'ny fomba fijerin'ny mpampiasa, lasa miharihary ny "seams" eo anelanelan'ny subsystems, ary miseho ny fiasan'ny mpampiasa tafahoatra, manomboka ny famindrana angon-drakitra avy amin'ny subsystem iray mankany amin'ny iray hafa.
Ny fomba iray hafa dia ny fiheverana ny fifandraisana amin'ny fampidirana ho ampahany manan-danja amin'ny lojikan'ny orinasa fototra sy ny fizotran'ny asa. Mba hisorohana ny fahaizan'ny mpamorona fampiharana tsy hiakatra be, ny famoronana fifandraisana fampidirana vaovao dia tokony ho mora sy tsy misy ezaka, miaraka amin'ny fahafahana kely indrindra hisafidianana vahaolana. Sarotra kokoa ny manao izany noho ny toa azy: tsy maintsy matanjaka tsara ilay fitaovana mba hanomezana ny mpampiasa ireo safidy isan-karazany ilaina amin'ny fampiasana azy, nefa tsy mamela azy " hitifitra ny tenany amin'ny tongony". Betsaka ny fanontaniana tsy maintsy valian'ny injeniera amin'ny tontolon'ny asa fampidirana, saingy tsy tokony hosaintsainin'ny mpamorona fampiharana amin'ny asany andavanandro: fetran'ny fifanakalozana, tsy miovaova, atomika, fiarovana, fanamafisam-peo, fizarana enta-mavesatra sy loharanon-karena, fandalovana, famandrihana, fizarana sy fifandimbiasana contexts, sns. Ilaina ny manolotra modely vahaolana tsotra ho an'ny mpamorona fampiharana izay efa nafenina ny valin'ny fanontaniana rehetra. Ireo modely ireo dia tokony ho azo antoka tsara: miova matetika ny lojikan'ny orinasa, izay mampitombo ny mety hisian'ny fahadisoana, ny vidin'ny fahadisoana dia tsy maintsy mijanona amin'ny ambaratonga ambany.
Fa inona no idiran'ny BPM amin'izany? Misy safidy maro amin'ny fampiharana ny workflow...
Eny tokoa, fampiharana iray hafa amin'ny fizotran'ny fandraharahana no tena malaza amin'ny vahaolana ataontsika - amin'ny alΓ lan'ny famaritana ara-panambarana ny sarin'ny tetezamita sy ny fampifandraisana ireo mpitantana amin'ny lojikan'ny fandraharahana ho an'ny tetezamita. Amin'ity tranga ity, ny fanjakana izay mamaritra ny toerana misy ny "document" amin'izao fotoana izao amin'ny fizotran'ny raharaham-barotra dia toetran'ny "document" mihitsy.
Toy izao ny fomba fiasa amin'ny fanombohana tetikasa iray
Ny lazan'ity fampiharana ity dia noho ny fahatsorana sy ny hafainganam-pandehan'ny famoronana ny fizotran'ny raharaham-barotra. Na izany aza, satria mihasarotra hatrany ny rafitra rindrambaiko, mitombo sy mihasarotra ny ampahany mandeha ho azy amin'ny fizotran'ny fandraharahana. Ilaina ny fanimbana, ny fampiasana indray ny ampahany amin'ny dingana, ary koa ny fizotry ny sampana mba hampiarahana ny sampana tsirairay. Amin'ny toe-javatra toy izany, ny fitaovana dia manjary tsy mety, ary ny sarin'ny fiovan'ny fanjakana dia very ny votoatiny vaovao (tsy hita taratra amin'ny kisary mihitsy ny fifandraisana amin'ny fampidirana).
Toy izao ny fizotry ny dingana taorian'ny famerimberenan'ny fanazavΓ na fepetra maromaro.
Ny fivoahana amin'ity toe-javatra ity dia ny fampidirana ny motera jBPM amin'ny vokatra sasany miaraka amin'ny fizotry ny raharaham-barotra sarotra indrindra. Tao anatin'ny fotoana fohy dia nisy fahombiazana ity vahaolana ity: nanjary azo natao ny nampihatra ny fizotran'ny raharaham-barotra sarotra nefa nitazona diagrama misy fampahalalana sy mifandraika amin'ny fanamarihana. BPMN2.
Tao anatin'ny fotoana maharitra, ny vahaolana dia tsy mifanaraka amin'ny nantenaina: ny hamafin'ny asa avo lenta amin'ny famoronana fizotry ny fandraharahana amin'ny alΓ lan'ny fitaovana hita maso dia tsy namela ny fanatrarana ny mari-pamantarana vokatra azo ekena, ary ny fitaovana mihitsy no lasa iray amin'ireo tsy tia indrindra amin'ireo mpamorona. Nisy ihany koa ny fitarainana momba ny firafitry ny motera anatiny, izay nahatonga ny fisehonβny βpatchβ sy βcrustβ maro.
Ny lafiny tsara lehibe amin'ny fampiasana jBPM dia ny fahafantarana ny tombontsoa sy ny loza ateraky ny fananana toe-javatra maharitra ataon'ny orinasa iray. Hitanay ihany koa ny mety hampiasana fomba fiasa amin'ny fampiharana ireo protocole fampidirana be pitsiny eo amin'ny fampiharana samihafa amin'ny fampiasana fifandraisana asynchronous amin'ny alΓ lan'ny famantarana sy hafatra. Mitana anjara toerana lehibe aminβizany ny fisianβny fanjakana maharitra.
Araka ny voalaza etsy ambony dia afaka manatsoaka hevitra isika: Ny fomba fiasa amin'ny fomba BPM dia ahafahantsika mamaha ny asa maro isan-karazany mba hanamarihana ny fizotran'ny raharaham-barotra mihasarotra, mifanaraka tsara amin'ny hetsika fampidirana ao anatin'ireo dingana ireo ary mitazona ny fahafaha-mampiseho maso ny fizotran'ny fampiharana amin'ny fanamarihana mety.
Ny tsy fahampian'ny antso synchronous ho toy ny lamina fampidirana
Ny fampidirana synchronous dia manondro ny antso fanakanana tsotra indrindra. Ny subsystem iray dia miasa amin'ny lafiny mpizara ary mampiseho ny API amin'ny fomba ilaina. Ny subsystem iray hafa dia miasa toy ny lafiny mpanjifa ary amin'ny fotoana mety dia miantso ary miandry ny valiny. Miankina amin'ny rafitry ny rafitra, ny sisin'ny mpanjifa sy ny mpizara dia azo hita ao amin'ny fampiharana sy dingana mitovy, na amin'ny lafiny samihafa. Amin'ny tranga faharoa, mila mampihatra ny fampiharana RPC sasany ianao ary manome marshalling ny masontsivana sy ny vokatry ny antso.
Ity lamina fampidirana ity dia manana fatiantoka be dia be, saingy ampiasaina betsaka amin'ny fampiharana izany noho ny fahatsorany. Ny hafainganam-pandehan'ny fampiharana dia mambabo sy manery anao hampiasa azy io hatrany eo anatrehan'ny fe-potoana maika, mirakitra ny vahaolana ho trosa ara-teknika. Saingy mitranga ihany koa fa ireo mpamorona tsy manana traikefa dia mampiasa azy io amin'ny tsy fahatsiarovan-tena, tsy mahatsapa ny voka-dratsiny fotsiny.
Ho fanampin'ny fitomboana miharihary indrindra amin'ny fifandraisan'ny subsystem, dia misy ihany koa ny olana tsy dia mibaribary loatra amin'ny fifampiraharahana "mitombo" sy "manitatra". Eny tokoa, raha manao fiovana sasany ny lojikan'ny fandraharahana, dia tsy azo ialana ny fifampiraharahana, ary ny fifanakalozam-bola kosa dia manakana ny loharanon'ny fampiharana sasany voakasik'ireo fiovana ireo. Izany hoe, mandra-pahatongan'ny subsystem iray miandry valiny avy amin'ny iray hafa, dia tsy ho vitany ny hamita ny fifampiraharahana sy hanala ny hidin-trano. Izany dia mampitombo be ny mety hisian'ny vokatra isan-karazany:
Very ny fandraisan'ny rafitra, miandry ela ny mpampiasa ny valin'ny fanontaniana;
amin'ny ankapobeny dia mijanona tsy mamaly ny fangatahan'ny mpampiasa ny mpizara noho ny dobo filokana be loatra: ny ankamaroan'ny kofehy dia mihidy amin'ny loharanon'ny fifampiraharahana;
Manomboka miseho ny fiatoana: ny mety hitrangan'izy ireo dia miankina tanteraka amin'ny faharetan'ny fifampiraharahana, ny habetsaky ny lojikan'ny raharaham-barotra ary ny hidin-trano tafiditra amin'ny fifampiraharahana;
"Tsy nahomby" ny mpizara miaraka amin'ny OutOfMemory raha mitaky fanodinana sy fanovana angon-drakitra be dia be ny asa, ary ny fisian'ny fampidirana synchronous dia tena sarotra ny manasaraka ny fanodinana amin'ny fifanakalozana "maivana kokoa".
Avy amin'ny fomba fijery ara-javakanto, ny fampiasana fanakanana antso mandritra ny fampidirana dia mitarika amin'ny fahaverezan'ny fanaraha-maso ny kalitaon'ny subsystem tsirairay: tsy azo atao ny miantoka ny mari-pamantarana kalitao kendrena amin'ny subsystem iray mitokana amin'ny tondro kalitaon'ny subsystem hafa. Raha misy ekipa samihafa novolavolain'ny subsystems dia olana lehibe izany.
Vao mainka mahaliana kokoa ny zavatra raha toa ka ao anatin'ny rindranasa samy hafa ireo subsystems ampidirina ary mila manao fanovana mifanandrify amin'ny andaniny roa ianao. Ahoana no hiantohana ny fifampiraharahana amin'ireo fiovana ireo?
Raha misy fiovana atao amin'ny fifampiraharahana misaraka, dia mila manome antoka azo antoka ny fitantanana sy ny fanonerana, ary izany dia manafoana tanteraka ny tena tombony synchronous fampidirana - fahatsorana.
Tonga ao an-tsaina koa ny fifampiraharahana zaraina, saingy tsy ampiasainay amin'ny vahaolanay: sarotra ny miantoka ny fahatokisana.
"Saga" ho vahaolana amin'ny olan'ny varotra
Miaraka amin'ny fitomboan'ny lazan'ny microservices, ny fangatahana Saga Pattern.
Ity lamina ity dia mamaha tanteraka ireo olana voalaza etsy ambony momba ny fifampiraharahana lava, ary manitatra ny fahaiza-mitantana ny toetry ny rafitra amin'ny lafiny lojika momba ny fandraharahana: ny fanonerana aorian'ny fifampiraharahana tsy nahomby dia mety tsy hamerina ny rafitra amin'ny toerany voalohany, fa manome lalana hafa fanodinana angona. Izany koa dia ahafahanao misoroka ny famerenana ny dingana fanodinana angon-drakitra vita soa aman-tsara rehefa manandrana mitondra ny dingana ho amin'ny fiafarana "tsara".
Mahaliana fa amin'ny rafitra monolithic dia misy ifandraisany ihany koa ity lamina ity raha ny fampidirana ireo subsystems mifamatotra malalaka sy ny fiantraikany ratsy vokatry ny fifampiraharahana maharitra sy ny hidin'ny loharano mifanaraka amin'izany.
Mifandray amin'ny fizotran'ny raharaham-barotra amin'ny fomba BPM, dia hita fa tena mora ny mampihatra ny "Sagas": ny dingana tsirairay amin'ny "Saga" dia azo faritana ho hetsika ao anatin'ny fizotran'ny raharaham-barotra, ary ny toetry ny raharaham-barotra maharitra ihany koa. mamaritra ny toetry ny anatiny ny "Saga". Izany hoe tsy mila rafitra fandrindrana fanampiny izahay. Ny hany ilainao dia mpanakalo hafatra izay manohana ny antoka "farafaharatsiny indray mandeha" ho fitaterana.
Saingy ity vahaolana ity dia manana ny "vidiny" manokana:
mihasarotra ny lojikanβny fandraharahana: mila karakaraina ny tambin-karama;
ilaina ny miala amin'ny tsy fitoviana feno, izay mety ho saro-pady indrindra amin'ny rafitra monolithic;
Lasa sarotra kokoa ny maritrano, ary misy filΓ na fanampiny ho an'ny mpikirakira hafatra;
ilaina ny fitaovana fanaraha-maso sy fitantanana fanampiny (na dia tsara aza izany amin'ny ankapobeny: hitombo ny kalitaon'ny serivisy rafitra).
Ho an'ny rafitra monolithic, ny fanamarinana ny fampiasana "Sag" dia tsy dia mazava loatra. Ho an'ny microservices sy SOA hafa, izay azo inoana fa efa misy broker, ary ny tsy fitoviana feno dia atao sorona amin'ny fanombohan'ny tetikasa, ny tombony amin'ny fampiasana an'io lamina io dia mety hihoatra ny fatiantoka, indrindra raha misy API mety amin'ny lojika fandraharahana. ambaratonga.
Fampidirana ny lojika fandraharahana amin'ny microservices
Rehefa nanomboka nanandrana tamin'ny microservices izahay, dia nisy fanontaniana mitombina: aiza no hametrahana ny lojikan'ny fandraharahana sehatra mifandraika amin'ny serivisy izay miantoka ny faharetan'ny angon-drakitra?
Raha mijery ny rafitry ny BPMS isan-karazany dia toa mitombina ny manasaraka ny lojikan'ny fandraharahana amin'ny fikirizana: mamorona sarin'ny sehatra sy microservice tsy miankina amin'ny sehatra izay mamorona tontolo iainana sy fitoeran'ny fanatanterahana ny lojika fandraharahana sehatra, ary mamolavola ny faharetan'ny angon-drakitra ho toy ny sosona misaraka amin'ny microservices tena tsotra sy maivana. Ny fizotran'ny raharaham-barotra amin'ity tranga ity dia manao orkestra ny serivisy amin'ny sosona maharitra.
Ity fomba fiasa ity dia manana tombony lehibe: azonao atao ny mampitombo ny fiasan'ny sehatra araka izay tianao, ary ny soson'ny microservices mifanaraka amin'izany ihany no ho lasa "matavy" avy amin'izany. Ny fizotran'ny raharaham-barotra avy amin'ny sehatra rehetra dia afaka mampiasa avy hatrany ny fiasa vaovao amin'ny sehatra raha vao misy fanavaozana.
Ny fandinihana amin'ny antsipiriany kokoa dia nanambara ny tsy fahampiana lehibe amin'ity fomba ity:
serivisy sehatra iray izay manatanteraka ny lojikan'ny fandraharahana amin'ny sehatra maro indray mandeha dia mitondra risika lehibe ho toy ny teboka tokana tsy fahombiazana. Ny fiovana matetika amin'ny lojikan'ny fandraharahana dia mampitombo ny mety hisian'ny fahadisoana mitarika ho amin'ny tsy fahombiazan'ny rafitra;
olana momba ny fampandehanana: miasa miaraka amin'ny angona ao aminy ny lojikan'ny fandraharahana amin'ny alΓ lan'ny interface tery sy miadana:
ny angon-drakitra dia ho voasokajy sy paompy amin'ny alalan'ny tambajotra tambajotra;
matetika manome angon-drakitra bebe kokoa noho ny takina amin'ny lojikan'ny fandraharahana ny sampan-draharaha iray noho ny tsy fahampian'ny fahafaha-manatsara ny fangatahana amin'ny haavon'ny API ivelany an'ny serivisy;
ny lojika orinasa tsy miankina maromaro dia afaka mangataka imbetsaka ny angon-drakitra mitovy amin'ny fanodinana (io olana io dia azo ovaina amin'ny famenoana ireo singa session izay manangana angon-drakitra, saingy vao mainka manasarotra ny maritrano izany ary miteraka olana amin'ny maha-zava-dehibe ny data sy ny fanafoanana ny cache);
olana ara-barotra:
Ny fizotran'ny raharaham-barotra miaraka amin'ny fanjakana maharitra, izay voatahiry amin'ny serivisy sehatra, dia tsy mifanaraka amin'ny angon-drakitra momba ny sehatra, ary tsy misy fomba mora hamahana ity olana ity;
fametrahana ny angon-drakitra momba ny sehatra ivelan'ny fifampiraharahana: raha mila manova ny lojikan'ny fandraharahana sehatra rehefa avy nanamarina voalohany ny fahamarinan'ny angon-drakitra ankehitriny, dia ilaina ny manilika ny mety hisian'ny fiovan'ny fifaninanana amin'ny angona voahodina. Ny fanakanana angon-drakitra ivelany dia afaka manampy amin'ny famahana ny olana, fa ny vahaolana toy izany dia mitondra risika fanampiny ary mampihena ny fahatokisana amin'ny ankapobeny ny rafitra;
fahasahiranana fanampiny rehefa manavao: amin'ny toe-javatra sasany, ny serivisy maharitra sy ny lojika fandraharahana dia mila havaozina miaraka na amin'ny filaharana henjana.
Tamin'ny farany dia tsy maintsy niverina tany amin'ny fototra izahay: mamehy ny angon-drakitra momba ny sehatra sy ny lojikan'ny fandraharahana sehatra ho microservice iray. Ity fomba fiasa ity dia manamora ny fiheverana ny microservice ho singa manan-danja amin'ny rafitra ary tsy miteraka olana etsy ambony. Tsy omena maimaimpoana koa ity:
Ny fenitra API dia takiana amin'ny fifandraisana amin'ny lojika fandraharahana (indrindra indrindra, mba hanomezana ny asan'ny mpampiasa ho ampahany amin'ny fizotran'ny fandraharahana) sy ny serivisy amin'ny sehatra API; mitaky fitandremana tsara kokoa amin'ny fiovan'ny API, ny fifanarahana mandroso sy miverina;
ilaina ny manampy tranomboky fampandehanana fanampiny mba hiantohana ny fampandehanana ny lojikan'ny fandraharahana ho ampahany amin'ny microservice tsirairay, ary izany dia miteraka fepetra vaovao ho an'ny trano famakiam-boky toy izany: maivana ary kely indrindra ny fiankinan-doha transitive;
Mila manara-maso ny dikan-teny famakiam-boky ny mpamorona ny lojikan'ny fandraharahana: raha toa ka tsy vita hatry ny ela ny microservice, dia azo inoana fa hisy dikan-teny efa lany andro amin'ny tranomboky. Mety ho sakana tsy ampoizina amin'ny fampidirana endri-javatra vaovao izany ary mety mitaky ny fifindra-monina ny lojikan'ny fandraharahana taloha amin'ny serivisy toy izany ho any amin'ny kinova vaovaon'ny tranomboky raha misy fiovana tsy mifanaraka amin'ny dikan-teny.
Misy sosona serivisy amin'ny sehatra ihany koa amin'ny maritrano toy izany, saingy ity sosona ity dia tsy mamorona fitoeran'entana amin'ny fanatanterahana ny lojikan'ny fandraharahana sehatra, fa ny tontolo iainany ihany, manome asa "sehatra" fanampiny. Ny sosona toy izany dia ilaina tsy amin'ny fitazonana ny toetra maivana amin'ny sehatry ny microservices, fa koa amin'ny fitantanana foibe.
Ohatra, ny asan'ny mpampiasa amin'ny fizotran'ny raharaham-barotra dia miteraka asa. Na izany aza, rehefa miasa amin'ny asa, ny mpampiasa dia tsy maintsy mahita asa avy amin'ny sehatra rehetra ao amin'ny lisitra ankapobeny, izay midika fa tsy maintsy misy serivisy fisoratana anarana amin'ny sehatra mifandraika amin'izany, voafafa amin'ny lojika fandraharahana sehatra. Ny fikojakojana ny lojikan'ny fandraharahana amin'ny toe-javatra toy izany dia tena olana, ary ity dia marimaritra iraisana hafa amin'ity maritrano ity.
Fampidirana ny fizotran'ny fandraharahana amin'ny alalan'ny mason'ny mpamorona fampiharana
Araka ny voalaza etsy ambony, ny mpamorona fampiharana dia tsy maintsy esorina amin'ny endri-javatra ara-teknika sy injeniera amin'ny fampiharana ny fifaneraserana amin'ny rindranasa maromaro mba hahafahan'ny tsirairay miantehitra amin'ny vokatra fampandrosoana tsara.
Andeha isika hiezaka hamaha olana sarotra fampidirana, noforonina manokana ho an'ny lahatsoratra. Ity dia asa "lalao" misy fampiharana telo, izay mamaritra ny anaran'ny sehatra iray ny tsirairay amin'izy ireo: "app1", "app2", "app3".
Ao anatin'ny fampiharana tsirairay dia atomboka ny fizotran'ny raharaham-barotra izay manomboka "milalao baolina" amin'ny alΓ lan'ny fiara fitateram-bahoaka. Hafatra mitondra ny anarana hoe βBallβ dia ho toy ny baolina.
Fitsipika momba ny lalao:
ny mpilalao voalohany dia ny mpanentana. Manasa mpilalao hafa amin'ny lalao izy, manomboka ny lalao ary afaka mamarana izany amin'ny fotoana rehetra;
mpilalao hafa dia manambara ny fandraisany anjara amin'ny lalao, "mifankahalala" sy ny mpilalao voalohany;
rehefa avy nandray ny baolina ny mpilalao dia mifidy mpilalao iray hafa mandray anjara ary manome azy ny baolina. Ny fitambaran'ny isan'ny fampitana dia isaina;
Ny mpilalao tsirairay dia manana "angovo" izay mihena isaky ny mandalo ny baolina ataon'io mpilalao io. Rehefa lany ny angovo, dia miala amin'ny lalao ny mpilalao, manambara ny fialany;
raha avela irery ilay mpilalao dia manambara avy hatrany ny fialany;
Rehefa esorina ny mpilalao rehetra, ny mpilalao voalohany dia manambara fa tapitra ny lalao. Raha mandao ny lalao aloha izy dia mijanona ho manaraka ny lalao hamita izany.
Mba hamahana ity olana ity dia hampiasa ny DSL ho an'ny fizotry ny raharaham-barotra aho, izay ahafahantsika mamaritra ny lojika ao amin'ny Kotlin, miaraka amin'ny boilerplate kely indrindra.
Ny fizotran'ny raharaham-barotra amin'ny mpilalao voalohany (aka ilay mpanorina ny lalao) dia hiasa amin'ny fampiharana app1:
class InitialPlayer
import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.constraint.UniqueConstraints
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.dsl.taskOperation
import ru.krista.bpm.runtime.instance.MessageSendInstance
data class PlayerInfo(val name: String, val domain: String, val id: String)
class PlayersList : ArrayList<PlayerInfo>()
// ΠΡΠΎ ΠΊΠ»Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠ°: ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
class InitialPlayer : ProcessImpl<InitialPlayer>(initialPlayerModel) {
var playerName: String by persistent("Player1")
var energy: Int by persistent(30)
var players: PlayersList by persistent(PlayersList())
var shotCounter: Int = 0
}
// ΠΡΠΎ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°: ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²ΡΠ΅ΠΌΠΈ
// ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ°
val initialPlayerModel = processModel<InitialPlayer>(name = "InitialPlayer",
version = 1) {
// ΠΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ, ΠΏΠ΅ΡΠ²ΡΠΉ ΠΈΠ³ΡΠΎΠΊ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΎΡΠΎΠΌ ΠΈΠ³ΡΡ ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ
uniqueConstraint = UniqueConstraints.singleton
// ΠΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ, ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΡΡΠΎΠΈΡ Π±ΠΈΠ·Π½Π΅Ρ-ΠΏΡΠΎΡΠ΅ΡΡ
val sendNewGameSignal = signal<String>("NewGame")
val sendStopGameSignal = signal<String>("StopGame")
val startTask = humanTask("Start") {
taskOperation {
processCondition { players.size > 0 }
confirmation { "ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ»ΠΎΡΡ ${players.size} ΠΈΠ³ΡΠΎΠΊΠΎΠ². ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ?" }
}
}
val stopTask = humanTask("Stop") {
taskOperation {}
}
val waitPlayerJoin = signalWait<String>("PlayerJoin") { signal ->
players.add(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
println("... join player ${signal.data} ...")
}
val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
players.remove(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
println("... player ${signal.data} is out ...")
}
val sendPlayerOut = signal<String>("PlayerOut") {
signalData = { playerName }
}
val sendHandshake = messageSend<String>("Handshake") {
messageData = { playerName }
activation = {
receiverDomain = process.players.last().domain
receiverProcessInstanceId = process.players.last().id
}
}
val throwStartBall = messageSend<Int>("Ball") {
messageData = { 1 }
activation = { selectNextPlayer() }
}
val throwBall = messageSend<Int>("Ball") {
messageData = { shotCounter + 1 }
activation = { selectNextPlayer() }
onEntry { energy -= 1 }
}
val waitBall = messageWaitData<Int>("Ball") {
shotCounter = it
}
// Π’Π΅ΠΏΠ΅ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΡΠ΅ΠΌ Π³ΡΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈΠ· ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΡ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠ΅ΠΉ
startFrom(sendNewGameSignal)
.fork("mainFork") {
next(startTask)
next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
next(waitPlayerOut)
.branch("checkPlayers") {
ifTrue { players.isEmpty() }
.next(sendStopGameSignal)
.terminate()
ifElse().next(waitPlayerOut)
}
}
startTask.fork("afterStart") {
next(throwStartBall)
.branch("mainLoop") {
ifTrue { energy < 5 }.next(sendPlayerOut).next(waitBall)
ifElse().next(waitBall).next(throwBall).loop()
}
next(stopTask).next(sendStopGameSignal)
}
// ΠΠ°Π²Π΅ΡΠ°Π΅ΠΌ Π½Π° Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π΄Π»Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
sendNewGameSignal.onExit { println("Let's play!") }
sendStopGameSignal.onExit { println("Stop!") }
sendPlayerOut.onExit { println("$playerName: I'm out!") }
}
private fun MessageSendInstance<InitialPlayer, Int>.selectNextPlayer() {
val player = process.players.random()
receiverDomain = player.domain
receiverProcessInstanceId = player.id
println("Step ${process.shotCounter + 1}: " +
"${process.playerName} >>> ${player.name}")
}
Ho fanampin'ny fanatanterahana ny lojikan'ny fandraharahana, ity fehezan-dalΓ na etsy ambony ity dia afaka mamokatra modely zavatra momba ny fizotran'ny raharaham-barotra, izay azo jerena amin'ny endrika kisary. Mbola tsy nampihatra ny visualizer izahay, noho izany dia tsy maintsy nandany fotoana kely tamin'ny fanaovana sary (eto aho nanatsotra kely ny fanamarihana BPMN momba ny fampiasana vavahady hanatsarana ny firindran'ny kisary miaraka amin'ny kaody etsy ambany):
app2 dia hampiditra ny fizotran'ny raharaham-barotra ataon'ny mpilalao hafa:
kilasy RandomPlayer
import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance
data class PlayerInfo(val name: String, val domain: String, val id: String)
class PlayersList: ArrayList<PlayerInfo>()
class RandomPlayer : ProcessImpl<RandomPlayer>(randomPlayerModel) {
var playerName: String by input(persistent = true,
defaultValue = "RandomPlayer")
var energy: Int by input(persistent = true, defaultValue = 30)
var players: PlayersList by persistent(PlayersList())
var allPlayersOut: Boolean by persistent(false)
var shotCounter: Int = 0
val selfPlayer: PlayerInfo
get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}
val randomPlayerModel = processModel<RandomPlayer>(name = "RandomPlayer",
version = 1) {
val waitNewGameSignal = signalWait<String>("NewGame")
val waitStopGameSignal = signalWait<String>("StopGame")
val sendPlayerJoin = signal<String>("PlayerJoin") {
signalData = { playerName }
}
val sendPlayerOut = signal<String>("PlayerOut") {
signalData = { playerName }
}
val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
eventCondition = { signal ->
signal.sender.processInstanceId != process.id
&& !process.players.any { signal.sender.processInstanceId == it.id}
}
handler = { signal ->
players.add(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
}
}
val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
players.remove(PlayerInfo(
signal.data!!,
signal.sender.domain,
signal.sender.processInstanceId))
allPlayersOut = players.isEmpty()
}
val sendHandshake = messageSend<String>("Handshake") {
messageData = { playerName }
activation = {
receiverDomain = process.players.last().domain
receiverProcessInstanceId = process.players.last().id
}
}
val receiveHandshake = messageWait<String>("Handshake") { message ->
if (!players.any { message.sender.processInstanceId == it.id}) {
players.add(PlayerInfo(
message.data!!,
message.sender.domain,
message.sender.processInstanceId))
}
}
val throwBall = messageSend<Int>("Ball") {
messageData = { shotCounter + 1 }
activation = { selectNextPlayer() }
onEntry { energy -= 1 }
}
val waitBall = messageWaitData<Int>("Ball") {
shotCounter = it
}
startFrom(waitNewGameSignal)
.fork("mainFork") {
next(sendPlayerJoin)
.branch("mainLoop") {
ifTrue { energy < 5 || allPlayersOut }
.next(sendPlayerOut)
.next(waitBall)
ifElse()
.next(waitBall)
.next(throwBall)
.loop()
}
next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
next(waitPlayerOut).next(waitPlayerOut)
next(receiveHandshake).next(receiveHandshake)
next(waitStopGameSignal).terminate()
}
sendPlayerJoin.onExit { println("$playerName: I'm here!") }
sendPlayerOut.onExit { println("$playerName: I'm out!") }
}
private fun MessageSendInstance<RandomPlayer, Int>.selectNextPlayer() {
val player = if (process.players.isNotEmpty())
process.players.random()
else
process.selfPlayer
receiverDomain = player.domain
receiverProcessInstanceId = player.id
println("Step ${process.shotCounter + 1}: " +
"${process.playerName} >>> ${player.name}")
}
Kisary:
Amin'ny fampiharana app3 dia hanao mpilalao manana fihetsika hafa kely isika: fa tsy hifidy an-tsokosoko ny mpilalao manaraka, dia hanao zavatra araka ny algorithm round-robin izy:
kilasy 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}")
}
Raha tsy izany, ny fihetsiky ny mpilalao dia tsy mitovy amin'ny teo aloha, ka tsy miova ny kisary.
Amin'izao fotoana izao dia mila fitsapana isika hanatanterahana izany rehetra izany. Ny fehezan-dalΓ na momba ny fitsapana ihany no homeko, mba tsy hanakorontanana ny lahatsoratra amin'ny boilerplate (raha ny marina, nampiasa ny tontolon'ny fitsapana natao teo aloha aho mba hitsapana ny fampidirana ny fizotran'ny orinasa hafa):
miaraka amin'ny fitaovana ilaina, ny mpamorona fampiharana dia afaka mamorona fifandraisana fampidirana eo amin'ny fampiharana tsy manapaka ny lojika fandraharahana;
ny fahasarotan'ny asa fampidirana izay mitaky fahaiza-manao injeniera dia azo afenina ao anatin'ny rafitra raha toa ka tafiditra ao anatin'ny rafitry ny rafitra izany. Ny fahasarotan'ny olana dia tsy azo afenina, ka ny vahaolana amin'ny olana sarotra amin'ny code dia ho toy izany;
Rehefa mamolavola lojikan'ny fampidirana, dia ilaina ny mandinika ny tsy fitoviana amin'ny farany sy ny tsy fisian'ny linearizability ny fiovan'ny toetry ny mpandray anjara rehetra. Manery antsika hanasarotra ny lojika izany mba hahatonga azy ho tsy mahatsapa ny filaharan'ny fisehoan-javatra ivelany. Amin'ny ohatra asehontsika dia voatery mandray anjara amin'ny lalao ilay mpilalao rehefa avy nanambara ny fialany tamin'ny lalao: mbola hanohy hampita ny baolina aminy ny mpilalao hafa mandra-pahatongan'ny vaovao momba ny fivoahany ary hokarakarain'ny mpandray anjara rehetra. Ity lojika ity dia tsy manaraka ny fitsipiky ny lalao ary vahaolana marimaritra iraisana ao anatin'ny rafitry ny maritrano voafidy.
Manaraka, hiresaka momba ny saro-takarina isan-karazany amin'ny vahaolana ataontsika, marimaritra iraisana ary teboka hafa isika.
Ny hafatra rehetra dia ao anaty filaharana iray
Ny fampiharana mitambatra rehetra dia miasa miaraka amin'ny fiara fitateram-bahoaka iray, izay aseho amin'ny endrika broker ivelany, BPMQueue iray ho an'ny hafatra ary lohahevitra iray BPMTopic ho an'ny famantarana (hetsika). Ny fametrahana ny hafatra rehetra amin'ny filaharana iray dia marimaritra iraisana. Eo amin'ny sehatry ny lojikan'ny fandraharahana, afaka mampiditra karazana hafatra vaovao betsaka araka izay tianao ianao nefa tsy manova ny rafitry ny rafitra. Fanatsorana manan-danja izany, saingy misy risika sasany, izay toa tsy dia manan-danja loatra amintsika raha ny tontolon'ny asa mahazatra ataontsika.
Na izany aza, misy hafetsena iray eto: ny fampiharana tsirairay dia manivana ny hafatra "ny" avy amin'ny filaharana eo amin'ny fidirana, amin'ny anaran'ny sehatra misy azy. Ny sehatra dia azo faritana amin'ny famantarana ihany koa raha toa ka mila mametra ny "sehatra fahitana" ny famantarana ho an'ny fampiharana tokana. Tokony hampitombo ny fivezivezen'ny fiara fitateram-bahoaka izany, fa ny lojikan'ny fandraharahana dia tsy maintsy miasa amin'ny anaran'ny sehatra: ho an'ny fandefasana hafatra - tsy maintsy atao, ho an'ny famantarana - tiana.
Miantoka ny fahamendrehan'ny fiara fitateram-bahoaka
ilaina ny miantoka ny fisian'ny mpizara hafatra, izay tsy maintsy misaraka ara-batana amin'ny fampiharana mitambatra (ny fisian'ny fampiharana miaraka amin'ny lojika ara-barotra ampiharina dia sarotra kokoa sy lafo kokoa ny miantoka);
ny broker dia tsy maintsy manome antoka "farafaharatsiny indray mandeha". Izany dia fepetra tsy maintsy atao amin'ny fampandehanana azo itokisana ny fiara fitateram-bahoaka. Tsy ilaina ny fiantohana ambaratonga "indray mandeha": ny fizotran'ny raharaham-barotra, amin'ny ankapobeny, dia tsy mahatsapa ny fahatongavan'ireo hafatra na hetsika miverimberina, ary amin'ny asa manokana izay zava-dehibe dia mora kokoa ny manampy fanamarinana fanampiny amin'ny orinasa. lojika noho ny fampiasana tsy tapaka antoka βlafoβ ";
Ny fandefasana hafatra sy famantarana dia tsy maintsy tafiditra ao anatin'ny fifampiraharahana amin'ny ankapobeny miaraka amin'ny fiovan'ny toetry ny fizotran'ny fandraharahana sy ny angon-drakitra. Ny safidy tiana dia ny mampiasa lamina Transactional Outbox, fa hitaky latabatra fanampiny ao amin'ny angon-drakitra sy ny famerenana indray. Ao amin'ny fampiharana JEE dia azo tsotsotra izany amin'ny fampiasana mpitantana JTA eo an-toerana, fa ny fifandraisana amin'ny broker voafantina dia tsy maintsy afaka miasa XA;
Ny mpitantana ny hafatra sy ny hetsika ho avy dia tsy maintsy miara-miasa amin'ny fifampiraharahana izay manova ny toetry ny raharaham-barotra: raha toa ka mihemotra ny fifampiraharahana toy izany, dia tsy maintsy foanana ny fandraisana ny hafatra;
ny hafatra tsy azo naterina noho ny fahadisoana dia tsy maintsy tehirizina ao anaty fitahirizana mitokana D.L.Q. (Filaharana taratasy maty). Ho an'ity tanjona ity dia namorona tolotra mikrosehatra mitokana izahay izay mitahiry hafatra toy izany ao amin'ny fitehirizana azy, manindrona azy ireo araka ny toetrany (ho an'ny vondrona haingana sy mikaroka), ary mampiseho API hojerena, handefasana indray amin'ny adiresy alehana ary famafana hafatra. Afaka miara-miasa amin'ity serivisy ity ny mpitantana ny rafitra amin'ny alΓ lan'ny interface interface-ny;
Ao amin'ny sehatry ny broker dia mila manitsy ny isan'ny famerenana sy ny fahatarana eo amin'ny fanaterana ianao mba hampihenana ny mety hisian'ny hafatra ao amin'ny DLQ (saika tsy azo atao ny manao kajy ny mari-pamantarana tsara indrindra, fa afaka mihetsika ara-pihetseham-po ianao ary manitsy azy ireo mandritra ny fandidiana. );
Ny fivarotana DLQ dia tsy maintsy araha-maso tsy tapaka, ary ny rafitra fanaraha-maso dia tsy maintsy mampandre ny mpitantana ny rafitra mba hahafahan'izy ireo mamaly haingana araka izay tratra rehefa misy hafatra tsy voaray. Izany dia hampihena ny "faritra voakasika" amin'ny tsy fahombiazana na ny fahadisoana lojika orinasa;
ny fiara fitateram-piaraha-miasa dia tsy maintsy tsy mahatsapa ny tsy fisian'ny fangatahana vonjimaika: ny famandrihana amin'ny lohahevitra iray dia tsy maintsy maharitra, ary ny anaran'ny sehatra amin'ny fampiharana dia tsy maintsy miavaka ka raha tsy eo ny fampiharana, dia misy olon-kafa tsy manandrana manamboatra ny hafatra avy amin'ny filaharana.
Miantoka ny fiarovana ny kofehy amin'ny lojika fandraharahana
Ny ohatra iray amin'ny fizotran'ny raharaham-barotra dia afaka mandray hafatra sy hetsika maromaro indray mandeha, ny fanodinana azy dia hanomboka mifanandrify. Mandritra izany fotoana izany, ho an'ny mpamorona fampiharana, tokony ho tsotra sy azo antoka ny zava-drehetra.
Ny lojikan'ny fandraharahana amin'ny dingana iray dia manodina ny hetsika ivelany tsirairay izay misy fiantraikany amin'ny fizotry ny raharaham-barotra tsirairay. Ny hetsika toy izany dia mety ho:
fanombohana ohatra momba ny raharaham-barotra;
hetsika ataon'ny mpampiasa mifandraika amin'ny hetsika ao anatin'ny fizotry ny fandraharahana;
fandraisana hafatra na famantarana izay nisoratra anarana amin'ny raharaham-barotra;
famotehana fameram-potoana napetraky ny ohatra momba ny raharaham-barotra;
hetsika fanaraha-maso amin'ny alΓ lan'ny API (ohatra, fahatapahan'ny dingana).
Ny hetsika tsirairay toy izany dia afaka manova ny toetry ny fizotran'ny raharaham-barotra: mety hifarana ny hetsika sasany ary mety hanomboka ny hafa, ary mety hiova ny sandan'ny fananana maharitra. Ny fanakatonana ny hetsika rehetra dia mety hiteraka fampahavitrihana ny iray na maromaro amin'ireto hetsika manaraka ireto. Ireo kosa dia afaka mijanona miandry hetsika hafa na, raha tsy mila angon-drakitra fanampiny, dia afaka mamita amin'ny fifanakalozana mitovy. Alohan'ny hanakatona ny fifampiraharahana dia voatahiry ao anaty angon-drakitra ny toetry ny raharaham-barotra vaovao, izay hiandry ny fisehoan-javatra ivelany manaraka.
Ny angon-drakitra momba ny fizotry ny raharaham-barotra maharitra voatahiry ao anaty angon-drakitra relational dia teboka tena mety amin'ny fanodinana synchronize raha mampiasa SELECT FOR UPDATE ianao. Raha toa ka nahavita nahazo ny toetry ny fizotry ny raharaham-barotra avy amin'ny fototra hanovana azy ny fifampiraharahana iray, dia tsy misy fifampiraharahana hafa mifanitsy amin'izany dia afaka mahazo fanjakana mitovy amin'ny fiovana hafa, ary aorian'ny fahavitan'ny fifampiraharahana voalohany, ny faharoa dia azo antoka fa hahazo ny fanjakana efa niova.
Amin'ny fampiasana hidin-trano pessimista amin'ny lafiny DBMS, dia manatanteraka ny fepetra ilaina rehetra izahay asidra, ary mitazona ihany koa ny fahafahana manenjana ny fampiharana amin'ny lojika fandraharahana amin'ny alΓ lan'ny fampitomboana ny isan'ny tranga mandeha.
Na izany aza, ny hidin-trano pessimistika dia mandrahona antsika amin'ny fahatapahan-jiro, izay midika fa ny SELECT FOR UPDATE dia tokony ho voafetra amin'ny fe-potoana mety amin'ny fotoana mety hitranga amin'ny tranga tsy fahita firy amin'ny lojikan'ny orinasa.
Ny olana iray hafa dia ny fampifanarahana ny fanombohana ny fizotran'ny raharaham-barotra. Na dia tsy misy ohatra amin'ny fizotran'ny raharaham-barotra aza dia tsy misy fanjakana ao amin'ny angon-drakitra, noho izany dia tsy mandeha ny fomba voalaza. Raha mila miantoka ny maha-tokana ny fizotry ny raharaham-barotra amin'ny sehatra manokana ianao, dia mila karazana zavatra fampifanarahana mifandraika amin'ny kilasin'ny dingana sy ny sehatra mifandraika amin'izany. Mba hamahana ity olana ity dia mampiasa rafitra fanidiana hafa izahay izay mamela anay haka hidy amin'ny loharano tsy misy dikany voatondron'ny fanalahidy amin'ny endrika URI amin'ny alΓ lan'ny serivisy ivelany.
Ao amin'ny ohatra ataontsika, ny fizotran'ny raharaham-barotra InitialPlayer dia misy fanambarana
uniqueConstraint = UniqueConstraints.singleton
Noho izany, ny log dia misy hafatra momba ny fakana sy ny famoahana ny hidin'ny fanalahidy mifanaraka amin'izany. Tsy misy hafatra toy izany ho an'ny fizotran'ny raharaham-barotra hafa: uniqueConstraint tsy napetraka.
Indraindray ny fananana fanjakana maharitra dia tsy manampy fotsiny, fa tena manakana ny fampandrosoana.
Manomboka ny olana rehefa ilaina ny fanovana ny lojikan'ny fandraharahana sy/na ny maodely fizotry ny fandraharahana. Tsy ny fiovana rehetra toy izany no mifanaraka amin'ny toetry ny raharaham-barotra taloha. Raha misy tranga mivantana maro ao amin'ny angon-drakitra, dia mety hiteraka olana be ny fanovana tsy mifanaraka, izay matetika no sendra anay rehefa mampiasa jBPM.
mamorona karazana fizotry ny raharaham-barotra vaovao mba tsy hanao fanovana tsy mifanaraka amin'ny taloha, ary ampiasao izany fa tsy ny taloha rehefa manomboka tranga vaovao. Ny dika tranainy dia mbola hiasa "tahaka ny teo aloha";
mamindra ny toetry ny fizotry ny fandraharahana rehefa manavao ny lojikan'ny fandraharahana.
Ny fomba voalohany dia tsotra kokoa, saingy misy ny fetrany sy ny fatiantoka, ohatra:
fandikana ny lojika fandraharahana amin'ny maodely fizotry ny raharaham-barotra maro, mampitombo ny habetsaky ny lojika fandraharahana;
Matetika dia ilaina ny fifindrana avy hatrany amin'ny lojika fandraharahana vaovao (amin'ny resaka asa fampidirana - saika foana);
tsy fantatry ny mpamorona hoe amin'ny fotoana inona no azo esorina ireo modely efa lany andro.
Amin'ny fampiharana dia mampiasa fomba roa isika, saingy nandray fanapahan-kevitra maromaro mba hanamora ny fiainantsika:
Ao amin'ny angon-drakitra, ny toetry ny fizotry ny raharaham-barotra dia voatahiry amin'ny endrika mora vakiana sy mora karakaraina: amin'ny tady endrika JSON. Izany dia ahafahan'ny fifindra-monina atao ao anatin'ny fampiharana na ivelany. Amin'ny fomba farany, azonao atao ny manitsy azy io amin'ny tanana (indrindra fa ilaina amin'ny fampandrosoana mandritra ny debugging);
ny lojikan'ny fandraharahana fampidirana dia tsy mampiasa ny anaran'ny fizotry ny fandraharahana, ka amin'ny fotoana rehetra dia azo atao ny manolo ny fampiharana ny iray amin'ireo dingana mandray anjara amin'ny anarana vaovao (ohatra, "InitialPlayerV2"). Ny famatorana dia mitranga amin'ny alΓ lan'ny anarana hafatra sy famantarana;
ny maodelin'ny dingana dia manana laharan'ny dikan-teny, izay ampitomboinay raha manao fanovana tsy mifanaraka amin'ity maodely ity isika, ary io isa io dia voatahiry miaraka amin'ny toetry ny dingana;
ny toetry ny dingana maharitra dia vakiana avy amin'ny angon-drakitra voalohany ho modely zavatra mety, izay azon'ny fizotry ny fifindra-monina raha niova ny laharan'ny dikan-teny modely;
ny fomba fifindra-monina dia apetraka eo akaikin'ny lojika fandraharahana ary antsoina hoe "kamo" ho an'ny tranga tsirairay amin'ny fizotran'ny raharaham-barotra amin'ny fotoana namerenana azy avy amin'ny tahiry;
raha mila mifindra monina haingana sy mifanandrify amin'ny toetry ny dingana rehetra ianao, dia ampiasaina ny vahaolana momba ny fifindra-monina mahazatra mahazatra, saingy tsy maintsy miara-miasa amin'i JSON ianao.
Mila rafitra hafa ho an'ny fizotran'ny raharaham-barotra ve ianao?
Ny vahaolana voalaza ao amin'ny lahatsoratra dia namela anay hanatsotra ny fiainantsika, hanitatra ny isan'ny olana voavaha amin'ny ambaratonga fampandrosoana ny fampiharana, ary hahatonga ny hevitra hanasaraka ny lojika fandraharahana ho microservices. Mba hahatratrarana izany dia asa be dia be no natao, rafitra "maivana" tena "maivana" ho an'ny fizotran'ny raharaham-barotra, ary koa ny singa serivisy hamahana ireo olana fantatra amin'ny sehatry ny olana amin'ny fampiharana. Manana faniriana hizara ireo vokatra ireo izahay ary hanao ny fampivoarana ireo singa iraisana amin'ny alΓ lan'ny fahazoan-dΓ lana maimaim-poana. Mitaky ezaka sy fotoana kely izany. Ny fahatakarana ny fangatahana vahaolana toy izany dia mety ho fandrisihana fanampiny ho antsika. Ao amin'ny lahatsoratra natolotra, kely dia kely ny fiheverana ny fahaiza-manaon'ny rafitra, fa ny sasany amin'izy ireo dia hita amin'ny ohatra aseho. Raha mamoaka ny rafitray izahay dia lahatsoratra mitokana no hatokana ho azy. Mandra-pahatongan'izany, dia ho feno fankasitrahana izahay raha mamela hevitra kely ianao amin'ny famaliana ny fanontaniana: