Ho kopanya mokhoa oa BPM

Ho kopanya mokhoa oa BPM

Ho joang Habr!

Khamphani ea rona e ikakhetse ka setotsoana ho nts'etsopele ea litharollo tsa software ea sehlopha sa ERP, moo karolo ea tau e tšoaretsoeng ke litsamaiso tsa transaction tse nang le mohopolo o mongata oa khoebo le phallo ea mosebetsi la EDMS. Mefuta ea sejoale-joale ea lihlahisoa tsa rona e ipapisitse le mahlale a JavaEE, empa re ntse re leka ka matla ka li-microservices. E 'ngoe ea libaka tse thata ka ho fetisisa tsa tharollo e joalo ke ho kopanngoa ha litsamaiso tse fapaneng tse amanang le libaka tse haufi. Mesebetsi ea ho kopanya e 'nile ea re fa hlooho e bohloko haholo, ho sa tsotellehe mekhoa ea meralo, mekotla ea theknoloji le meralo eo re e sebelisang, empa haufinyane tjena ho bile le tsoelo-pele ea ho rarolla mathata a joalo.

Sehloohong se hlahisitsoeng tlhokomelong ea hau, ke tla bua ka phihlelo le lipatlisiso tsa meralo ea NPO Krista sebakeng se khethiloeng. Re tla boela re nahane ka mohlala oa tharollo e bonolo ea bothata ba ho kopanya ho tloha ponong ea moqapi oa kopo le ho fumana hore na ke eng e patehileng ka mor'a mokhoa ona o bonolo.

Boithorollo

Litharollo tsa meralo le tsa botekgeniki tse hlalositsoeng sehloohong sena li fanoa ke 'na ho latela boiphihlelo ba motho molemong oa mesebetsi e itseng. Litharollo tsena ha li ipolele hore li sebetsa hohle 'me li ka 'na tsa se ke tsa sebetsa hantle tlas'a maemo a mang a tšebeliso.

BPM e amana joang le eona?

Ho araba potso ena, re hloka ho hlahlobisisa ho se hokae ka mathata a sebelisitsoeng a tharollo ea rona. Karolo e ka sehloohong ea mohopolo oa khoebo tsamaisong ea rona e tloaelehileng ea transaction ke ho kenella ha data ho database ka li-interfaces tsa mosebelisi, netefatso ea matsoho le e ikemetseng ea data ena, ho e fetisa ka phallo e itseng ea ts'ebetso, ho e phatlalatsa ho sistimi e 'ngoe / polokelong ea litaba / polokelong, ho hlahisa litlaleho. Ka hona, mosebetsi oa bohlokoa oa tsamaiso bakeng sa bareki ke ho iketsetsa mekhoa ea bona ea khoebo ea ka hare.

Bakeng sa boiketlo, re sebelisa lentsoe "document" puisanong e le tlhaloso e itseng ea sete ea data, e kopantsoeng ke senotlolo se tloaelehileng, seo mosebetsi o itseng o ka "khomareloang ho sona".
Empa ho thoe'ng ka logic ea ho kopanya? Ntle le moo, mosebetsi oa ho kopanya o hlahisoa ke meralo ea sistimi, e "sahiloeng" ka likarolo HASE ka kopo ea moreki, empa ka tšusumetso ea lintlha tse fapaneng ka ho felletseng:

  • tlas'a tšusumetso ea molao oa Conway;
  • ka lebaka la ho sebelisoa hape ha litsamaiso tse nyane tse entsoeng pele bakeng sa lihlahisoa tse ling;
  • joalo ka ha ho entsoe qeto ke setsebi sa meralo, ho ipapisitsoe le litlhoko tse sa sebetseng.

Ho na le moleko o moholo oa ho arola mohopolo oa ho kopanya ho tsoa mohopolong oa khoebo oa ts'ebetso ea mantlha e le hore o se ke oa silafatsa mohopolo oa khoebo ka lintho tse kopaneng le ho boloka moqapi oa kopo hore a se ke a hlahlobisisa likarolo tse ikhethang tsa sebopeho sa meralo ea sistimi. Mokhoa ona o na le melemo e mengata, empa tloaelo e bontša ho se sebetse ha eona:

  • ho rarolla mathata a ho kopanya hangata ho thella ho ea likhethong tse bonolo ka ho fetisisa ka mokhoa oa li-call tsa synchronous ka lebaka la lintlha tse fokolang tsa katoloso ts'ebetsong ea ts'ebetso e kholo ea mosebetsi (ho feta ka mefokolo ea ho kopanya synchronous ka tlase);
  • li-artifacts tsa ho kopanya li ntse li kenella mohopolong oa mantlha oa khoebo ha ho hlokahala maikutlo a tsoang ho sistimi e 'ngoe;
  • moqapi oa kopo o hlokomoloha kopanyo 'me a ka e senya habonolo ka ho fetola mokhoa oa ho sebetsa;
  • tsamaiso e khaotsa ho ba e le 'ngoe kaofela ho tloha ponong ea mosebedisi, "seams" pakeng tsa subsystems e ba hlokomelehang, mesebetsi e sa hlokahaleng mosebedisi hlaha hore qalisa phetisetso ya data ho tloha subsystem e mong ho e mong.

Mokhoa o mong ke ho nka litšebelisano tsa ho kopanya e le karolo ea bohlokoa ea mohopolo oa mantlha oa khoebo le ts'ebetso ea mosebetsi. Ho boloka litlhoko tsa litsebo tsa bahlahisi ba ts'ebeliso hore li se ke tsa phahama, ho theha litšebelisano tse ncha tsa ho kopanya ho lokela ho ba bonolo le ho se sebetse, ka likhetho tse fokolang tsa ho khetha tharollo. Sena se thata ho feta kamoo se shebahalang kateng: sesebelisoa se tlameha ho ba le matla a lekaneng ho fa mosebedisi mefuta e sa tšoaneng e hlokahalang bakeng sa tšebeliso ea eona 'me ka nako e ts'oanang ba se ke ba itumella ho thunngoa leotong. Ho na le lipotso tse ngata tseo moenjiniere a lokelang ho li araba maemong a mesebetsi ea ho kopanya, empa tseo moqapi oa kopo a sa lokelang ho nahana ka tsona mosebetsing oa bona oa letsatsi le letsatsi: meeli ea transaction, consistency, atomity, ts'ireletso, scaling, load and resource distribution, routing, marshaling, ho phatlalatsoa le ho fetola maemo, joalo-joalo Hoa hlokahala ho fana ka bahlahisi ba lisebelisoa ka mokhoa o bonolo oa tharollo, moo likarabo tsa lipotso tse joalo li seng li ntse li patiloe. Mekhoa ena e lokela ho sireletseha ka ho lekaneng: mohopolo oa khoebo o fetoha hangata, o eketsang kotsi ea ho hlahisa liphoso, litšenyehelo tsa liphoso li lokela ho lula li le boemong bo tlaase.

Empa leha ho le joalo, BPM e amana joang le eona? Ho na le likhetho tse ngata tsa ho kenya ts'ebetso ea ts'ebetso ...
Ehlile, ts'ebetsong e 'ngoe ea lits'ebetso tsa khoebo e tumme haholo litharollong tsa rona - ka tlhophiso ea phatlalatso ea setšoantšo sa phetoho ea mmuso le ho hokahanya bahlokomeli le mohopolo oa khoebo ho fihlela liphetoho. Ka nako e ts'oanang, mmuso o khethollang boemo ba hajoale ba "tokomane" ts'ebetsong ea khoebo ke tšobotsi ea "tokomane" ka boeona.

Ho kopanya mokhoa oa BPM
Ke kamoo mokhoa ona o shebahalang kateng qalong ea morero

Ho tsebahala ha ts'ebetsong e joalo ho bakoa ke ho ba bonolo le ho potlaka ha ho theha mekhoa ea khoebo ea linear. Leha ho le joalo, ha litsamaiso tsa software li ntse li rarahana le ho feta, karolo e ikemetseng ea ts'ebetso ea khoebo e ntse e hola mme e ba thata haholoanyane. Ho na le tlhokahalo ea ho bola, ho sebelisoa hape ha likarolo tsa lits'ebetso, hammoho le mekhoa ea fereko e le hore lekala le leng le le leng le phethahatsoe ka ho tšoana. Tlas'a maemo a joalo, sesebelisoa se fetoha tšitiso, 'me setšoantšo sa phetoho ea naha se lahleheloa ke litaba tsa eona (litšebelisano tsa ho kopanya ha li bontšoe setšoantšong ho hang).

Ho kopanya mokhoa oa BPM
Sena ke seo mokhoa o shebahalang ka sona ka mor'a ho pheta-pheta makhetlo a 'maloa ho hlakisa litlhoko

Tsela ea ho tsoa boemong bona e ne e le ho kopanngoa ha enjene jBPM lihlahisoa tse ling tse nang le mekhoa e rarahaneng ea khoebo. Ka nako e khuts'oane, tharollo ena e bile le katleho e itseng: ho ile ha khoneha ho kenya ts'ebetsong mekhoa e rarahaneng ea khoebo ha ho ntse ho bolokoa setšoantšo se nang le tsebo le se morao-rao ho notation. BPMN2.

Ho kopanya mokhoa oa BPM
Karolo e nyane ea ts'ebetso e rarahaneng ea khoebo

Ka nako e telele, tharollo ha ea ka ea phethahatsa litebello: matla a phahameng a mosebetsi oa ho theha mekhoa ea khoebo ka lisebelisoa tse bonahalang ha aa ka a lumella ho finyella lipontšo tse amohelehang tsa tlhahiso, 'me sesebelisoa ka boeona e ile ea e-ba e' ngoe ea tse sa rateheng ka ho fetisisa har'a bahlahisi. Hape ho ne ho e-na le litletlebo mabapi le sebopeho sa ka hare sa enjene, e leng se ileng sa etsa hore ho be le "li-patches" le "lithupa" tse ngata.

Ntho e ka sehloohong e ntle ea ho sebelisa jBPM e ne e le ho lemoha melemo le likotsi tsa ho ba le boemo ba eona bo tsitsitseng bakeng sa mohlala oa ts'ebetso ea khoebo. Hape re bone monyetla oa ho sebelisa mokhoa oa ts'ebetso ho kenya ts'ebetsong liprothokholo tse rarahaneng tsa ho kopanya pakeng tsa lits'ebetso tse fapaneng ho sebelisa litšebelisano tsa asynchronous ka lipontšo le melaetsa. Boteng ba boemo bo phehellang bo phetha karolo ea bohlokoa ho sena.

Ho latela se ka holimo, re ka fihlela qeto: Mokhoa oa ts'ebetso ka setaele sa BPM o re lumella ho rarolla mesebetsi e mengata e fapaneng bakeng sa ho iketsetsa lits'ebetso tsa khoebo tse rarahanang le ho feta, ho hokahanya mesebetsi ea kopanyo lits'ebetsong tsena le ho boloka bokhoni ba ho bonts'a ts'ebetso e kentsoeng ts'ebetsong ka mokhoa o nepahetseng.

Melemo ea li-call tsa synchronous e le mokhoa oa ho kopanya

Khokahano ea Synchronous e bolela mohala o bonolo oa ho thibela. Subsystem e le 'ngoe e sebetsa joalo ka lehlakore la seva mme e pepesa API ka mokhoa o lakatsehang. Subsystem e 'ngoe e sebetsa e le lehlakore la bareki, ka nako e nepahetseng, e letsa ka tebello ea sephetho. Ho ipapisitsoe le meralo ea sistimi, likarolo tsa bareki le li-server li ka ts'oaroa ka ts'ebeliso le ts'ebetso e ts'oanang, kapa ka tse fapaneng. Boemong ba bobeli, o hloka ho kenya ts'ebetsong e itseng ea RPC le ho fana ka marshalling ea liparamente le sephetho sa mohala.

Ho kopanya mokhoa oa BPM

Mokhoa o joalo oa ho kopanya o na le litšitiso tse ngata haholo, empa o sebelisoa haholo ts'ebetsong ka lebaka la bonolo ba oona. Lebelo la ts'ebetsong le hohela 'me le etsa hore le e sebelise khafetsa maemong a "chesang" linako tse behiloeng, ho ngola tharollo ho likoloto tsa tekheniki. Empa ho boetse hoa etsahala hore baetsi ba se nang phihlelo ba e sebelise ba sa tsebe, ba sa hlokomele liphello tse mpe.

Ntle le keketseho e hlakileng ka ho fetesisa ea khokahanyo ea li-subsystems, ho na le mathata a sa totobalang ka litšebelisano tsa "ho hasana" le "ho otlolla". Ehlile, haeba mohopolo oa khoebo o etsa liphetoho, joale litšebelisano ke tsa bohlokoa, 'me litšebelisano le tsona li notlela lisebelisoa tse itseng tsa ts'ebeliso tse anngoeng ke liphetoho tsena. Ke hore, ho fihlela subsystem e le 'ngoe e emetse karabo ho tsoa ho e' ngoe, e ke ke ea khona ho phethela transaction le ho lokolla linotlolo. Sena se eketsa haholo kotsi ea litlamorao tse fapaneng:

  • karabelo ea sistimi e lahlehile, basebelisi ba emetse nako e telele bakeng sa likarabo tsa likopo;
  • Hangata seva se khaotsa ho arabela likōpo tsa basebelisi ka lebaka la letamo la likhoele tse khaphatsehang: likhoele tse ngata li "ema" holim'a senotlolo sa sesebelisoa se tšoaretsoeng ke transaction;
  • li-deadlocks li qala ho hlaha: monyetla oa ho etsahala ha bona o itšetlehile haholo ka nako ea litšebelisano, palo ea mohopolo oa khoebo le linotlolo tse amehang khoebong;
  • liphoso tsa pheliso ea nako ea transaction lia hlaha;
  • seva "e oela" ho OutOfMemory haeba mosebetsi o hloka ho sebetsa le ho fetola palo e kholo ea data, 'me ho ba teng ha li-synchronous integrations ho etsa hore ho be thata haholo ho arola ts'ebetso ho "lighter" transactions.

Ho latela pono ea meralo, ts'ebeliso ea li-call tse thibelang nakong ea ho kopanya e lebisa tahlehelong ea taolo ea boleng ba lits'ebetso tsa motho ka mong: ho ke ke ha khoneha ho fihlela sepheo sa boleng ba sistimi e le 'ngoe ka thoko ho matšoao a boleng bakeng sa sistimi e ngoe. Haeba li-subsystem li hlahisoa ke lihlopha tse fapaneng, sena ke bothata bo boholo.

Lintho li thahasellisa le ho feta haeba li-subsystems tse kopantsoeng li le lits'ebetsong tse fapaneng 'me liphetoho tsa synchronous li hloka ho etsoa mahlakoreng ka bobeli. Mokhoa oa ho etsa hore liphetoho tsee e be transaction?

Haeba liphetoho li etsoa litšebelisanong tse fapaneng, joale ho tla hlokahala hore ho fanoe ka ts'ebetso e ikhethang le matšeliso, 'me sena se felisa ka ho feletseng molemo o ka sehloohong oa ho kopanya ha synchronous - bonolo.

Litšebelisano tse ajoang le tsona li tla kelellong, empa ha re li sebelise litharollong tsa rona: ho thata ho netefatsa ho ts'epahala.

"Saga" e le tharollo bothateng ba litšebelisano

Ka botumo bo ntseng bo eketseha ba li-microservices, ho na le tlhoko e ntseng e eketseha ea Mohlala oa Saga.

Mokhoa ona o rarolla ka ho phethahetseng mathata a ka holimo a litšebelisano tse telele, hape o atolosa menyetla ea ho laola boemo ba tsamaiso ho tloha lehlakoreng la mohopolo oa khoebo: matšeliso ka mor'a ts'ebetso e sa atleheng e ka 'na ea se ke ea khutlisetsa tsamaiso ho boemo ba eona ba pele, empa e fana ka mokhoa o mong. tsela ea ho lokisa data. E boetse e u lumella hore u se ke ua pheta mehato ea ts'ebetso ea data e phethiloeng ka katleho ha u leka ho tlisa ts'ebetso ho fihlela qetellong "e ntle".

Hoa thahasellisa hore ho litsamaiso tsa monolithic, mokhoa ona o bohlokoa hape ha ho tluoa tabeng ea ho kopanngoa ha li-subsystems tse kopantsoeng ka mokhoa o hlephileng 'me ho na le liphello tse mpe tse bakoang ke litšebelisano tse telele le linotlolo tsa lisebelisoa tse lumellanang.

Mabapi le lits'ebetso tsa rona tsa khoebo ka mokhoa oa BPM, ho bonahala ho le bonolo haholo ho kenya tšebetsong Sagas: mehato ea motho ka mong ea Sagas e ka beoa e le mesebetsi ka har'a ts'ebetso ea khoebo, mme boemo bo tsitsitseng ba ts'ebetso ea khoebo bo khetha, lintho tse ling, boemo bo ka hare ba Sagas. Ke hore, ha re hloke mokhoa ofe kapa ofe oa ho hokahanya. Seo u se hlokang feela ke moreki oa molaetsa ea nang le ts'ehetso ea litiiso tsa "bonyane hang" joalo ka sepalangoang.

Empa tharollo e joalo e boetse e na le "theko" ea eona:

  • logic ea khoebo e fetoha e rarahaneng le ho feta: o hloka ho sebetsa matšeliso;
  • ho tla hlokahala ho lahla ho tsitsa ka botlalo, ho ka ba bonolo haholo bakeng sa litsamaiso tsa monolithic;
  • mohaho o fetoha o rarahaneng haholoanyane, ho na le tlhokahalo e eketsehileng ea mofani oa molaetsa;
  • lisebelisoa tse eketsehileng tsa ho beha leihlo le tsamaiso li tla hlokahala (le hoja ka kakaretso sena se le molemo le ho feta: boleng ba tšebeletso ea tsamaiso bo tla eketseha).

Bakeng sa litsamaiso tsa monolithic, tokafatso ea ho sebelisa "Sags" ha e totobala joalo. Bakeng sa li-microservices le li-SOA tse ling, moo, mohlomong, ho seng ho ntse ho e-na le broker, 'me ho ile ha etsoa sehlabelo ka ho feletseng qalong ea morero, melemo ea ho sebelisa mokhoa ona e ka feta mefokolo, haholo-holo haeba ho na le API e loketseng. boemo ba kelello ba khoebo.

Kenyelletso ea mohopolo oa khoebo ho li-microservices

Ha re qala ho etsa liteko ka li-microservices, ho ile ha hlaha potso e utloahalang: moo re ka behang mabaka a khoebo a marang-rang mabapi le tšebeletso e fanang ka phehello ea data ea domain?

Ha u sheba meralo ea BPMS e fapaneng, ho ka bonahala ho utloahala ho arola mohopolo oa khoebo le ho phehella: theha sethala sa sethala le li-microservices tse ikemetseng tse etsang tikoloho le setshelo bakeng sa ho phethahatsa logic ea khoebo ea domain, le ho hlophisa ts'ebetso ea data ea domain e le sebaka se arohaneng. sebaka sa li-microservices tse bonolo haholo le tse bobebe. Mekhoa ea khoebo tabeng ena e hlophisa litšebeletso tsa lera la ho phehella.

Ho kopanya mokhoa oa BPM

Mokhoa ona o na le phaello e kholo haholo: o ka eketsa ts'ebetso ea sethaleng ka hohle kamoo u ratang, 'me ke feela karolo e lumellanang ea li-microservices tsa sethaleng e tla "fumanoa" ho tloha ho sena. Mekhoa ea khoebo e tsoang sebakeng leha e le sefe hang-hang e fumana monyetla oa ho sebelisa ts'ebetso e ncha ea sethala hang ha e nchafatsoa.

Phuputso e qaqileng haholoanyane e bontšitse mefokolo e kholo ea mokhoa ona:

  • tšebeletso ea sethaleng e phethahatsang logic ea khoebo ea libaka tse ngata ka nako e le 'ngoe e na le likotsi tse kholo e le ntlha e le' ngoe ea ho hlōleha. Liphetoho tse etsahalang khafetsa mohopolong oa khoebo li eketsa kotsi ea likokoana-hloko tse lebisang ho hloleheng ha sistimi ka bophara;
  • litaba tsa ts'ebetso: logic ea khoebo e sebetsa le data ea eona ka sebopeho se patisaneng le se liehang:
    • data e tla boela e hlophisoe ebe e pompeloa ka har'a stack ea marang-rang;
    • ts'ebeletso ea sebaka sa marang-rang hangata e tla khutlisa data e ngata ho feta eo mohopolo oa khoebo o e hlokang bakeng sa ts'ebetso, ka lebaka la bokhoni bo sa lekaneng ba ho etsa parameterization boemong ba API ea kantle ea ts'ebeletso;
    • likarolo tse 'maloa tse ikemetseng tsa mohopolo oa khoebo li ka kopa data e tšoanang khafetsa bakeng sa ts'ebetso (o ka fokotsa bothata bona ka ho eketsa linaoa tsa "cache data", empa sena se thatafatsa meralo le ho baka mathata a bocha ba data le ho se sebetse ha cache);
  • litaba tsa transaction:
    • mekhoa ea khoebo e nang le boemo bo tsitsitseng bo bolokiloeng ke tšebeletso ea sethala ha e lumellane le data ea domain, 'me ha ho na litsela tse bonolo tsa ho rarolla bothata bona;
    • ho tsamaisa senotlolo sa data ea marang-rang ho tsoa ts'ebetsong: haeba logic ea khoebo ea domain e hloka ho etsa liphetoho, ka mor'a ho qala ho hlahloba ho nepahala ha data ea sebele, hoa hlokahala ho kenyelletsa monyetla oa phetoho ea tlhōlisano ho data e sebetsitsoeng. Ho thibela ka ntle ho data ho ka thusa ho rarolla bothata, empa tharollo e joalo e na le likotsi tse eketsehileng 'me e fokotsa ho tšepahala ka kakaretso ea tsamaiso;
  • mathata a eketsehileng ha o nchafatsa: maemong a mang, o hloka ho nchafatsa ts'ebeletso ea phehello le mohopolo oa khoebo ka tatellano kapa ka tatellano e tiileng.

Qetellong, ke ile ka tlameha ho khutlela metheong ea mantlha: ho kenyelletsa data ea domain le logic ea khoebo ea domain ho microservice e le 'ngoe. Mokhoa ona o nolofatsa maikutlo a microservice e le karolo ea bohlokoa tsamaisong mme ha o fane ka mathata a ka holimo. Sena le sona ha se mahala:

  • Tekanyetso ea API ea hlokahala bakeng sa ho sebelisana le mohopolo oa khoebo (haholo-holo, ho fana ka mesebetsi ea basebelisi e le karolo ea lits'ebetso tsa khoebo) le lits'ebeletso tsa sethala sa API; maikutlo a hlokolosi haholoanyane ho liphetoho tsa API, ho lumellana ho ea pele le ka morao hoa hlokahala;
  • hoa hlokahala ho eketsa lilaebrari tsa nako ea ho sebetsa ho netefatsa ts'ebetso ea logic ea khoebo e le karolo ea e 'ngoe le e' ngoe ea litšebeletso tse joalo tse nyenyane, 'me sena se hlahisa litlhoko tse ncha bakeng sa lilaebrari tse joalo: bobebe le bonyane ba ho itšetleha ka nako e telele;
  • Baetsi ba logic ea khoebo ba hloka ho boloka tlaleho ea mefuta ea laeborari: haeba microservice ha e so phetheloe nako e telele, e kanna ea ba le mofuta oa khale oa lilaeborari. Sena e ka ba tšitiso e sa lebelloang ea ho kenya tšobotsi e ncha 'me e ka hloka hore mohopolo oa khale oa khoebo oa ts'ebeletso e joalo o fallisetsoe liphetolelong tse ncha tsa lilaebrari haeba ho bile le liphetoho tse sa lumellaneng lipakeng tsa liphetolelo.

Ho kopanya mokhoa oa BPM

Lera la litšebeletso tsa sethala le lona le teng mohahong o joalo, empa lera lena ha le sa etsa setshelo bakeng sa ho phethahatsa logic ea khoebo ea domain, empa ke tikoloho ea eona feela, e fanang ka mesebetsi e thusang ea "platform". Lera le joalo ha le hlokehe feela ho boloka bobebe ba li-microservices tsa domain, empa hape le ho etsa hore taolo e be bohareng.

Mohlala, mesebetsi ea basebelisi lits'ebetsong tsa khoebo e hlahisa mesebetsi. Leha ho le joalo, ha o sebetsa ka mesebetsi, mosebedisi o tlameha ho bona mesebetsi ho tsoa libakeng tsohle lethathamong le akaretsang, e leng se bolelang hore ho tlameha ho ba le tšebeletso ea sethaleng e nepahetseng ea ho ngolisa mosebetsi, e hlakotsoe ho logic ea khoebo ea domain. Ho boloka mohopolo oa khoebo maemong ana ho thata haholo, 'me ena ke tšitiso e' ngoe ea moaho ona.

Ho kopanya mekhoa ea khoebo ka mahlo a moqapi oa kopo

Joalokaha ho se ho boletsoe ka holimo, moqapi oa kopo o tlameha ho tlosoa likarolong tsa tekheniki le tsa boenjiniere tsa ts'ebetsong ea ho sebelisana ha likopo tse 'maloa e le hore a tsebe ho itšetleha ka tlhahiso e ntle ea tsoelo-pele.

Ha re leke ho rarolla bothata bo thata ba ho kopanya, bo qapiloe ka ho khetheha bakeng sa sengoloa. Ona e tla ba mosebetsi oa "papali" o kenyelletsang lits'ebetso tse tharo, moo e 'ngoe le e' ngoe ea tsona e hlalosang lebitso la domain: "app1", "app2", "app3".

Ka hare ho kopo e 'ngoe le e' ngoe, mekhoa ea khoebo e qala ho "bapala bolo" ka bese ea ho kopanya. Melaetsa e bitsoang "Ball" e tla sebetsa joalo ka bolo.

Melao ea papali:

  • sebapadi sa pele ke motho ya qalang. O memela libapali tse ling papaling, o qala papali mme a ka e felisa neng kapa neng;
  • libapali tse ling li phatlalatsa ho nka karolo ha tsona papaling, "tloaelana" le sebapali sa pele;
  • ka mor'a ho amohela bolo, sebapali se khetha sebapali se seng se nkang karolo ebe se mo fetisetsa bolo. Palo eohle ea lipallo e baloa;
  • Sebapali se seng le se seng se na le "matla", a fokotsehang ha sebapali se seng le se seng se feta sa bolo. Ha matla a fela, sebapali se tlosoa papaling, se phatlalatsa ho tlohela mosebetsi;
  • haeba sebapali se siiloe se le seng, hang-hang o phatlalatsa ho tloha ha hae;
  • ha libapali tsohle li felisitsoe, sebapali sa pele se phatlalatsa pheletso ea papali. Haeba a tlohetse papali pejana, joale e sala ho latela papali e le hore a e phethe.

Ho rarolla bothata bona, ke tla sebelisa DSL ea rona bakeng sa mekhoa ea khoebo, e leng se u lumellang hore u hlalose logic ea Kotlin ka compactly, ka bonyane ba boilerplate.

Ts'ebetsong ea app1, ts'ebetso ea khoebo ea sebapali sa pele (hape ke mothehi oa papali) e tla sebetsa:

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

Ntle le ho phethahatsa logic ea khoebo, khoutu e ka holimo e ka hlahisa mohlala oa ntho ea mokhoa oa khoebo o ka bonoang e le setšoantšo. Ha re so kenye ts'ebetsong ea pono, kahoo re ile ra tlameha ho qeta nako e itseng re taka (mona ke nolofalitse molaetsa oa BPMN mabapi le tšebeliso ea liheke ho ntlafatsa ho lumellana ha setšoantšo ka khoutu e ka holimo):

Ho kopanya mokhoa oa BPM

app2 e tla kenyelletsa ts'ebetso ea khoebo ea sebapali se seng:

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

Setšoantšo:

Ho kopanya mokhoa oa BPM

Ts'ebelisong ea app3, re tla etsa hore sebapali se be le boits'oaro bo fapaneng hanyane: sebakeng sa ho khetha sebapali se latelang, se tla etsa ho latela algorithm ea round-robin:

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

Ho seng joalo, boitšoaro ba sebapali ha bo fapane le bo fetileng, kahoo setšoantšo ha se fetohe.

Joale re hloka tlhahlobo ho e tsamaisa kaofela. Ke tla fana ka khoutu feela ea tlhahlobo ka boeona, e le hore ke se ke ka kopanya sehlooho ka boilerplate (ha e le hantle, ke sebelisitse tikoloho ea teko e entsoeng pejana ho leka ho kopanya mekhoa e meng ea khoebo):

tekoGame()

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

Etsa tlhahlobo, sheba logi:

tlhahiso ea 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!

Liqeto tse 'maloa tsa bohlokoa li ka etsoa ho tsoa ho sena sohle:

  • haeba lisebelisoa tse hlokahalang li le teng, baetsi ba kopo ba ka etsa litšebelisano tsa ho kopanya pakeng tsa lits'ebetso ntle le ho arohana le mohopolo oa khoebo;
  • ho rarahana (ho rarahana) ha mosebetsi oa ho kopanya o hlokang litsebo tsa boenjiniere ho ka patoa ka hare ho moralo haeba qalong o behiloe mohahong oa moralo. Bothata ba mosebetsi (bothata) bo ke ke ba patoa, kahoo tharollo ea mosebetsi o boima ka khoutu e tla shebahala hantle;
  • ha ho ntse ho etsoa logic ea ho kopanya, hoa hlokahala ho ela hloko qetellong ho lumellana le ho haella ha linearizability ea phetoho ea boemo ba barupeluoa bohle ba kopanyo. Sena se re qobella ho thatafatsa mohopolo e le ho etsa hore e se ke ea ameha ho latela tatellano eo liketsahalo tsa kantle li etsahalang ka eona. Mohlala oa rona, sebapali se qobelloa ho nka karolo papaling ka mor'a hore a phatlalatse ho tsoa ha hae papaling: libapali tse ling li tla tsoelapele ho mo fetisetsa bolo ho fihlela tlhahisoleseling mabapi le ho tsoa ha hae e fihla mme e sebetsoa ke barupeluoa bohle. Monahano ona ha o latele melao ea papali mme ke tharollo ea ho sekisetsa ka har'a moralo oa moaho o khethiloeng.

Ka mor'a moo, a re ke re bue ka tse fapa-fapaneng tse poteletseng tsa tharollo ea rona, ho sekisetsa le lintlha tse ling.

Melaetsa eohle moleng o le mong

Lisebelisoa tsohle tse kopantsoeng li sebetsa ka bese e le 'ngoe ea ho kopanya, e emeloang e le broker ea ka ntle, BPMQueue e le' ngoe bakeng sa melaetsa le sehlooho se le seng sa BPMTopic bakeng sa lipontšo (liketsahalo). Ho fetisa melaetsa eohle moleng o le mong ka bohona ke ho sekisetsa. Boemong ba logic ea khoebo, joale u ka hlahisa mefuta e mengata e mecha ea melaetsa kamoo u batlang ntle le ho etsa liphetoho ho sebopeho sa sistimi. Ena ke nolofatso e kholo, empa e na le likotsi tse itseng, tseo, maemong a mesebetsi ea rona e tloaelehileng, ho rona ho neng ho bonahala e se bohlokoa hakaalo.

Ho kopanya mokhoa oa BPM

Leha ho le joalo, ho na le bolotsana bo le bong mona: sesebelisoa se seng le se seng se sefa melaetsa ea "ona" ho tloha moleng o monyako, ka lebitso la sebaka sa eona. Hape, sebaka sa marang-rang se ka hlalosoa ka matšoao, haeba u hloka ho fokotsa "sebaka" sa pontšo ho kopo e le 'ngoe. Sena se lokela ho eketsa bandwidth ea bese, empa mohopolo oa khoebo o tlameha ho sebetsa hona joale ka mabitso a marang-rang: e tlamang bakeng sa ho araba melaetsa, e lakatsehang bakeng sa matšoao.

Ho netefatsa ho ts'epahala ha bese ea ho kopanya

Ho tšepahala ho entsoe ka lintho tse 'maloa:

  • Morekisi ea khethiloeng oa melaetsa ke karolo ea bohlokoa ea meralo le ntlha e le 'ngoe ea ho hloleha: e tlameha ho mamella liphoso ka ho lekaneng. U lokela ho sebelisa ts'ebetsong e lekiloeng ka nako feela ka tšehetso e ntle le sechaba se seholo;
  • hoa hlokahala ho netefatsa ho fumaneha ho phahameng ha melaetsa ea melaetsa, eo e tlamehang ho aroloa ka 'mele ho likopo tse kopantsoeng (ho fumaneha ho phahameng ha likopo tse nang le logic ea khoebo e sebelisitsoeng ho thata haholo ebile ho theko e boima ho fana ka eona);
  • morekisi o tlamehile ho fana ka litiisetso tsa "bonyane hang" tsa thomello. Ena ke tlhokahalo e tlamang bakeng sa ts'ebetso e tšepahalang ea bese ea ho kopanya. Ha ho na tlhoko ea litiiso tsa boemo ba "hantle hanngoe": hangata lits'ebetso tsa khoebo ha li tsotelle ho fumana melaetsa kapa liketsahalo khafetsa, mme mesebetsing e ikhethileng moo sena se leng bohlokoa, ho bonolo ho eketsa licheke tse eketsehileng ho logic ea khoebo ho feta ho li sebelisa khafetsa. litiisetso "tse theko e boima" ";
  • ho romela melaetsa le lipontšo ho tlameha ho ameha ts'ebetsong e tloaelehileng le phetoho ea boemo ba mekhoa ea khoebo le data ea domain. Khetho e khethiloeng e tla ba ho sebelisa mohlala Transaction Outbox, empa e tla hloka tafole e eketsehileng ho database le relay. Lits'ebetsong tsa JEE, sena se ka nolofatsoa ka ho sebelisa mookameli oa JTA oa lehae, empa khokahano ho morekisi ea khethiloeng e tlameha ho sebetsa ka mokhoa o ts'oanang. XA;
  • ba sebetsanang le melaetsa le liketsahalo tse kenang le bona ba tlameha ho sebetsa le ts'ebetso ea ho fetola boemo ba ts'ebetso ea khoebo: haeba khoebo e joalo e khutlisetsoa morao, joale ho amoheloa ha molaetsa ho tlameha ho hlakoloa;
  • melaetsa e sa kang ea fanoa ka lebaka la liphoso e lokela ho bolokoa lebenkeleng le ka thoko D.L.Q. (Lethathamo la Mangolo a Shoeleng). Ho etsa sena, re thehile sethala se arohaneng sa microservice se bolokang melaetsa e joalo polokelong ea eona, e e supa ka litšoaneleho (bakeng sa ho hlophisa ka potlako le ho batla), 'me e pepesa API bakeng sa ho e shebella, ho e romella atereseng eo e eang ho eona, le ho hlakola melaetsa. Batsamaisi ba sistimi ba ka sebetsa le ts'ebeletso ena ka sebopeho sa bona sa marang-rang;
  • maemong a broker, o hloka ho lokisa palo ea lipehelo le tieho lipakeng tsa thomello ho fokotsa monyetla oa hore melaetsa e kene ho DLQ (ho batla ho sa khonehe ho bala liparamente tse nepahetseng, empa o ka nka khato ka matla le ho li lokisa ts'ebetso);
  • lebenkele la DLQ le lokela ho behoa leihlo ka ho tsoelang pele, 'me tsamaiso ea tlhokomelo e lokela ho tsebisa batsamaisi ba tsamaiso e le hore ba ka arabela kapele kamoo ho ka khonehang ha melaetsa e sa romelloang e etsahala. Sena se tla fokotsa "sebaka sa tšenyo" sa phoso kapa phoso ea mohopolo oa khoebo;
  • bese ea ho kopanya e tlameha ho se tsotelle ho ba sieo ha nakoana ha likopo: lipeeletso tsa lihlooho li tlameha ho tšoarella, 'me lebitso la sebaka sa kopo le tlameha ho ikhetha e le hore motho e mong a se ke a leka ho sebetsana le molaetsa oa eona ho tloha moleng nakong ea ho ba sieo ha kopo.

Ho netefatsa polokeho ea khoele ea logic ea khoebo

Mohlala o ts'oanang oa ts'ebetso ea khoebo o ka fumana melaetsa le liketsahalo tse 'maloa ka nako e le ngoe, ts'ebetso ea eona e tla qala ka tsela e ts'oanang. Ka nako e ts'oanang, bakeng sa moqapi oa kopo, ntho e 'ngoe le e' ngoe e lokela ho ba bonolo le e sireletsehileng ea khoele.

Mokhoa oa khoebo oa ts'ebetso o sebetsana le ketsahalo e 'ngoe le e' ngoe ea kantle e amang ts'ebetso ena ea khoebo ka bonngoe. Liketsahalo tsena e ka ba:

  • ho qala mohlala oa ts'ebetso ea khoebo;
  • ketso ea mosebelisi e amanang le ts'ebetso ea ts'ebetso ea khoebo;
  • ho fumana molaetsa kapa lets'oao leo ketsahalo ea khoebo e ngolisitsoeng ho lona;
  • ho fela ha nako e behiloeng ke mohlala oa ts'ebetso ea khoebo;
  • ketso ea ho laola ka API (mohlala, phumula ts'ebetso).

Ketsahalo e 'ngoe le e' ngoe e joalo e ka fetola boemo ba ts'ebetso ea khoebo: mesebetsi e meng e ka fela 'me e meng ea qala, boleng ba thepa e phehellang bo ka fetoha. Ho koala ketsahalo efe kapa efe ho ka baka ts'ebetso ea e 'ngoe kapa tse ling tsa tse latelang. Bao, ka lehlakoreng le leng, ba ka emisa ho emela liketsahalo tse ling, kapa, haeba ba sa hloke lintlha tse ling, ba ka 'na ba tlatsa ts'ebetsong e tšoanang. Pele ho koala ts'ebetso, boemo bo bocha ba ts'ebetso ea khoebo bo bolokiloe polokelong ea boitsebiso, moo bo tla emela ketsahalo e latelang ea kantle.

Lintlha tse tsitsitseng tsa ts'ebetso ea khoebo tse bolokiloeng polokelong ea litaba tsa likamano ke sebaka se bonolo haholo sa ho hokahanya ha u sebelisa KHETHA FOR UPDATE. Haeba ts'ebetso e le 'ngoe e khonne ho fumana boemo ba ts'ebetso ea khoebo ho tloha motheong ho e fetola, joale ha ho na ts'ebetso e' ngoe e tšoanang e tla khona ho fumana boemo bo tšoanang bakeng sa phetoho e 'ngoe,' me ka mor'a ho phethoa ha khoebo ea pele, ea bobeli tiisetso ya ho fumana boemo bo seng bo fetohile.

Re sebelisa liloko tse se nang tšepo ka lehlakoreng la DBMS, re phethahatsa litlhoko tsohle tse hlokahalang ACID, hape o boloke bokhoni ba ho lekanya ts'ebeliso ka mohopolo oa khoebo ka ho eketsa palo ea maemo a sebetsang.

Leha ho le joalo, linotlolo tse se nang tšepo li re sokela ka li-deadlocks, ho bolelang hore KHETHA FOR UPDATE e ntse e lokela ho lekanyetsoa ka nako e itseng e loketseng haeba ho ka ba le li-deadlocks maemong a mang a mabe a khoebo.

Bothata bo bong ke ho lumellana ha qalo ea ts'ebetso ea khoebo. Le ha ho se na mohlala oa ts'ebetso ea khoebo, ha ho na mmuso sebakeng sa polokelo ea litaba, ka hona mokhoa o hlalositsoeng o ke ke oa sebetsa. Haeba u batla ho netefatsa bo ikhethang ba mohlala oa ts'ebetso ea khoebo sebakeng se itseng, joale u hloka mofuta o itseng oa ntho ea ho hokahanya e amanang le sehlopha sa ts'ebetso le boholo bo lumellanang. Ho rarolla bothata bona, re sebelisa mokhoa o fapaneng oa ho notlela o re lumellang ho notlela sesebelisoa se ikhethileng se boletsoeng ke senotlolo sa sebopeho sa URI ka ts'ebeletso ea kantle.

Mehlala ea rona, ts'ebetso ea khoebo ea InitialPlayer e na le phatlalatso

uniqueConstraint = UniqueConstraints.singleton

Ka hona, log e na le melaetsa e mabapi le ho nka le ho lokolla senotlolo sa senotlolo se tsamaisanang le sona. Ha ho na melaetsa e joalo bakeng sa lits'ebetso tse ling tsa khoebo: uniqueConstraint ha e so beoe.

Mathata a ts'ebetso ea khoebo ka boemo bo tsitsitseng

Ka linako tse ling ho ba le boemo bo tsitsitseng ha bo thuse feela, empa hape bo sitisa tsoelo-pele.
Mathata a qala ha o hloka ho etsa liphetoho ho logic ea khoebo le / kapa mokhoa oa ts'ebetso ea khoebo. Ha ho phetoho leha e le efe e joalo e fumanoang e lumellana le boemo ba khale ba mekhoa ea khoebo. Haeba ho na le liketsahalo tse ngata tse "phelang" ho database, joale ho etsa liphetoho tse sa lumellaneng ho ka baka mathata a mangata, ao re atisang ho kopana le 'ona ha re sebelisa jBPM.

Ho itšetlehile ka botebo ba phetoho, u ka etsa lintho ka litsela tse peli:

  1. theha mofuta o mocha oa ts'ebetso ea khoebo e le hore u se ke ua etsa liphetoho tse sa lumellaneng ho ea khale, 'me u e sebelise ho e-na le ea khale ha u qala maemo a macha. Liketsahalo tsa khale li tla tsoela pele ho sebetsa "tsela ea khale";
  2. tsamaisa boemo bo phehellang ba mekhoa ea khoebo ha u nchafatsa mohopolo oa khoebo.

Mokhoa oa pele o bonolo, empa o na le mefokolo le mefokolo, mohlala:

  • phetisetso ea mohopolo oa khoebo mefuteng e mengata ea ts'ebetso ea khoebo, keketseho ea molumo oa mohopolo oa khoebo;
  • hangata ho hlokahala phetoho ea hang-hang ho logic e ncha ea khoebo (hoo e batlang e le kamehla mabapi le mesebetsi ea ho kopanya);
  • moqapi ha a tsebe hore na ho ka khoneha ho hlakola mehlala e sa sebetseng neng.

Ha e le hantle, re sebelisa mekhoa ka bobeli, empa re entse liqeto tse 'maloa ho nolofatsa bophelo ba rona:

  • setsing sa polokelo ea litaba, boemo bo tsitsitseng ba ts'ebetso ea khoebo bo bolokoa ka mokhoa o balang habonolo le o hlophisitsoeng habonolo: ka khoele ea sebopeho sa JSON. Sena se o lumella ho etsa metsamao ka hare ho kopo le kantle. Maemong a feteletseng, u ka boela ua e lokisa ka lihape (haholo-holo tse molemo ho nts'etsopele nakong ea ho lokisa liphoso);
  • mokhoa oa ho kopanya khoebo ha o sebelise mabitso a mekhoa ea khoebo, e le hore ka nako leha e le efe ho ka khoneha ho nkela ts'ebetsong e 'ngoe ea mekhoa ea ho kenya letsoho ka e ncha, e nang le lebitso le lecha (mohlala, "InitialPlayerV2"). Tlamo e etsahala ka mabitso a melaetsa le matshwao;
  • mokhoa oa ts'ebetso o na le nomoro ea phetolelo, eo re e eketsang haeba re etsa liphetoho tse sa lumellaneng le mohlala ona, 'me palo ena e bolokiloe hammoho le boemo ba mohlala oa ts'ebetso;
  • boemo bo tsitsitseng ba ts'ebetso bo baloa ho tloha botlaaseng pele ho mokhoa o loketseng oa ntho eo mokhoa oa ho falla o ka sebetsang le oona haeba palo ea phetolelo ea mohlala e fetohile;
  • mokhoa oa ho falla o behoa haufi le mohopolo oa khoebo 'me o bitsoa "botsoa" bakeng sa ketsahalo e' ngoe le e 'ngoe ea ts'ebetso ea khoebo nakong ea tsosoloso ea eona ho tloha polokelong ea boitsebiso;
  • haeba o hloka ho fallisa boemo ba maemo ohle a ts'ebetso kapele le ka mokhoa o ts'oanang, ho sebelisoa litharollo tsa khale tsa ho falla ha database, empa o tlameha ho sebetsa le JSON moo.

Na ke hloka moralo o mong bakeng sa lits'ebetso tsa khoebo?

Litharollo tse hlalositsoeng sehloohong sena li re lumelletse ho nolofatsa bophelo ba rona haholo, ho holisa letoto la mathata a rarollotsoeng maemong a nts'etsopele ea ts'ebeliso, le ho etsa hore mohopolo oa ho arola mohopolo oa khoebo ho li-microservices o khahle haholoanyane. Bakeng sa sena, ho entsoe mosebetsi o mongata, ho entsoe moralo o "bobebe" haholo bakeng sa lits'ebetso tsa khoebo, hammoho le likarolo tsa ts'ebeletso bakeng sa ho rarolla mathata a khethiloeng molemong oa mefuta e mengata ea mesebetsi e sebelisitsoeng. Re na le tjantjello ea ho arolelana liphetho tsena, ho tlisa nts'etsopele ea likarolo tse ts'oanang molemong oa phihlello e bulehileng tlasa laesense ea mahala. Sena se tla hloka boiteko bo itseng le nako. Ho utloisisa tlhokahalo ea litharollo tse joalo e ka ba khothatso e eketsehileng ho rona. Sehloohong se reriloeng, tlhokomelo e fokolang haholo e lefshoa ho bokhoni ba moralo ka boeona, empa tse ling tsa tsona li bonahala mehlaleng e fanoeng. Haeba leha ho le joalo re phatlalatsa moralo oa rona, sengoloa se arohaneng se tla neheloa ho sona. Khabareng, re tla leboha ha u ka siea maikutlo a fokolang ka ho araba potso:

Ke basebelisi ba ngolisitsoeng feela ba ka kenyang letsoho phuputsong. kenaka kopo.

Na ke hloka moralo o mong bakeng sa lits'ebetso tsa khoebo?

  • 18,8%Ee, haesale ke batla ntho e kang ena ka nako e telele.

  • 12,5%hoa thahasellisa ho ithuta haholoanyane ka ts'ebetsong ea hau, ho ka ba molemo2

  • 6,2%re sebelisa e 'ngoe ea meralo e teng, empa re ntse re nahana ho e nkela sebaka1

  • 18,8%re sebelisa e 'ngoe ea li-frameworks tse teng, ntho e 'ngoe le e' ngoe e loketse3

  • 18,8%ho sebetsana le maemo ntle le moralo3

  • 25,0%ngola ea hau4

Basebelisi ba 16 ba ile ba khetha. Basebelisi ba 7 ba ile ba hana.

Source: www.habr.com

Eketsa ka tlhaloso