Kuphatikiza kwa BPM

Kuphatikiza kwa BPM

Moni Habr!

Kampani yathu imagwira ntchito pakupanga ma ERP-class solutions, gawo la mkango lomwe limakhala ndi machitidwe opangira mabizinesi okhala ndi malingaliro ochulukirapo abizinesi ndikutuluka kwa EDMS. Zogulitsa zathu zamakono zimatengera matekinoloje a JavaEE, koma tikuyesanso ma microservices. Chimodzi mwazinthu zovuta kwambiri pazothetsera zotere ndikuphatikiza ma subsystems osiyanasiyana amadera oyandikana nawo. Mavuto ophatikizika nthawi zonse amatipatsa mutu waukulu, mosasamala kanthu za masitayelo omanga, masanjidwe aukadaulo ndi mafelemu omwe timagwiritsa ntchito, koma posachedwa pakhala kupita patsogolo pakuthetsa mavuto otere.

M'nkhani yomwe ndikukudziwitsani, ndilankhula za zochitika ndi kafukufuku wa zomangamanga zomwe NPO "Krista" ili nazo m'dera lomwe lasankhidwa. Tidzawonanso chitsanzo cha njira yosavuta yothetsera vuto lophatikizana kuchokera pamalingaliro a wopanga mapulogalamu ndikupeza zomwe zimabisika kumbuyo kwa kuphweka uku.

Chodzikanira

Mayankho a zomangamanga ndi luso omwe akufotokozedwa m'nkhaniyi akuperekedwa ndi ine kutengera zomwe ndakumana nazo pazantchito zinazake. Mayankho awa sakunena kuti ndiapadziko lonse lapansi ndipo mwina sangakhale abwino pamikhalidwe ina yogwiritsidwa ntchito.

Kodi BPM ndi chiyani?

Kuti tiyankhe funsoli, tiyenera kufufuza mozama za zovuta zomwe timagwiritsa ntchito pamayankho athu. Gawo lalikulu lamalingaliro amabizinesi mumayendedwe athu anthawi zonse ndikulowetsa deta mu nkhokwe kudzera m'malo ogwiritsa ntchito, kutsimikizira kwapamanja ndi kutsimikiza kwachidziwitsochi, ndikuchichita kudzera mukuyenda kwina, kusindikiza kumakina ena / nkhokwe / zosungira zakale, ndikupanga malipoti. . Chifukwa chake, ntchito yayikulu yamakina kwa makasitomala ndikudzipangira okha mabizinesi awo amkati.

Kuti zitheke, timagwiritsa ntchito mawu oti "document" polankhulana ngati chidule cha seti ya data yolumikizidwa ndi kiyi wamba yomwe mayendedwe ena amatha "kulumikizidwa".
Koma bwanji za kuphatikiza logic? Kupatula apo, ntchito yophatikizira imapangidwa ndi mamangidwe a dongosolo, lomwe "lodulidwa" m'magawo OSATI pa pempho la kasitomala, koma mothandizidwa ndi zinthu zosiyanasiyana:

  • malinga ndi lamulo la Conway;
  • chifukwa chogwiritsanso ntchito ma subsystems omwe adapangidwa kale pazinthu zina;
  • pakufuna kwa mmisiri wa zomangamanga, kutengera zosowa zosagwira ntchito.

Pali chiyeso chachikulu cholekanitsa malingaliro ophatikizana ndi malingaliro abizinesi amayendedwe akulu, kuti musawononge malingaliro abizinesi ndi zophatikizira zophatikizika ndikupulumutsa wopanga mapulogalamu pakufunika kuti afufuze mbali za kamangidwe ka dongosolo. Njirayi ili ndi maubwino angapo, koma machitidwe akuwonetsa kusagwira ntchito kwake:

  • kuthetsa mavuto ophatikizana nthawi zambiri kumabwereranso ku njira zosavuta kwambiri monga mafoni a synchronous chifukwa cha zochepa zowonjezera zowonjezera pakukhazikitsidwa kwa kayendetsedwe ka ntchito yaikulu (zoipa za kusakanikirana kwa synchronous zikukambidwa pansipa);
  • zophatikizika zophatikizika zimadutsabe m'malingaliro abizinesi pomwe mayankho amtundu wina akufunika;
  • wogwiritsa ntchito amanyalanyaza kuphatikizikako ndipo amatha kuswa mosavuta mwa kusintha kayendedwe ka ntchito;
  • dongosolo limasiya kukhala limodzi lathunthu kuchokera kwa wogwiritsa ntchito, "seams" pakati pa subsystems zimawonekera, ndipo ntchito zosafunikira za ogwiritsa ntchito zimawonekera, kuyambitsa kusamutsa deta kuchokera ku subsystem kupita ku ina.

Njira ina ndikulingalira kuyanjana kophatikizana monga gawo lofunikira lamalingaliro abizinesi ndi kayendetsedwe ka ntchito. Kuti mupewe ziyeneretso za oyambitsa mapulogalamu kuti asachuluke, kupanga kulumikizana kwatsopano kuyenera kukhala kosavuta komanso kosavuta, kokhala ndi mwayi wosankha yankho. Izi ndizovuta kuchita kuposa momwe zikuwonekera: chidacho chiyenera kukhala champhamvu mokwanira kuti chipatse wogwiritsa ntchito mitundu yosiyanasiyana yofunikira kuti agwiritse ntchito, osamulola "kudziwombera pamapazi." Pali mafunso ambiri omwe injiniya ayenera kuyankha pokhudzana ndi ntchito zophatikizira, koma zomwe wogwiritsa ntchito sayenera kuganizira pazantchito zake zatsiku ndi tsiku: malire ochitapo kanthu, kusasinthika, ma atomiki, chitetezo, makulitsidwe, katundu ndi kugawa kwazinthu, mayendedwe, kuwongolera, kugawa ndi kusintha nkhani, etc. M'pofunika kupereka Madivelopa ntchito mwachilungamo njira zothetsera zidindo mmene mayankho a mafunso onse obisika kale. Ma templates awa ayenera kukhala otetezeka: malingaliro abizinesi amasintha nthawi zambiri, zomwe zimawonjezera chiopsezo choyambitsa zolakwika, mtengo wa zolakwika uyenera kukhala wochepa kwambiri.

Koma kodi BPM ndi chiyani? Pali njira zambiri zogwirira ntchito ...
Zowonadi, kukhazikitsidwa kwina kwa njira zamabizinesi ndikodziwika kwambiri pamayankho athu - kudzera pakutanthauzira kwachiwonetsero cha kusintha kwa boma komanso kulumikizana kwa ogwira ntchito ndi malingaliro abizinesi pakusintha. Pachifukwa ichi, dziko lomwe limasankha malo omwe alipo panopa "chikalata" muzochita zamalonda ndi chikhalidwe cha "chikalata" chokha.

Kuphatikiza kwa BPM
Izi ndi momwe ndondomekoyi imawonekera kumayambiriro kwa polojekiti

Kutchuka kwa kukhazikitsa kumeneku kumachitika chifukwa cha kuphweka komanso kuthamanga kwa njira zamabizinesi. Komabe, momwe machitidwe amapulogalamu amapitilira kukhala ovuta, gawo lodzipangira la bizinesi limakula ndikukhala lovuta kwambiri. Pakufunika kuwonongeka, kugwiritsiranso ntchito mbali za ndondomeko, komanso njira za nthambi kuti nthambi iliyonse ichitidwe mofanana. Pazifukwa zotere, chidacho chimakhala chovuta, ndipo chithunzi cha kusintha kwa boma chimataya chidziwitso chake (kuyanjana kwaphatikizidwe sikumawonetsedwa konse mu chithunzi).

Kuphatikiza kwa BPM
Izi ndi momwe ndondomekoyi ikuwonekera pambuyo pa kubwereza kangapo kwa zofunikira.

Njira yothetsera vutoli inali kugwirizanitsa injini jBPM pa kuzinthu zina zomwe zimakhala ndi njira zovuta kwambiri zamabizinesi. M'kanthawi kochepa, yankholi lidachita bwino: zidakhala zotheka kugwiritsa ntchito njira zovuta zamabizinesi ndikusunga chidziwitso chokwanira komanso choyenera pamawu. BPMN2.

Kuphatikiza kwa BPM
Gawo laling'ono la bizinesi yovuta

M'kupita kwa nthawi, yankho silinakwaniritsidwe zomwe zinkayembekezeka: kuwonjezereka kwa ntchito zopanga njira zamabizinesi pogwiritsa ntchito zida zowonetsera sikunalole kukwaniritsa zizindikiro zovomerezeka zokolola, ndipo chidacho chinakhala chimodzi mwa zosakondedwa kwambiri pakati pa omanga. Panalinso kudandaula za kapangidwe mkati mwa injini, zomwe zinachititsa kuti ambiri "zigamba" ndi "ndodo".

Chinthu chabwino kwambiri chogwiritsira ntchito jBPM chinali kuzindikira za ubwino ndi zovulaza za kukhala ndi ndondomeko ya bizinesi yomwe ikupitirirabe. Tidawonanso kuthekera kogwiritsa ntchito njira yoyendetsera njira zolumikizira zovuta pakati pa mapulogalamu osiyanasiyana pogwiritsa ntchito ma asynchronous kuyanjana kudzera pazizindikiro ndi mauthenga. Kukhalapo kwa dziko lolimbikira kumagwira ntchito yofunika kwambiri pa izi.

Kutengera zomwe zili pamwambapa, titha kunena kuti: Njira yoyendetsera kalembedwe ka BPM imatilola kuti titha kuthana ndi ntchito zingapo kuti tigwiritse ntchito njira zamabizinesi zomwe zikuchulukirachulukira, kugwirizanitsa bwino ntchito zophatikizira munjira izi ndikusunga kuthekera kowonetsa zomwe zachitika m'mawu oyenera.

Kuipa kwa mafoni a synchronous ngati njira yophatikizira

Kuphatikiza kwa synchronous kumatanthauza kuyimba kosavuta kwambiri. Dongosolo limodzi limakhala ngati mbali ya seva ndikuwulula API ndi njira yofunikira. Dongosolo lina limakhala ngati mbali ya kasitomala ndipo nthawi yoyenera imayimba ndikudikirira zotsatira. Kutengera ndi kamangidwe kakachitidwe, kasitomala ndi mbali za seva zitha kupezeka mwanjira yofanana ndi njira, kapena mosiyana. Mugawo lachiwiri, muyenera kugwiritsa ntchito kukhazikitsa kwa RPC ndikupereka kuwongolera magawo ndi zotsatira za kuyimba.

Kuphatikiza kwa BPM

Njira yophatikizira iyi ili ndi zovuta zambiri, koma imagwiritsidwa ntchito kwambiri pochita chifukwa cha kuphweka kwake. Kuthamanga kwa kukhazikitsa kumakopa ndikukukakamizani kuti mugwiritse ntchito mobwerezabwereza pamaso pa nthawi yomaliza, ndikulemba yankho ngati ngongole yaukadaulo. Koma zimachitikanso kuti opanga osadziwa amagwiritsa ntchito mosadziwa, osazindikira zotsatira zake.

Kuphatikiza pa kuwonjezereka koonekeratu kwa kugwirizana kwa subsystem, palinso mavuto osadziwika bwino ndi "kukula" ndi "kutambasula" zochitika. Zowonadi, ngati malingaliro abizinesi apanga kusintha kwina, ndiye kuti kugulitsa sikungapewedwe, ndipo kugulitsako kumalepheretsa zida zina zomwe zimakhudzidwa ndi kusinthaku. Ndiye kuti, mpaka kagawo kakang'ono kakudikirira kuyankha kuchokera kwa winayo, sangathe kumaliza ntchitoyo ndikuchotsa zotsekera. Izi zimawonjezera kwambiri chiopsezo cha zotsatira zosiyanasiyana:

  • Kuyankha kwadongosolo kumatayika, ogwiritsa ntchito amadikirira nthawi yayitali mayankho a mafunso;
  • seva nthawi zambiri imasiya kuyankha zopempha za ogwiritsa ntchito chifukwa chakuchulukirachulukira kwa ulusi: ulusi wambiri umatsekedwa pazida zomwe zimagwiritsidwa ntchito;
  • Ma Deadlocks ayamba kuwonekera: kuthekera kwazomwe zikuchitika kumadalira nthawi yamalonda, kuchuluka kwa malingaliro abizinesi ndi maloko omwe akukhudzidwa;
  • zolakwa za nthawi yomaliza ya transaction zimawonekera;
  • seva "ikulephera" ndi OutOfMemory ngati ntchitoyo ikufuna kukonza ndikusintha deta yambiri, ndipo kukhalapo kwa ma synchronous integrations kumapangitsa kuti zikhale zovuta kwambiri kugawanitsa ntchito "zopepuka".

Kuchokera pamalingaliro omangamanga, kugwiritsa ntchito kutsekereza kuyimba panthawi yolumikizana kumabweretsa kulephera kuwongolera mtundu wamagulu ang'onoang'ono: ndizosatheka kuwonetsetsa kuti zidziwitso zamtundu wagawo limodzi mwapang'onopang'ono zimasiyanitsidwa ndi zizindikiro zamtundu wina. Ngati ma subsystems apangidwa ndi magulu osiyanasiyana, ili ndi vuto lalikulu.

Zinthu zimakhala zosangalatsa kwambiri ngati ma subsystems omwe akuphatikizidwa ali m'mapulogalamu osiyanasiyana ndipo muyenera kusintha ma synchronous mbali zonse ziwiri. Kodi mungatsimikizire bwanji kuti zosinthazi zachitika?

Ngati kusintha kumapangidwa muzochita zosiyana, ndiye kuti muyenera kupereka zodalirika zothandizira ndi kubweza, ndipo izi zimathetsa phindu lalikulu la kuphatikizika kwa synchronous - kuphweka.

Zogulitsa zogawidwa zimabweranso m'maganizo, koma sitimazigwiritsa ntchito muzothetsera zathu: n'zovuta kutsimikizira kudalirika.

"Saga" ngati njira yothetsera vuto la malonda

Ndi kutchuka komwe kukukulirakulira kwa ma microservices, kufunikira kwa Chitsanzo cha Saga.

Chitsanzochi chimathetsa bwino mavuto omwe tawatchulawa a nthawi yayitali, komanso amakulitsa luso la kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe kake: njira ina yosinthira deta. Izi zimakupatsaninso mwayi kuti mupewe kubwereza njira zosinthira deta poyesa kubweretsa "zabwino" kumapeto.

Chochititsa chidwi n'chakuti m'machitidwe a monolithic ndondomekoyi imakhalanso yofunikira pokhudzana ndi kuphatikizika kwa ma subsystems osakanikirana ndi zotsatira zoipa zomwe zimachitika chifukwa cha nthawi yayitali komanso maloko ofananirako amawonedwa.

Mogwirizana ndi mabizinesi athu mumayendedwe a BPM, zimakhala zosavuta kukhazikitsa "Sagas": masitepe a "Saga" atha kufotokozedwa ngati zochitika mkati mwa bizinesi, komanso kulimbikira kwa bizinesi. zimatsimikizira zamkati mwa "Saga". Ndiko kuti, sitifuna njira ina yowonjezera yogwirizanitsa. Zomwe mukufunikira ndizomwe zimatsimikizira kuti "kamodzi" ngati zoyendera.

Koma yankho ili lilinso ndi "mtengo" wake:

  • malingaliro abizinesi amakhala ovuta kwambiri: chipukuta misozi chiyenera kuchitidwa;
  • padzakhala kofunikira kusiya kusasinthika kwathunthu, komwe kumatha kukhala tcheru makamaka kwa machitidwe a monolithic;
  • Zomangamanga zimakhala zovuta kwambiri, ndipo chosowa chowonjezera cha uthenga broker chikuwonekera;
  • Zida zowonjezera zowunikira ndi kuyang'anira zidzafunika (ngakhale kuti izi ndizabwino: mtundu wa ntchito zadongosolo udzawonjezeka).

Kwa machitidwe a monolithic, kulungamitsidwa kwa kugwiritsa ntchito "Sag" sizowonekeratu. Kwa ma microservices ndi ma SOA ena, komwe kulipo kale broker, ndipo kusasinthika kwathunthu kumaperekedwa kumayambiriro kwa polojekiti, ubwino wogwiritsa ntchito chitsanzochi ukhoza kupitirira zovuta zake, makamaka ngati pali API yabwino pamalingaliro abizinesi. mlingo.

Kuyika malingaliro abizinesi mu ma microservices

Pamene tidayamba kuyesa ma microservices, funso lomveka lidawuka: komwe mungayike malingaliro abizinesi a domain pokhudzana ndi ntchito yomwe imatsimikizira kulimbikira kwa deta?

Mukayang'ana mamangidwe a ma BPMS osiyanasiyana, zitha kuwoneka zomveka kulekanitsa malingaliro abizinesi ndi kulimbikira: pangani nsanja ndi ma microservices odziyimira pawokha omwe amapanga chilengedwe ndi chidebe chochitira malingaliro abizinesi, ndikupanga kulimbikira kwa data ya domain monga gawo losiyana la ma microservices osavuta komanso opepuka. Njira zamabizinesi munkhaniyi zimapanga ma orchestration a ntchito zolimbikira.

Kuphatikiza kwa BPM

Njirayi ili ndi mwayi waukulu kwambiri: mutha kukulitsa magwiridwe antchito a nsanja momwe mukufunira, ndipo gawo lokhalo lolingana la ma microservices apulogalamu lidzakhala "mafuta" kuchokera pa izi. Njira zamabizinesi kuchokera kudera lililonse zimatha kugwiritsa ntchito mawonekedwe atsopano papulatifomu ikangosinthidwa.

Kafukufuku wowonjezereka adawonetsa zovuta zazikulu za njirayi:

  • ntchito yamapulatifomu yomwe imapanga malingaliro abizinesi a madambwe ambiri nthawi imodzi imakhala ndi zoopsa zazikulu ngati kulephera kumodzi. Kusintha pafupipafupi pamalingaliro abizinesi kumawonjezera chiopsezo cha zolakwika zomwe zimatsogolera kulephera kwadongosolo lonse;
  • Zokhudza magwiridwe antchito: malingaliro abizinesi amagwira ntchito ndi data yake kudzera panjira yopapatiza komanso yocheperako:
    • deta idzasinthidwanso ndikuponyedwa kudzera pa intaneti;
    • ntchito yoyang'anira nthawi zambiri imapereka zambiri kuposa zomwe zimafunikira kuti malingaliro abizinesi athetsedwe chifukwa chosakwanira pakukwaniritsa zopempha pamlingo wa API wakunja wautumiki;
    • magawo angapo odziyimira pawokha amalingaliro abizinesi amatha kupemphanso mobwerezabwereza deta yomweyi kuti ikonzedwe (vutoli litha kuchepetsedwa powonjezera magawo agawo omwe amasunga deta, koma izi zimasokonezanso kamangidwe kake ndikupanga zovuta za kufunikira kwa deta ndi kulephera kwa cache);
  • zovuta zamalonda:
    • njira zamabizinesi okhala ndi boma lolimbikira, lomwe limasungidwa ndi nsanja ya nsanja, sizigwirizana ndi madomeni, ndipo palibe njira zosavuta zothetsera vutoli;
    • kuyika kutsekereza kwa data panja pakuchitapo kanthu: ngati malingaliro abizinesi a domain akuyenera kusintha atangoyang'ana kulondola kwazomwe zikuchitika, ndikofunikira kusiya kuthekera kwakusintha kwapikisano pazosinthidwa. Kutsekereza deta kunja kungathandize kuthetsa vutoli, koma njira yotereyi imakhala ndi zoopsa zowonjezera komanso imachepetsa kudalirika kwathunthu kwa dongosolo;
  • zovuta zina pokonzanso: nthawi zina, ntchito yolimbikira ndi malingaliro abizinesi amafunika kusinthidwa mogwirizana kapena mosamalitsa.

Pamapeto pake, tidayenera kubwereranso ku zoyambira: kuyika deta ya domain ndi malingaliro abizinesi amtundu mu microservice imodzi. Njirayi imathandizira kuzindikira kwa microservice ngati gawo lofunikira la dongosolo ndipo sizimayambitsa mavuto omwe ali pamwambapa. Izi sizikuperekedwanso kwaulere:

  • Kuyimitsidwa kwa API kumafunikira pakulumikizana ndi malingaliro abizinesi (makamaka, kupereka zochitika za ogwiritsa ntchito ngati gawo la bizinesi) ndi ntchito zamapulatifomu a API; imafuna chidwi chochulukirapo pakusintha kwa API, kuyenderana kutsogolo ndi kumbuyo;
  • ndikofunikira kuwonjezera ma library owonjezera omwe akuyendetsa nthawi kuti awonetsetse kugwira ntchito kwa malingaliro abizinesi monga gawo lililonse la microservice yotere, ndipo izi zimabweretsa zofunikira zatsopano zamalaibulale otere: kupepuka komanso kudalira kocheperako;
  • Opanga malingaliro abizinesi ayenera kuyang'anira mitundu ya laibulale: ngati microservice sinamalizidwe kwa nthawi yayitali, ndiye kuti imakhala ndi malaibulale akale. Izi zitha kukhala chopinga chosayembekezereka powonjezera chinthu chatsopano ndipo pangafune kusamutsa malingaliro akale abizinesi yantchito yotere kupita kumitundu yatsopano yamalaibulale ngati panali zosintha zosagwirizana pakati pa mitundu.

Kuphatikiza kwa BPM

Zomangamangazi zimakhalanso ndi gawo la ntchito zamapulatifomu, koma gawo ili silipanganso chidebe kuti mugwiritse ntchito malingaliro abizinesi, koma malo ake okha, omwe amapereka ntchito zothandizira "nsanja". Zosanjikiza zotere zimafunikira osati kungosunga mawonekedwe opepuka a domain microservices, komanso kukhazikitsa pakati kasamalidwe.

Mwachitsanzo, ntchito za ogwiritsa ntchito munjira zamabizinesi zimapanga ntchito. Komabe, pogwira ntchito ndi ntchito, wogwiritsa ntchitoyo ayenera kuwona ntchito kuchokera kumadera onse pamndandanda wamba, zomwe zikutanthauza kuti payenera kukhala ntchito yolembera ntchito yofananira, yochotsedwa pamalingaliro abizinesi. Kusunga malingaliro abizinesi munjira yotere ndizovuta, ndipo uku ndikusokonekera kwina kwamamangidwe awa.

Kuphatikiza njira zamabizinesi kudzera m'maso mwa wopanga mapulogalamu

Monga tafotokozera pamwambapa, wogwiritsa ntchito ayenera kuchotsedwa pazaumisiri ndi uinjiniya pakukhazikitsa kuyanjana kwa mapulogalamu angapo kuti munthu athe kudalira chitukuko chabwino.

Tiyeni tiyesetse kuthana ndi vuto lophatikizana lovuta kwambiri, lomwe linapangidwira nkhaniyi. Imeneyi idzakhala ntchito ya "masewera" yomwe ikuphatikizapo mapulogalamu atatu, pamene aliyense wa iwo amatanthauzira dzina lachidziwitso: "app1", "app2", "app3".

Mkati mwa pulogalamu iliyonse, njira zamabizinesi zimayambitsidwa zomwe zimayamba "kusewera mpira" kudzera mu basi yophatikiza. Mauthenga okhala ndi dzina "Mpira" adzakhala ngati mpira.

Malamulo a Masewera:

  • wosewera woyamba ndi woyambitsa. Amayitanira osewera ena ku masewerawo, amayamba masewerawa ndipo akhoza kuthetsa nthawi iliyonse;
  • osewera ena amalengeza kutenga nawo mbali mu masewerawa, "kudziwana" ndi wosewera woyamba;
  • atalandira mpirawo, wosewerayo amasankha wosewera wina ndikumupatsa mpirawo. Chiwerengero chonse cha ma transmission chimawerengedwa;
  • Wosewera aliyense ali ndi "mphamvu" zomwe zimachepa ndi pass iliyonse ya mpira ndi wosewerayo. Mphamvu ikatha, wosewera mpira amasiya masewerawo, akulengeza kuti wasiya;
  • ngati wosewerayo atsala yekha, nthawi yomweyo amalengeza kuchoka kwake;
  • Osewera onse akachotsedwa, wosewera woyamba amalengeza kuti masewerawo atha. Ngati asiya masewerawa molawirira, amakhalabe kutsatira masewerawa kuti amalize.

Kuti tithane ndi vutoli, ndigwiritsa ntchito DSL yathu panjira zamabizinesi, zomwe zimatilola kufotokozera malingaliro a Kotlin molumikizana, ndi boilerplate yochepa.

Kachitidwe ka bizinesi ka wosewera woyamba (womwe amadziwika kuti ndiye woyambitsa masewerawa) azigwira ntchito mu app1:

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

Kuphatikiza pakuchita malingaliro abizinesi, nambala yomwe ili pamwambapa imatha kupanga mtundu wazinthu zamabizinesi, zomwe zitha kuwoneka ngati chithunzi. Sitinagwiritse ntchito zowonera, chifukwa chake tidakhala nthawi yayitali ndikujambula (apa ndidapeputsa pang'ono mawu a BPMN okhudzana ndi kugwiritsa ntchito zipata kuti athandizire kusinthasintha kwachithunzichi ndi nambala yomwe ili pansipa):

Kuphatikiza kwa BPM

app2 iphatikiza bizinesi ya wosewera winayo:

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

Chithunzi:

Kuphatikiza kwa BPM

Mu pulogalamu ya app3 tipanga wosewera yemwe ali ndi machitidwe osiyana pang'ono: m'malo mosankha wosewera wina mwachisawawa, azichita molingana ndi algorithm yozungulira-robin:

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

Apo ayi, khalidwe la wosewera mpira silikusiyana ndi lapitalo, kotero kuti chithunzicho sichisintha.

Tsopano tikufunika kuyesa kuti tiyendetse zonsezi. Ndingopereka kachidindo kokha ka mayesowo, kuti ndisasokoneze nkhaniyo ndi boilerplate (m'malo mwake, ndidagwiritsa ntchito malo oyesera omwe adapangidwa kale kuyesa kuphatikiza njira zina zamabizinesi):

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

Tiyeni tiyese mayeso ndikuyang'ana chipika:

zotsatira za 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!

Kuchokera pa izi titha kupeza mfundo zingapo zofunika:

  • ndi zida zofunikira, opanga mapulogalamu amatha kupanga kulumikizana kophatikizana pakati pa mapulogalamu popanda kusokoneza malingaliro abizinesi;
  • zovuta za ntchito yophatikizira yomwe imafuna luso laumisiri ikhoza kubisika mkati mwa chimango ngati izi zikuphatikizidwa poyambirira pamapangidwe a chimango. Kuvuta kwa vuto sikungathe kubisika, kotero yankho la vuto lovuta mu code lidzawoneka ngati ilo;
  • Popanga malingaliro ophatikizana, ndikofunikira kuganizira kusasinthika komaliza komanso kusowa kwa mzere wakusintha kwa onse omwe akutenga nawo mbali. Izi zimatikakamiza kusokoneza malingaliro athu kuti zisamve chidwi ndi dongosolo lomwe zochitika zakunja zimachitika. Mu chitsanzo chathu, wosewera mpira amakakamizika kutenga nawo mbali mu masewerawa atalengeza kuti watuluka mu masewerawo: osewera ena apitirizabe kumupatsa mpira mpaka chidziwitso chokhudza kutuluka kwake chifike ndikukonzedwa ndi onse omwe atenga nawo mbali. Lingaliro ili silimatsatira malamulo a masewerawa ndipo ndi njira yothetsera mgwirizano mkati mwa dongosolo la zomangamanga zosankhidwa.

Kenaka, tidzakambirana za zovuta zosiyanasiyana za yankho lathu, kusagwirizana ndi mfundo zina.

Mauthenga onse ali pamzere umodzi

Ntchito zonse zophatikizika zimagwira ntchito ndi basi imodzi yophatikizira, yomwe imaperekedwa ngati broker wakunja, BPMQueue imodzi ya mauthenga ndi mutu umodzi wa BPMTopic wa zizindikiro (zochitika). Kuyika mauthenga onse pamzere umodzi ndikokokera. Pamalingaliro abizinesi, mutha kuwonetsa mitundu yatsopano ya mauthenga momwe mungafunire osasintha dongosolo. Uku ndi kufewetsa kwakukulu, koma kumakhala ndi zoopsa zina, zomwe muzochitika za ntchito zathu zomwe sizinkawoneka zofunikira kwambiri kwa ife.

Kuphatikiza kwa BPM

Komabe, pali chinyengo chimodzi apa: ntchito iliyonse imasefa "zake" mauthenga kuchokera pamzere wolowera pakhomo, ndi dzina la malo ake. Derali litha kufotokozedwanso muzizindikiro ngati mukufuna kuchepetsa "kuchuluka kwa mawonekedwe" a siginecha ku pulogalamu imodzi. Izi zikuyenera kuchulukitsa kuchuluka kwa mabasi, koma malingaliro abizinesi akuyenera kugwira ntchito ndi mayina a madambwe: poyankha mauthenga - ovomerezeka, pazizindikiro - zofunika.

Kuonetsetsa Kudalirika Kwa Basi Yophatikiza

Kudalirika kumakhala ndi mfundo zingapo:

  • Wothandizira uthenga wosankhidwa ndi gawo lofunika kwambiri la zomangamanga komanso vuto limodzi lolephera: liyenera kukhala lolekerera zolakwa mokwanira. Muyenera kugwiritsa ntchito zomwe zayesedwa nthawi, ndi chithandizo chabwino komanso gulu lalikulu;
  • ndikofunikira kuwonetsetsa kupezeka kwakukulu kwa broker wauthenga, womwe uyenera kupatulidwa mwakuthupi ndi mapulogalamu ophatikizika (kupezeka kwakukulu kwa mapulogalamu okhala ndi malingaliro abizinesi ogwiritsidwa ntchito ndikovuta kwambiri komanso okwera mtengo kuonetsetsa);
  • broker akuyenera kupereka zitsimikizo "kamodzi kamodzi". Ichi ndi chofunikira chofunikira pakugwira ntchito kodalirika kwa basi yophatikiza. Palibe chifukwa chotsimikizira mulingo wa "kamodzi kamodzi": njira zamabizinesi, monga lamulo, sizimakhudzidwa ndi kubwera kwa mauthenga kapena zochitika mobwerezabwereza, ndipo muntchito zapadera zomwe ndizofunikira, ndizosavuta kuwonjezera macheke owonjezera kubizinesi. logic kuposa kugwiritsa ntchito nthawi zonse "zokwera mtengo" " zitsimikizo;
  • kutumiza mauthenga ndi ma signature kuyenera kuphatikizidwa muzochitika zonse ndi kusintha kwa kayendetsedwe ka bizinesi ndi madomeni. Njira yabwino ndiyo kugwiritsa ntchito chitsanzo Transaction Outbox, koma idzafunika tebulo lowonjezera mu database ndi wobwereza. M'mapulogalamu a JEE, izi zitha kukhala zosavuta kugwiritsa ntchito manejala wa JTA wamba, koma kulumikizana ndi broker wosankhidwa kuyenera kugwira ntchito. XA;
  • oyang'anira mauthenga obwera ndi zochitika ayeneranso kugwira ntchito ndi malonda omwe amasintha momwe bizinesi ikugwirira ntchito: ngati malondawa abwezeretsedwa, ndiye kuti kulandila uthengawo kuyenera kuthetsedwa;
  • mauthenga omwe sakanatha kuperekedwa chifukwa cha zolakwika ayenera kusungidwa mu malo osiyana Mtengo DLQ (Mzere Wakalata Wakufa). Pazifukwa izi, tidapanga nsanja yosiyana ya microservice yomwe imasunga mauthenga oterowo posungirako, kuwalozera molingana ndi zikhumbo zake (kuti agawane mwachangu ndikusaka), ndikuwulula API yowonera, kutumiza ku adilesi komwe akupita, ndikuchotsa mauthenga. Oyang'anira makina amatha kugwira ntchito ndi ntchitoyi kudzera pa intaneti;
  • pazikhazikiko za broker, muyenera kusintha kuchuluka kwa zoyeserera ndi kuchedwa pakati pa kutumiza kuti muchepetse mwayi wa mauthenga kulowa mu DLQ (ndizosatheka kuwerengera magawo oyenera, koma mutha kuchitapo kanthu mwachangu ndikuwongolera mukamagwira ntchito. );
  • Sitolo ya DLQ iyenera kuyang'aniridwa mosalekeza, ndipo dongosolo loyang'anira liyenera kuchenjeza oyang'anira dongosolo kuti pamene mauthenga omwe sanaperekedwe achitika, athe kuyankha mwamsanga. Izi zidzachepetsa "gawo lokhudzidwa" la kulephera kapena cholakwika chamalingaliro abizinesi;
  • basi yophatikizira iyenera kukhala yosakhudzidwa ndi kusapezeka kwakanthawi kwa mapulogalamu: zolembetsa pamutu ziyenera kukhala zokhazikika, ndipo dzina lachidziwitso la pulogalamuyo liyenera kukhala lapadera kuti pomwe ntchitoyo kulibe, wina asayese kukonza mauthenga ake kuchokera ku pamzere.

Kuonetsetsa chitetezo cha ulusi wamabizinesi logic

Chitsanzo chomwecho cha ndondomeko ya bizinesi chikhoza kulandira mauthenga angapo ndi zochitika nthawi imodzi, zomwe zidzayambike mofanana. Nthawi yomweyo, kwa wopanga mapulogalamu, chilichonse chiyenera kukhala chosavuta komanso chotetezedwa ndi ulusi.

Lingaliro labizinesi lanjira limayendetsa chochitika chilichonse chakunja chomwe chimakhudza momwe bizinesiyo imagwirira ntchito payekhapayekha. Zochitika zotere zitha kukhala:

  • kuyambitsa ndondomeko ya bizinesi;
  • zochita za ogwiritsa ntchito zokhudzana ndi ntchito mkati mwa bizinesi;
  • kulandila uthenga kapena chizindikiro chomwe chochitika cha bizinesi chimalembetsedwa;
  • kuyambitsa nthawi yokhazikitsidwa ndi zochitika zabizinesi;
  • kuwongolera zochita kudzera pa API (mwachitsanzo, kusokoneza kwa ndondomeko).

Chochitika chilichonse chotere chimatha kusintha momwe bizinesi ikuchitikira: zochitika zina zitha kutha ndipo zina zitha kuyamba, ndipo makonda azinthu zomwe zikupitilira zimatha kusintha. Kutseka ntchito iliyonse kungapangitse kuti chimodzi kapena zingapo mwa izi zichitike. Iwo, nawonso, akhoza kusiya kudikirira zochitika zina kapena, ngati safuna zina zowonjezera, akhoza kumaliza muzochitika zomwezo. Asanatseke kugulitsako, chikhalidwe chatsopano cha bizinesi chimasungidwa mu database, komwe chidzadikirira kuti chochitika china chakunja chichitike.

Zambiri zamabizinesi olimbikira zomwe zasungidwa m'malo osungira maubale ndi njira yabwino kwambiri yolumikizirana ngati mugwiritsa ntchito SAKANI ZAMBIRI. Ngati kugulitsa kumodzi kudatha kupeza chikhalidwe cha bizinesi kuchokera ku maziko oti asinthe, ndiye kuti palibe ntchito ina yofanana yomwe ingathe kupeza dziko lomwelo pakusintha kwina, ndipo pambuyo pomaliza ntchito yoyamba, yachiwiri ndi wotsimikizika kulandira dziko lomwe lasinthidwa kale.

Pogwiritsa ntchito maloko opanda chiyembekezo kumbali ya DBMS, timakwaniritsa zofunikira zonse ACID, ndikusunganso kuthekera kokulitsa ntchitoyo ndi malingaliro abizinesi powonjezera kuchuluka kwa zochitika zomwe zikuchitika.

Komabe, maloko opanda chiyembekezo amatiwopseza ndi ma deadlocks, zomwe zikutanthauza kuti SELECT FOR UPDATE iyenerabe kukhala ndi nthawi yokwanira yoti zisachitike pazochitika zina zazikulu zamabizinesi.

Vuto lina ndikugwirizanitsa chiyambi cha bizinesi. Ngakhale palibe chitsanzo cha ndondomeko ya bizinesi, palibe boma mu database, kotero njira yofotokozedwayo sigwira ntchito. Ngati mukufuna kuwonetsetsa kuti bizinesiyo ndi yapadera pazochitika zinazake, ndiye kuti mudzafunika mtundu wina wa chinthu cholumikizira cholumikizidwa ndi gulu la ndondomekoyi komanso kuchuluka kwake. Kuti tithane ndi vutoli, timagwiritsa ntchito njira yotsekera yosiyana yomwe imatilola kutseka pazida zomwe zafotokozedwa ndi kiyi yamtundu wa URI kudzera muntchito yakunja.

M'zitsanzo zathu, ndondomeko ya bizinesi ya InitialPlayer ili ndi chilengezo

uniqueConstraint = UniqueConstraints.singleton

Chifukwa chake, chipikacho chili ndi mauthenga okhudza kutenga ndi kumasula loko ya kiyi yofananira. Palibe mauthenga otere pamabizinesi ena: uniqueConstraint sinakhazikitsidwe.

Mavuto a njira zamabizinesi ndi boma lolimbikira

Nthawi zina kukhala ndi mkhalidwe wolimbikira sikumangothandiza, komanso kumalepheretsa chitukuko.
Mavuto amayamba pamene kusintha kukufunika kupangidwa pamalingaliro abizinesi ndi/kapena mtundu wabizinesi. Sikuti kusintha kulikonse kotereku kumagwirizana ndi machitidwe akale abizinesi. Ngati pali zochitika zambiri zamoyo mu database, ndiye kuti kusintha kosagwirizana kungayambitse mavuto ambiri, omwe nthawi zambiri timakumana nawo pogwiritsa ntchito jBPM.

Kutengera kuzama kwa zosinthazo, mutha kuchita m'njira ziwiri:

  1. pangani mtundu watsopano wabizinesi kuti musasinthe zosagwirizana ndi zakale, ndikuzigwiritsa ntchito m'malo mwa zakale poyambitsa zatsopano. Makope akale adzapitirizabe kugwira ntchito “monga poyamba”;
  2. kusamutsa kulimbikira kwa njira zamabizinesi pokonzanso malingaliro abizinesi.

Njira yoyamba ndi yosavuta, koma ili ndi malire ake ndi zovuta zake, mwachitsanzo:

  • kubwereza kwa malingaliro abizinesi mumitundu yambiri yamabizinesi, kukulitsa kuchuluka kwamalingaliro abizinesi;
  • Nthawi zambiri kusintha kwachangu kumalingaliro atsopano abizinesi kumafunika (potengera ntchito zophatikizira - pafupifupi nthawi zonse);
  • wopanga sakudziwa kuti ndi nthawi ziti zitsanzo zakale zitha kuchotsedwa.

Mwakuchita timagwiritsa ntchito njira zonse ziwiri, koma tapanga zisankho zingapo kuti moyo wathu ukhale wosavuta:

  • M'nkhokwe, kulimbikira kwabizinesi kumasungidwa m'mawonekedwe osavuta kuwerenga komanso osinthidwa mosavuta: mumtundu wa JSON. Izi zimalola kusamuka kuchitidwe mkati mwa pulogalamuyo komanso kunja. Monga njira yomaliza, mutha kuyikonza pamanja (makamaka yothandiza pakukula pakuwongolera);
  • Kuphatikizika kwamabizinesi sikugwiritsa ntchito mayina abizinesi, kotero kuti nthawi iliyonse ndikotheka kusinthira kukhazikitsidwa kwa imodzi mwazinthu zomwe zikutenga nawo gawo ndi yatsopano yokhala ndi dzina latsopano (mwachitsanzo, "InitialPlayerV2"). Kumangiriza kumachitika kudzera muuthenga ndi mayina azizindikiro;
  • ndondomekoyi ili ndi nambala yomasulira, yomwe timawonjezera ngati tisintha zosagwirizana ndi chitsanzo ichi, ndipo chiwerengerochi chimasungidwa pamodzi ndi chikhalidwe cha ndondomekoyi;
  • mkhalidwe wolimbikira wa ndondomekoyi umawerengedwa kuchokera ku database choyamba kukhala chitsanzo chosavuta cha chinthu, chomwe njira yosamukira ingagwire ntchito ngati nambala yachitsanzo yasintha;
  • njira yosamuka imayikidwa pafupi ndi ndondomeko ya bizinesi ndipo imatchedwa "waulesi" pazochitika zilizonse za bizinesi panthawi yobwezeretsa kuchokera ku database;
  • ngati mukufuna kusamutsa zochitika zonse mwachangu komanso molumikizana, njira zosinthira zakale zimagwiritsidwa ntchito, koma muyenera kugwira ntchito ndi JSON.

Kodi mukufuna chimango china chanjira zamabizinesi?

Mayankho omwe afotokozedwa m'nkhaniyi adatipatsa mwayi wofewetsa moyo wathu, kukulitsa zovuta zomwe zathetsedwa pakukula kwa ntchito, ndikupanga lingaliro lolekanitsa malingaliro abizinesi kukhala ma microservices okongola kwambiri. Kuti akwaniritse izi, ntchito zambiri zidachitidwa, ndondomeko "yopepuka" kwambiri yoyendetsera bizinesi idapangidwa, komanso zigawo zautumiki kuti zithetse mavuto omwe akudziwika pazochitika za mavuto osiyanasiyana ogwiritsira ntchito. Tili ndi chikhumbo chogawana zotsatira izi ndikupanga chitukuko cha zigawo zofanana kuti zitsegulidwe pansi pa chilolezo chaulere. Izi zidzafuna khama ndi nthawi. Kumvetsetsa kufunikira kwa mayankho otere kungakhale chilimbikitso china kwa ife. M'nkhani yomwe ikufunsidwa, chidwi chochepa kwambiri chimaperekedwa ku mphamvu za chimango chokha, koma zina zimawoneka kuchokera ku zitsanzo zomwe zaperekedwa. Ngati tisindikiza ndondomeko yathu, nkhani ina idzaperekedwa kwa izo. Pakadali pano, tingakhale othokoza ngati mutasiya ndemanga pang'ono poyankha funso:

Ogwiritsa ntchito olembetsedwa okha ndi omwe angatenge nawo gawo pa kafukufukuyu. Lowani muakauntichonde.

Kodi mukufuna chimango china chanjira zamabizinesi?

  • 18,8%Inde, ndakhala ndikuyang'ana chinthu chonga ichi kwa nthawi yaitali

  • 12,5%Ndikufuna kudziwa zambiri za kukhazikitsa kwanu, zitha kukhala zothandiza2

  • 6,2%Timagwiritsa ntchito imodzi mwazinthu zomwe zilipo, koma tikuganiza zosintha1

  • 18,8%Timagwiritsa ntchito imodzi mwazinthu zomwe zilipo, zonse zili bwino3

  • 18,8%timayendetsa popanda chimango3

  • 25,0%lembani zanu4

Ogwiritsa 16 adavota. Ogwiritsa ntchito 7 adakana.

Source: www.habr.com

Kuwonjezera ndemanga