BPM fomba fampidirana

BPM fomba fampidirana

Miarahaba, Habr!

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.

BPM fomba fampidirana
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).

BPM fomba 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.

BPM fomba fampidirana
Ampahany kely amin'ny fizotran'ny raharaham-barotra sarotra

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.

BPM fomba fampidirana

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;
  • misy hadisoana amin'ny fiafaran'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.

BPM fomba fampidirana

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.

BPM fomba fampidirana

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):

BPM fomba fampidirana

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:

BPM fomba fampidirana

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):

testGame()

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

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

Andao hanao ny fitsapana ary hijery ny log:

Output console

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

Avy amin'izany rehetra izany dia afaka manatsoaka hevitra manan-danja maromaro isika:

  • 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.

BPM fomba fampidirana

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

Ny fahamendrehana dia misy teboka maromaro:

  • Ny mpanelanelana hafatra voafantina dia singa manan-danja amin'ny maritrano ary teboka tokana tsy nahomby: tsy maintsy mahazaka fahadisoana izy io. Tokony hampiasa fampiharana efa voasedra ara-potoana fotsiny ianao, miaraka amin'ny fanohanana tsara sy fiaraha-monina lehibe;
  • 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.

Olana amin'ny fizotran'ny raharaham-barotra miaraka amin'ny fanjakana maharitra

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.

Miankina amin'ny halalin'ny fiovana, azonao atao amin'ny fomba roa:

  1. 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";
  2. 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:

Ireo mpampiasa voasoratra anarana ihany no afaka mandray anjara amin'ny fanadihadiana. HiditraPlease.

Mila rafitra hafa ho an'ny fizotran'ny raharaham-barotra ve ianao?

  • 18,8%Eny, efa ela aho no nitady zavatra toy izao

  • 12,5%Mahaliana ahy ny hianatra bebe kokoa momba ny fampiharanao, mety mahasoa2

  • 6,2%Mampiasa ny iray amin'ireo rafitra efa misy izahay, fa mieritreritra ny hanolo1

  • 18,8%Mampiasa ny iray amin'ireo rafitra efa misy izahay, tsara ny zava-drehetra3

  • 18,8%mitantana tsy misy rafitra3

  • 25,0%soraty ny anao4

Mpampiasa 16 no nifidy. Mpampiasa 7 no nifady.

Source: www.habr.com

Add a comment