BPM tu'ufa'atasiga tu'ufa'atasia

BPM tu'ufa'atasiga tu'ufa'atasia

Talofa, Sa ta'ua e Habr!

O la matou kamupani e faʻapitoa i le atinaʻeina o fofo faʻapitoa a le ERP-vasega, o le leona o loʻo nofoia e faiga faʻapisinisi ma se aofaʻiga tele o pisinisi faʻatatau ma faʻasalalauga pepa a la EDMS. O fa'aliliuga o lo'o i ai nei oa matou oloa e fa'avae i luga o tekinolosi JavaEE, ae o lo'o matou fa'ata'ita'i malosi fo'i i microservices. O se tasi o itu sili ona fa'afitauli o ia fofo o le tu'ufa'atasia lea o subsystems 'ese'ese o lo'o i totonu o pitonu'u lata ane. O faʻafitauli tuʻufaʻatasia e masani lava ona tatou maua ai le tiga tele, e tusa lava po o le a le fausaga o sitaili, tekinolosi faʻapipiʻi ma faʻavae tatou te faʻaogaina, ae talu ai nei na i ai le alualu i luma i le foia o ia faʻafitauli.

I le tusiga ou te aumaia i lou mafaufau, o le a ou talanoa e uiga i le poto masani ma suʻesuʻega fausaga o loʻo i ai i le NPO "Krista" i le nofoaga atofaina. O le a tatou vaʻavaʻai foʻi i se faʻataʻitaʻiga o se fofo faigofie i se faʻafitauli tuʻufaʻatasia mai le manatu o se tagata faʻapipiʻi talosaga ma saili mea o loʻo natia i tua o lenei faigofie.

Fa'ailoga

O faʻataʻitaʻiga faʻataʻitaʻiga ma faʻamatalaga faʻapitoa o loʻo faʻamatalaina i totonu o le tusiga o loʻo tuʻuina mai e aʻu e faʻavae i luga o le poto masani a le tagata lava ia i le tulaga o galuega faʻapitoa. O nei fofo e le fai mai e lautele ma atonu e le sili ona lelei i lalo o isi tulaga o le faʻaaogaina.

O le a le mea e fai i ai le BPM?

Ina ia taliina lenei fesili, e tatau ona tatou suʻesuʻe loloto teisi i faʻamatalaga patino o faʻafitauli faʻaaogaina oa tatou fofo. O le vaega autu o le pisinisi faʻatatau i la tatou faiga masani fefaʻatauaʻiga o loʻo tuʻuina atu faʻamatalaga i totonu o faʻamaumauga e ala i fesoʻotaʻiga faʻaoga, tusi lesona ma faʻamaonia otometi o lenei faʻamaumauga, faʻatinoina e ala i nisi o galuega, lolomiina i se isi faiga / faʻamaumauga faʻamaumauga / faʻamaumauga, fatuina lipoti . O le mea lea, o le galuega autu a le faiga mo tagata faʻatau o le faʻaogaina o latou faiga pisinisi i totonu.

Mo le faʻafaigofie, matou te faʻaogaina le faaupuga "pepa" i fesoʻotaʻiga e pei o se faʻamatalaga o se seti o faʻamaumauga tuʻufaʻatasia e se ki masani e mafai ai ona "sootai" se faʻasologa o galuega.
Ae fa'afefea le manatu fa'atasi? A uma mea uma, o le tuʻufaʻatasiga galuega e faʻatupuina e le fausaga o le faiga, lea e "tipi" i ni vaega E LEʻI i luga o le talosaga a le tagata faʻatau, ae i lalo o le faatosinaga a mea eseese:

  • i lalo o le tulafono a Conway;
  • o se taunuuga o le toe faʻaaogaina o subsystems na fausia muamua mo isi oloa;
  • i le faitalia a le tufuga, e fa'atatau i mana'oga e le fa'atinoina.

O loʻo i ai se faʻaosoosoga tele e vavae ese le faʻaogaina o manatu mai le pisinisi pisinisi o le galuega autu, ina ia aua neʻi faʻaleagaina le faʻaogaina o pisinisi faʻatasi ai ma mea faʻapipiʻi tuʻufaʻatasia ma faʻamalolo ai le tagata faʻapipiʻi talosaga mai le manaʻoga e suʻesuʻe i faʻamatalaga patino o le fausaga fausaga o le faiga. O lenei faiga e iai le tele o mea lelei, ae o le faʻataʻitaʻiga e faʻaalia ai lona le aoga:

  • foia faʻafitauli tuʻufaʻatasia e masani lava ona toe foʻi i tua i filifiliga sili ona faigofie i le tulaga o fesoʻotaʻiga fesoʻotaʻiga ona o le faʻatapulaʻaina o vaega faʻalauteleina i le faʻatinoga o le galuega autu (o le le lelei o le tuʻufaʻatasiga faʻatasi o loʻo talanoaina i lalo);
  • tu'ufa'atasiga tu'ufa'atasiga o lo'o a'afia pea i manatu autu pisinisi pe a mana'omia ni fa'amatalaga mai se isi faiga fa'avae;
  • e le amana'ia e le tagata fa'apipi'i talosaga le tu'ufa'atasiga ma e faigofie ona motusia e ala i le suia o le galuega;
  • o le faiga e le toe avea ma se tasi atoa mai le manatu o le tagata e faaaogāina, "suiga" i le va o subsystems e avea ma iloa, ma le toe faia o tagata faaaoga e aliali mai, amataina le fesiitaiga o faamatalaga mai le tasi subsystem i le isi.

O le isi auala o le mafaufau lea i fegalegaleaiga tuʻufaʻatasia o se vaega taua o le manatu autu pisinisi ma le faʻaogaina o galuega. Ina ia taofia le fa'atupuina o tusi pasi mai le si'itia, o le fa'atupuina o feso'ota'iga tu'ufa'atasiga fou e tatau ona faigofie ma leai se taumafaiga, ma sina avanoa e filifili ai se fofo. E sili atu le faigata ona fai nai lo le mea e foliga mai: o le meafaigaluega e tatau ona lava le malosi e tuʻuina atu ai i le tagata faʻaoga le manaʻomia o filifiliga eseese mo lona faʻaaogaina, e aunoa ma le faʻatagaina o ia e "fanaina o ia i le vae." E tele fesili e tatau ona taliina e se inisinia i le tulaga o galuega tuʻufaʻatasia, ae e le tatau ona mafaufau i ai se tagata faʻapipiʻi talosaga i ana galuega i aso taʻitasi: tuaoi o fefaʻatauaiga, tutusa, atomicity, saogalemu, scaling, uta ma le tufatufaina o punaoa, taʻavale, faʻatautaia, tufatufaina ma fesuia'i tulaga, ma isi. E tatau ona ofoina atu i le au atina'e talosaga ni fa'ata'ita'iga faigofie o fofo lea ua natia ai tali i ia fesili uma. O nei faʻataʻitaʻiga e tatau ona matua saogalemu: suiga faʻapisinisi e masani ona suia, lea e faʻateleina ai le lamatiaga o le faʻaalia o mea sese, o le tau o mea sese e tatau ona tumau i se tulaga maualalo.

Ae o le a le mea e fai i ai le BPM? E tele avanoa mo le fa'atinoina o galuega...
O le mea moni, o le isi faʻatinoga o faiga faʻapisinisi e sili ona lauiloa i a tatou fofo - e ala i le faʻamatalaga faʻamatalaga o se faʻataʻitaʻiga suiga o le setete ma le fesoʻotaʻiga o tagata faʻatautaia ma faʻamatalaga pisinisi mo suiga. I lenei tulaga, o le setete e fuafuaina le tulaga o loʻo i ai nei o le "pepa" i le pisinisi pisinisi o se uiga o le "pepa" lava ia.

BPM tu'ufa'atasiga tu'ufa'atasia
O le mea lea e foliga mai o le faagasologa i le amataga o se poloketi

O le taʻutaʻua o lenei faʻatinoga e mafua ona o le faigofie ma le saoasaoa o le fatuina o faiga pisinisi laina. Peita'i, a'o fa'aauau pea ona lavelave faiga fa'akomepiuta, o le vaega otometi o le fa'agasologa o pisinisi e fa'atupula'ia ma fa'alavelave. O loʻo manaʻomia le faʻaleagaina, toe faʻaaogaina o vaega o faʻagasologa, faʻapea foʻi ma faʻagasologa faʻasolosolo ina ia faʻatinoina lala taʻitasi i le tutusa. I lalo o ia tulaga, o le meafaigaluega e le faigofie, ma o le faʻasologa o suiga o le setete e leiloa ana faʻamatalaga faʻamatalaga (o fegalegaleaiga faʻatasi e le o atagia i le ata).

BPM tu'ufa'atasiga tu'ufa'atasia
E fa'apea le fa'agasologa o le fa'agasologa pe a mae'a le tele o fa'amatalaga o mana'oga fa'amalamalamaga.

O le auala e alu ese ai mai lenei tulaga o le tuufaatasia o le afi jBPM i nisi o oloa e sili ona lavelave faiga pisinisi. I se taimi puʻupuʻu, o lenei fofo na i ai se manuia: na mafai ai ona faʻatinoina faiga faʻalavelave faʻapisinisi aʻo tausia se faʻamatalaga talafeagai ma talafeagai i le faʻamatalaga BPMN2.

BPM tu'ufa'atasiga tu'ufa'atasia
O se vaega itiiti o se faiga pisinisi lavelave

I se taimi umi, o le fofo e leʻi ola e tusa ai ma faʻamoemoega: o le maualuga o le galue malosi o le fatuina o pisinisi faʻagasologa e ala i meafaigaluega vaʻaia e leʻi faʻatagaina ai le ausiaina o faʻamaoniga o le gaosiga o oloa, ma o le meafaigaluega lava ia na avea ma se tasi o mea e sili ona le fiafia i ai le au atinaʻe. Sa i ai foi faitioga e uiga i le fausaga o totonu o le afi, lea na mafua ai ona foliga mai o le tele o "patches" ma "tootoo".

O le itu lelei autu o le faʻaaogaina o le jBPM o le faʻalauiloaina lea o faʻamanuiaga ma faʻaleagaina o le i ai o se faiga pisinisi faʻataʻitaʻiga o lona lava tulaga tumau. Na matou vaʻaia foʻi le avanoa e faʻaogaina ai se faiga faʻagasologa e faʻatino ai faʻasalalauga tuʻufaʻatasia lavelave i le va o talosaga eseese e faʻaaoga ai fegalegaleaiga asynchronous e ala i faʻailoga ma feʻau. O le iai o se tulaga tumau e iai sona sao taua i lenei mea.

Faʻavae i luga, e mafai ona tatou faʻauʻuina: O le faʻagasologa o le faiga o le BPM e mafai ai ona tatou foia le tele o galuega e faʻaaogaina ai le faʻatupulaia o pisinisi faʻalavelave, faʻafetaui lelei gaioiga tuʻufaʻatasia i nei faiga ma faʻatumauina le mafai ona faʻaalia le faʻatinoina o le faagasologa i se faʻamatalaga talafeagai.

Le lelei o telefoni faʻatasi e avea o se mamanu tuʻufaʻatasia

Fa'atasi fa'atasi e fa'atatau i le vala'au poloka sili ona faigofie. E tasi le subsystem e galue o le itu o le server ma faʻaalia le API i le auala manaʻomia. O le isi subsystem e galue o le itu o le kalani ma i le taimi sa'o e fai ai se telefoni ma fa'atali mo le i'uga. Fa'alagolago i le fa'atulagaina o faiga, o le kalani ma le 'au'aunaga e mafai ona maua i totonu o le fa'aoga tutusa ma le fa'agasologa, po'o le eseese. I le tulaga lona lua, e tatau ona e faʻaaogaina nisi o faʻatinoga RPC ma tuʻuina atu le faʻavasegaina o tapulaʻa ma le iʻuga o le valaau.

BPM tu'ufa'atasiga tu'ufa'atasia

O lenei faʻataʻitaʻiga tuʻufaʻatasia o loʻo i ai se seti tele o mea le lelei, ae o loʻo faʻaaogaina lautele i le faʻatinoga ona o lona faigofie. O le saoasaoa o le faʻatinoga e faʻafeiloaʻi ma faʻamalosia oe e faʻaaogaina pea lava pea i le feagai ai ma taimi faigata, faʻamaumau le fofo e pei o aitalafu faʻapitoa. Ae e tupu foʻi e faʻaaogaina e le au atinaʻe e leai se poto masani, naʻo le le iloa o aʻafiaga leaga.

I le faʻaopoopoga i le faʻateleina o le faʻateleina o fesoʻotaʻiga i lalo o le system, o loʻo i ai foi faʻafitauli faʻapitoa i le "tuputupu" ma le "faʻalauteleina" fefaʻatauaiga. O le mea moni, afai e faia e le pisinisi pisinisi ni suiga, ona le mafai lea ona aloese mai fefaʻatauaiga, ma o fefaʻatauaiga, i le isi itu, poloka nisi punaoa talosaga e aʻafia i nei suiga. O lona uiga, se'ia o'o ina fa'atali le isi subsystem mo se tali mai le isi, o le a le mafai ona fa'amae'aina le fefa'atauaiga ma aveese loka. O lenei mea e matua faʻateleina ai le lamatiaga o aʻafiaga eseese:

  • Ua leiloa le tali atu o le faiga, o tagata e faʻatali mo se taimi umi mo tali i fesili;
  • e masani lava ona taofia e le server le tali atu i talosaga a tagata ona o le tumu o filo filo: o le tele o filo o loʻo lokaina i luga o se punaoa o loʻo nofoia e se fefaʻatauaiga;
  • Ua amata ona aliali mai faʻalavelave faʻafuaseʻi: o le ono tupu mai e faʻalagolago lava i le umi o fefaʻatauaiga, le aofaʻi o pisinisi faʻatau ma loka o loʻo aʻafia i le fefaʻatauaiga;
  • e aliali mai ni mea sese i le taimi o fefa'atauaiga;
  • le 'auʻaunaga "faʻaletonu" ma OutOfMemory pe afai e manaʻomia e le galuega le faʻaogaina ma le suia o le tele o faʻamaumauga, ma o le i ai o faʻatasi faʻatasi e faigata tele ona vaeluaina le gaioiga i fefaʻatauaiga "mama".

Mai se vaaiga faufale, o le faʻaogaina o le polokaina o telefoni i le taimi o le tuʻufaʻatasia e oʻo atu ai i le leiloa o le puleaina o le lelei o subsystems taʻitasi: e le mafai ona faʻamautinoa le faʻamoemoeina o le lelei o le tasi subsystem i le vavae ese mai faʻailoga lelei o le isi subsystem. Afai o subsystems e atiaʻe e 'au eseese, o se faʻafitauli tele lea.

E sili atu le manaia o mea pe a fai o loʻo tuʻufaʻatasia vaega laiti o loʻo i totonu o talosaga eseese ma e manaʻomia le faia o suiga faʻatasi i itu uma e lua. E faʻapefea ona faʻamautinoa le faʻatauga o nei suiga?

Afai e faia suiga i fefaʻatauaʻiga eseese, ona e manaʻomia lea e tuʻuina atu faʻamaonia tuusaunoaga taulimaina ma taui, ma o lenei mea e faʻaumatia atoa ai le aoga autu o tuʻufaʻatasiga faʻatasi - faigofie.

O fefaʻatauaiga faʻasalalau e oʻo mai foi i le mafaufau, ae matou te le faʻaaogaina ia matou fofo: e faigata ona faʻamautinoa le faʻamaoni.

"Saga" o se fofo i le faʻafitauli tau fefaʻatauaiga

Faatasi ai ma le faatupulaia o le lauiloa o microservices, o le manaoga mo Mamanu Saga.

O lenei mamanu e foia atoatoa ai faafitauli o loʻo taʻua i luga o fefaʻatauaiga umi, ma faʻalauteleina ai le gafatia o le puleaina o le tulaga o le faiga mai le itu o le pisinisi faʻatauvaʻa: taui pe a maeʻa se fefaʻatauaiga ua le mafai ona toe faʻafoʻi le faiga i lona tulaga muamua, ae tuʻuina atu. se isi auala e fa'agasolo ai fa'amaumauga. Ole mea lea e mafai ai ona e aloese mai le toe faia ma le manuia faʻamaeʻaina faʻasologa o faʻamaumauga pe a taumafai e aumai le faagasologa i se faʻaiʻuga "lelei".

O le mea e malie ai, i faiga monolithic e talafeagai foi lenei mamanu pe a oʻo mai i le tuʻufaʻatasia o vaega laiti faʻatasi ma aʻafiaga leaga e mafua mai i fefaʻatauaiga umi ma loka punaoa talafeagai e matauina.

E tusa ai ma a tatou faiga pisinisi i le BPM style, e foliga mai e matua faigofie lava le faʻatinoina o le "Sagas": o laasaga taʻitasi o le "Saga" e mafai ona faʻamaonia o ni gaioiga i totonu o le pisinisi, ma le tulaga faifaipea o le pisinisi pisinisi foi. fuafua le tulaga totonu o le "Saga". O lona uiga, matou te le mana'omia so'o se faiga fa'aopoopo fa'aopoopo. Pau lava le mea e te manaʻomia o se fefaʻatauaʻiga feʻau e lagolagoina "ia le itiiti ifo ma le tasi" faʻamaoniga o se felauaiga.

Ae o lenei fofo e iai foi lona lava "tau":

  • ua sili atu ona lavelave le manatu faapisinisi: e manaʻomia ona fai se taui;
  • e tatau ona lafoaʻia le faʻamaoni atoatoa, lea e mafai ona sili ona maaleale mo faiga monolithic;
  • Ua fai si lavelave teisi le fausaga, ma ua aliali mai ai se mana'oga faaopoopo mo se faife'au fe'au;
  • o le a manaʻomia ni mea faigaluega faʻapitoa e mataʻituina ma pulega (e ui o le tulaga lautele e lelei lenei: o le a faʻateleina le lelei o le auaunaga faʻapitoa).

Mo faiga monolithic, o le faʻamaoniga mo le faʻaaogaina o le "Sag" e le o manino. Mo microservices ma isi SOA, lea e foliga mai o loʻo i ai se tagata faʻatau oloa, ma o loʻo tuʻufaʻatasia atoatoa i le amataga o le poloketi, o faʻamanuiaga o le faʻaaogaina o lenei mamanu e mafai ona sili atu nai lo le le lelei, aemaise lava pe afai o loʻo i ai se API talafeagai i le pisinisi pisinisi. tulaga.

Encapsulating manatu pisinisi i microservices

Ina ua amata ona matou faʻataʻitaʻiina i microservices, na tulaʻi mai se fesili talafeagai: o fea e tuʻu ai le faʻaogaina o pisinisi pisinisi e fesoʻotaʻi ma le auaunaga e faʻamautinoa ai le faʻaauau pea o faʻamaumauga a le domain?

Pe a vaʻavaʻai i le fausaga o BPMS eseese, atonu e foliga mai e talafeagai le tuʻufaʻatasia o pisinisi faʻatauvaʻa mai le faʻaauau: fatuina se faʻavae o faʻavae ma vaega-tutoʻatasi microservices e fausia ai se siosiomaga ma pusa mo le faʻatinoina o faʻamatalaga pisinisi, ma mamanuina le faʻaauauina o faʻamatalaga faʻamaumauga e pei o. se isi vaega o auaunaga laiti faigofie ma mama. Fa'agasologa o pisinisi i lenei tulaga e fa'atino ai le fa'atulagaina o au'aunaga o le fa'aputuga tumau.

BPM tu'ufa'atasiga tu'ufa'atasia

O lenei faiga e i ai se aoga tele: e mafai ona e faʻateleina le faʻatinoga o le faʻavae i le tele e te manaʻo ai, ma naʻo le vaega tutusa o microservices platform o le a avea ma "gaʻo" mai lenei mea. O faiga fa'apisinisi mai so'o se vaega e vave ona mafai ona fa'aogaina le galuega fou o le fa'avae i le taimi lava e fa'afou ai.

O se suʻesuʻega faʻapitoa na faʻaalia ai le le lelei tele o lenei auala:

  • o se auaunaga fa'avae e fa'atino ai le fa'atatauga fa'apisinisi o le tele o fa'alapotopotoga i le taimi e tasi o lo'o i ai ni fa'alavelave tetele e pei o se tasi o le fa'aletonu. O suiga faifaipea i mafaufauga faapisinisi e faateleina ai le tulaga lamatia o mea sese e mafua ai le faaletonu o le polokalama;
  • fa'afitauli fa'atinoga: fa'atatau pisinisi e galue ma ana fa'amaumauga e ala i se va'aiga vaapiapi ma fa'agesegese:
    • o faʻamatalaga o le a toe faʻapipiʻiina ma pamu i totonu o le upega o fesoʻotaʻiga;
    • o le a masani ona tu'uina atu e se 'au'aunaga fa'apitoa le tele o fa'amatalaga nai lo le mea e mana'omia mo le fa'aogaina o pisinisi ona o le le lava o le gafatia mo le fa'avasegaina o talosaga ile tulaga ole API i fafo ole auaunaga;
    • le tele o vaega tuto'atasi o pisinisi fa'atatau e mafai ona toe talosagaina fa'amatalaga tutusa mo le fa'agaioiga (o lenei fa'afitauli e mafai ona fa'aitiitia e ala i le fa'aopoopoina o vaega o le sauniga e fa'apipi'i ai fa'amaumauga, ae o lenei mea e atili fa'alavelaveina ai le fausaga ma fa'atupuina ai fa'afitauli o fa'amatalaga talafeagai ma le fa'aleaogaina o le cache);
  • fa'afitauli tau fefa'atauaiga:
    • faiga pisinisi ma tulaga faifai pea, lea e teuina e se auaunaga tulaga, e le ogatasi ma faʻamaumauga faʻamaumauga, ma e leai ni auala faigofie e foia ai lenei faʻafitauli;
    • tu'uina le poloka o fa'amaumauga i fafo atu o le fefa'ataua'iga: afai e mana'omia e le pisinisi fa'atauva'a ona faia ni suiga pe a uma ona siaki muamua le sa'o o fa'amaumauga o lo'o i ai nei, e tatau ona fa'ate'aina le avanoa o se suiga fa'atauva i fa'amaumauga fa'agasolo. O le polokaina o faʻamatalaga mai fafo e mafai ona fesoasoani e foia le faʻafitauli, ae o sea fofo e maua ai faʻalavelave faʻaopoopo ma faʻaitiitia ai le faʻalagolago atoa o le faiga;
  • faʻafitauli faʻaopoopo pe a faʻafouina: i nisi tulaga, o le auaunaga faʻaauau ma le faʻatatau pisinisi e manaʻomia ona faʻafouina faʻatasi poʻo se faʻasologa saʻo.

Mulimuli ane, e tatau ona matou toe foʻi i faʻavae: faʻapipiʻi faʻamaumauga faʻamaumauga ma faʻamatalaga pisinisi pisinisi i totonu o le tasi microservice. O lenei faiga e faʻafaigofie ai le manatu o se microservice o se vaega taua o le faiga ma e le faʻaalia ai faʻafitauli o loʻo i luga. E le maua fua foi lenei mea:

  • E mana'omia le fa'avasegaina o le API mo le fegalegaleai ma manatu fa'apisinisi (aemaise lava, e tu'uina atu ai galuega fa'aoga o se vaega o faiga fa'apisinisi) ma auaunaga fa'avae API; e manaʻomia le faʻaeteete atili i suiga API, fesoʻotaʻiga i luma ma tua;
  • e mana'omia le fa'aopoopoina o faletusi ta'avale fa'aopoopo e fa'amautinoa ai le fa'agaioiina o pisinisi fa'atatau o se vaega o ia auaunaga laiti ta'itasi, ma o lea e tula'i mai ai mana'oga fou mo ia faletusi: mama ma le la'ititi o fa'alagolagoga fa'asolo;
  • e mana'omia e le au atina'e fa'atauva'a pisinisi ona mata'ituina fa'aliliuga a le faletusi: afai e le'i fa'amae'aina se microservice mo se taimi umi, e foliga mai o le a iai se fa'amatalaga tuai o faletusi. E mafai ona avea lenei mea ma fa'alavelave fa'afuase'i i le fa'aopoopoina o se vaega fou ma e ono mana'omia ai le si'itia o le manatu fa'apisinisi tuai o lea auaunaga i fa'aliliuga fou o faletusi pe a iai ni suiga le fetaui i le va o fa'aliliuga.

BPM tu'ufa'atasiga tu'ufa'atasia

O loʻo iai foʻi se vaega o auaunaga faʻavae i totonu o sea fausaga, ae o lenei laulau e le o toe fausia ai se atigipusa mo le faʻatinoina o pisinisi pisinisi, ae naʻo lona siosiomaga, e tuʻuina atu ai galuega fesoasoani "platform". E mana'omia se fa'apena e le gata ina ia fa'atumauina ai le mama mama ole vaega ole microservices, ae fa'apea fo'i ile fa'atotonugalemu o le pulega.

Mo se faʻataʻitaʻiga, o gaioiga a tagata faʻaoga i faiga faʻapisinisi e maua ai galuega. Ae peitaʻi, pe a galue i galuega, e tatau i le tagata faʻaoga ona vaʻai i galuega mai vaega uma i le lisi lautele, o lona uiga e tatau ona i ai se auaunaga faʻamautu galuega faʻatulagaina, faʻamalo mai le faʻaogaina o pisinisi pisinisi. O le fa'atumauina o le fa'avasegaina o manatu fa'apisinisi i se tulaga fa'apea e fai si fa'afitauli, ma o le isi lea fetuutuuna'iga o lenei fausaga.

Tu'ufa'atasiga o faiga fa'apisinisi e ala i mata o se tagata fa'apipi'i talosaga

E pei ona taʻua i luga, e tatau ona aveese le tagata e faia talosaga mai le tulaga faʻainisinia ma faʻainisinia o le faʻatinoina o fegalegaleaiga o le tele o talosaga ina ia mafai ai e se tasi ona faʻamoemoe i le gaosiga lelei o atinaʻe.

Sei o tatou taumafai e foia se faʻafitauli faigata tuʻufaʻatasia, faʻapitoa faʻapitoa mo le tusiga. Ole a avea lea ma se "taaloga" galuega e aofia ai ni talosaga se tolu, lea e faʻamatalaina ai e latou taʻitasi se igoa faʻapitoa: "app1", "app2", "app3".

I totonu o talosaga taʻitasi, o loʻo faʻalauiloaina pisinisi e amata ona "taʻalo polo" e ala i le pasi tuʻufaʻatasia. O fe'au e iai le igoa "Polo" o le a avea ma polo.

Tulafono o le taaloga:

  • o le tagata taalo muamua o le amataga. Na te valaaulia isi tagata taaalo i le taaloga, amata le taaloga ma mafai ona faamutaina i soo se taimi;
  • o isi tagata taaalo latou te tautino atu lo latou auai i le taaloga, "ia iloa" e le tasi le isi ma le tagata taalo muamua;
  • a uma ona maua le polo, ona filifili lea e le tagata taalo se isi tagata taalo e auai ma pasi atu le polo ia te ia. Le aofa'i o fa'asalalauga e faitaulia;
  • E tofu tagata ta'alo ma "malosi" e fa'aitiitia i pasi ta'itasi o le polo a le tagata ta'alo. A uma le malosi, ona alu ese lea o le tagata taalo mai le taaloga, ma faailoa atu lona faamavae;
  • afai e tuua na o le tagata taalo, e vave lava ona ia faailoa atu lona alu ese;
  • A fa'ate'a uma ta'aalo, e ta'u atu e le tagata ta'amua ua uma le ta'aloga. Afai na te tuua vave le taaloga, e tumau pea o ia e mulimuli i le taaloga e faauma ai.

Ina ia foia lenei faʻafitauli, o le a ou faʻaogaina la matou DSL mo pisinisi faʻagasologa, lea e mafai ai ona matou faʻamatalaina le faʻaogaina i Kotlin faʻatasi, faʻatasi ai ma le laʻititi o le boilerplate.

O le pisinisi pisinisi a le tagata taalo muamua (aka le amataga o le taaloga) o le a galue i le app1 talosaga:

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

I le faʻaopoopoga i le faʻatinoina o pisinisi, o le tulafono o loʻo i luga e mafai ona maua ai se faʻataʻitaʻiga faʻataʻitaʻiga o se pisinisi pisinisi, lea e mafai ona faʻaalia i foliga o se ata. Matou te leʻi faʻatinoina le vaʻaia, o lea e tatau ai ona matou faʻaalu sina taimi e tusi ai (iinei na ou faʻafaigofieina le faʻamatalaga BPMN e uiga i le faʻaogaina o faitotoʻa e faʻaleleia atili ai le tutusa o le ata ma le tulafono ua tuʻuina atu):

BPM tu'ufa'atasiga tu'ufa'atasia

app2 o le a aofia ai le pisinisi pisinisi a le isi tagata taalo:

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

Ata:

BPM tu'ufa'atasiga tu'ufa'atasia

I le app3 talosaga o le a matou faia se tagata taʻalo e fai sina uiga ese: nai lo le filifilia faʻafuaseʻi o le isi tagata taalo, o le a ia galue e tusa ai ma le round-robin algorithm:

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

A leai, e le ese le amio a le tagata taalo mai le muamua, o lea e le suia ai le ata.

O lea la e mana'omia se su'ega e fa'atino uma ai nei mea. O le a ou tuʻuina atu naʻo le faʻailoga o le suʻega lava ia, ina ia aua neʻi faʻapipiʻiina le tusiga i se pusa (o le mea moni, na ou faʻaogaina le siosiomaga o suʻega na faia muamua e suʻe ai le tuʻufaʻatasia o isi pisinisi pisinisi):

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

Sei o tatou faia le suʻega ma vaʻai i le ogalaau:

fa'amafanafanaga galuega

Взята блокировка ключа 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!

Mai nei mea uma e mafai ona tatou maua ni fa'ai'uga taua:

  • faʻatasi ai ma meafaigaluega talafeagai, e mafai e tagata faʻapipiʻi talosaga ona fatuina fegalegaleaiga tuʻufaʻatasia i le va o talosaga e aunoa ma le faʻalavelaveina o faʻamatalaga pisinisi;
  • o le lavelave o se galuega tu'ufa'atasiga e mana'omia ai tomai fa'ainisinia e mafai ona natia i totonu o le fa'ava'a pe'ā fa'aulu muamua i totonu o le fausaga o le fa'avae. O le faigata o se faʻafitauli e le mafai ona natia, o lea o le fofo i se faʻafitauli faigata i le code o le a foliga mai;
  • Pe a atiaʻe manatu faʻapipiʻi, e manaʻomia le amanaʻia o le tutusa ma le leai o se laina laina o suiga i le tulaga o tagata auai uma. O lenei mea e faʻamalosia ai i tatou e faʻalavelaveina le manatu ina ia faʻafefe i le faʻasologa o mea e tutupu i fafo. I la tatou faʻataʻitaʻiga, e faʻamalosia le tagata taʻalo e auai i le taʻaloga pe a uma ona ia faʻaalia lona alu ese mai le taʻaloga: o isi tagata taʻalo o le a faʻaauau pea ona pasi atu le polo ia te ia seia oʻo i le faʻamatalaga e uiga i lona alu ese ma faʻatautaia e tagata auai uma. O lenei manatu e le mulimulitaʻi mai tulafono o le taʻaloga ma o se fofo fetuutuunai i totonu o le faʻavae o le fausaga filifilia.

Sosoo ai, o le a tatou talanoa e uiga i le lavelave eseese o la tatou fofo, fetuunaiga ma isi manatu.

O fe'au uma o lo'o i totonu o le laina e tasi

O fa'aoga tu'ufa'atasi uma e galulue fa'atasi ma le tasi pasi tu'ufa'atasiga, lea e tu'uina atu i le tulaga o se faioloa i fafo, tasi le BPMQueue mo fe'au ma le tasi BPMTopic autu mo fa'ailoga (mea tutupu). O le tu'uina atu o fe'au uma i le laina e tasi, o se fetuutuuna'i. I le tulaga tau pisinisi, e mafai nei ona e faʻalauiloa le tele o ituaiga feʻau fou e te manaʻo ai e aunoa ma le faia o suiga i le fausaga o le faiga. O se fa'afaigofie tele lea, ae o lo'o i ai ni fa'alavelave fa'apitoa, lea i le tulaga oa tatou galuega masani e foliga mai e le taua tele ia i tatou.

BPM tu'ufa'atasiga tu'ufa'atasia

Ae ui i lea, o loʻo i ai se faʻamatalaga faʻapitoa iinei: o talosaga taʻitasi e faʻamamāina "ana" savali mai le laina i le faitotoa, i le igoa o lona vaega. E mafai foi ona faʻamaonia le vaega i faʻailoga pe afai e te manaʻomia le faʻatapulaʻaina o le "lautele o le vaʻaia" o le faailo i se tasi talosaga. O lenei mea e tatau ona faʻateleina ai le pasi, ae o le pisinisi pisinisi e tatau nei ona faʻaogaina i igoa ole igoa: mo le faʻasalalauina o feʻau - faʻamalosia, mo faʻailoga - manaʻomia.

Fa'amautinoaina le Fa'atuatuaina o Pasi Tu'ufa'atasi

O le faʻamaoni e aofia ai ni nai vaega:

  • O le tagata e faia fefa'ataua'iga o fe'au filifilia o se vaega taua o le fausaga ma se tasi itu o le toilalo: e tatau ona lava le fa'apalepale masei. E tatau ona e faʻaaogaina naʻo faʻataʻitaʻiga faʻataʻitaʻi taimi, ma le lagolago lelei ma se faʻalapotopotoga tele;
  • e manaʻomia le faʻamautinoaina o le maualuga o le avanoa o le tagata fai fefaʻatauaʻiga, lea e tatau ona vavae ese mai le tino mai faʻaoga tuʻufaʻatasia (maualuga le maua o talosaga ma faʻaoga pisinisi faʻatatau e sili atu ona faigata ma taugata e faʻamautinoa);
  • e tatau i le tagata fai pisinisi ona tu'uina atu "ia le itiiti ifo ma le tasi" fa'amaoniga o le tu'uina atu. Ole mana'oga fa'atulafonoina lea mo le fa'atinoina fa'atuatuaina ole pasi tu'ufa'atasi. E leai se mea e manaʻomia mo le "tasi tonu" faʻamautinoaga tulaga: pisinisi pisinisi, e pei o se tulafono, e le maaleale i le toe oʻo mai o feʻau poʻo mea na tutupu, ma i galuega faʻapitoa e taua tele, e sili atu ona faigofie le faʻaopoopoina o siaki faaopoopo i le pisinisi. manatu nai lo le fa'aaogaina pea lava pea o fa'amaoniga "taugata";
  • o le auina atu o fe'au ma faailo e tatau ona aofia ai i se fefa'ataua'iga lautele ma suiga i le tulaga o faiga fa'apisinisi ma fa'amaumauga a le vaega. O le filifiliga e sili ona lelei o le faʻaaogaina lea o se mamanu Pusa fafo Fefa'ataua'iga, ae o le a manaʻomia se laulau faʻaopoopo i totonu o faʻamaumauga ma se toe fai. I talosaga a le JEE, e mafai ona faafaigofieina lenei mea e ala i le faʻaaogaina o se pule o le JTA i le lotoifale, ae o le fesoʻotaʻiga i le tagata fai pisinisi filifilia e tatau ona mafai ona galue i totonu. XA;
  • e tatau fo'i ona galulue fa'atasi ma fe'au o lo'o o'o mai ma mea e tutupu i se fefa'ataua'iga e suia ai le tulaga o se faiga fa'apisinisi: afai e toe fa'afo'i atu sea fefa'ataua'iga, e tatau loa ona fa'aleaogaina le mauaina o le fe'au;
  • o fe'au e le'i mafai ona tu'uina atu ona o mea sese e tatau ona teuina i se isi mea e teu ai D.L.Q. (Tili Tusi Mate). Mo lenei fa'amoemoe, na matou faia ai se fa'avae tu'ufa'atasi microservice e teu ai ia fe'au i lona teuina, fa'asino i uiga (mo le fa'avasega vave ma le su'esu'ega), ma fa'aalia se API mo le va'aiga, toe lafo i le tuatusi taunu'u, ma le tapeina o fe'au. E mafai e fa'atonu fa'atonu ona galulue fa'atasi ma lenei 'au'aunaga e ala i la latou 'upega tafa'ilagi;
  • i totonu o le au fai pisinisi, e tatau ona e fetuutuunai le numera o toe faʻafeiloaʻi ma faʻatuai i le va o tiliva ina ia faʻaitiitia ai le avanoa o feʻau e oʻo atu i totonu o le DLQ (e toetoe lava a le mafai ona faʻatusatusa le sili ona lelei, ae e mafai ona e galue faʻamalosi ma fetuunai i le taimi o le taotoga. );
  • E tatau ona mata'ituina pea le faleoloa o le DLQ, ma e tatau i le faiga o le mata'itūina ona fa'ailoa le fa'atonuina o le faiga ina ia o'o mai fe'au e le'i tu'uina atu, e mafai ona latou tali vave atu. O lenei mea o le a faʻaitiitia ai le "aʻafiaga o le aʻafiaga" o se toilalo poʻo se mea sese faʻatau pisinisi;
  • o le pasi tu'ufa'atasiga e tatau ona le mautonu i le toesea le tumau o talosaga: o le lesitala i se autu e tatau ona umi, ma le igoa ole igoa ole talosaga e tatau ona tulaga ese ina ia a'o toesea le talosaga, o le a le taumafai se isi e fa'agasolo ana fe'au mai le laina.

Faʻamautinoaina le saogalemu o filo o faʻamatalaga pisinisi

Ole fa'ata'ita'iga lava lea ole faiga pisinisi e mafai ona maua ni fe'au ma mea e tutupu i le taimi e tasi, o le faagasologa o le a amata tutusa. I le taimi lava e tasi, mo se tagata faʻapipiʻi talosaga, o mea uma e tatau ona faigofie ma saogalemu-saogalemu.

O le fa'atatauga fa'apisinisi o se fa'agasologa o lo'o fa'agasolo ai fa'alavelave ta'itasi i fafo e a'afia ai le fa'agasologa o pisinisi ta'ito'atasi. O mea faapena e mafai ona:

  • fa'alauiloaina o se faiga fa'apisinisi;
  • tagata fa'aoga gaioiga e feso'ota'i ma gaioiga i totonu o se fa'agasologa pisinisi;
  • mauaina o se fe'au po'o se fa'ailo o lo'o fa'amauina ai se fa'ata'ita'iga fa'apisinisi;
  • fa'aosoina o se taimi fa'atulagaina e se fa'ata'ita'iga fa'agaioiga pisinisi;
  • fa'atonuga e ala ile API (fa'ata'ita'iga, fa'alavelave fa'agasolo).

O ia mea e tutupu e mafai ona suia ai le tulaga o se faʻataʻitaʻiga pisinisi faʻataʻitaʻiga: o nisi gaioiga e mafai ona muta ae o isi e mafai ona amata, ma e ono suia le tau o meatotino tumau. O le tapunia o so'o se gaioiga e mafai ona fa'agaoioia ai se tasi pe sili atu o gaioiga nei. O i latou, i le isi itu, e mafai ona taofi le faʻatali mo isi mea tutupu pe, afai latou te le manaʻomia ni faʻamatalaga faaopoopo, e mafai ona faʻamaeʻaina i le fefaʻatauaiga tutusa. Aʻo leʻi tapunia le fefaʻatauaʻiga, o le tulaga fou o le pisinisi pisinisi o loʻo faʻasaoina i totonu o faʻamaumauga, lea o le a faʻatali mo le isi mea i fafo e tupu.

O fa'amaumauga fa'agasolo pisinisi faifaipea o lo'o teuina i totonu o fa'amaumauga tu'ufa'atasiga ose nofoaga e sili ona faigofie mo le fa'agaoioiga o gaioiga pe afai e te fa'aogaina FILIFILI MO FA'AIGA. Afai na mafai e se tasi fefaʻatauaiga ona maua le tulaga o se pisinisi pisinisi mai le faavae mo le suia, ona leai lea o se isi fefaʻatauaiga tutusa o le a mafai ona maua le tulaga tutusa mo se isi suiga, ma a maeʻa le fefaʻatauaiga muamua, o le lona lua o le fa'amaonia e maua le tulaga ua uma ona suia.

Faʻaaogaina loka faʻaletonu i le itu DBMS, matou te faʻataunuʻuina uma manaʻoga manaʻomia ACID, ma fa'atumauina fo'i le agava'a e fa'afua ai le talosaga ma le fa'atauva'a pisinisi e ala i le fa'ateleina o le numera o fa'ata'ita'iga.

Ae ui i lea, o loka fa'aletonu e fa'amata'u ai i tatou i le fa'aletonu, o lona uiga o le FILIFILI MO FA'AIGA E tatau lava ona fa'atapula'aina i nisi taimi talafeagai ina ne'i tupu fa'alavelave i nisi o mataupu mata'utia i le fa'atatau o pisinisi.

O le isi faʻafitauli o le faʻamaopoopoina o le amataga o se pisinisi pisinisi. E ui e leai se faʻataʻitaʻiga o se pisinisi pisinisi, e leai se setete i totonu o faʻamaumauga, o lea o le a le aoga le auala faʻamatalaina. Afai e te manaʻomia le faʻamautinoaina o le tulaga ese o se faʻataʻitaʻiga pisinisi i se tulaga faʻapitoa, ona e manaʻomia lea o se ituaiga o mea faʻapipiʻi e fesoʻotaʻi ma le vasega faʻagasologa ma le lautele tutusa. Ina ia foia lenei faʻafitauli, matou te faʻaogaina se masini loka ese e mafai ai ona matou lokaina se punaoa faʻapitoa e faʻamaonia e se ki i le URI format e ala i se auaunaga i fafo.

I a matou faʻataʻitaʻiga, o le InitialPlayer pisinisi faʻagasologa o loʻo i ai se taʻutinoga

uniqueConstraint = UniqueConstraints.singleton

O le mea lea, o le ogalaau o loʻo i ai feʻau e uiga i le aveina ma le tatalaina o le loka o le ki fetaui. E leai ni fe'au fa'apea mo isi faiga pisinisi: uniqueConstraint e le'i setiina.

Faʻafitauli o faiga faʻapisinisi ma le tulaga faifai pea

O nisi taimi o le i ai o se tulaga tumau e le gata e fesoasoani, ae e matua faʻalavelave foi i le atinaʻe.
E amata fa'afitauli pe a mana'omia ona fai ni suiga ile fa'atatau o pisinisi ma/po'o le fa'ata'ita'iga o faiga fa'apisinisi. E le o tutusa uma ia suiga ma le tulaga tuai o faiga pisinisi. Afai e tele taimi ola i totonu o faʻamaumauga, ona faia lea o suiga le fetaui e mafai ona mafua ai le tele o faʻalavelave, lea e masani ona matou feagai pe a faʻaaoga le jBPM.

Faʻalagolago i le loloto o suiga, e mafai ona e galue i ni auala se lua:

  1. fatuina se ituaiga faiga pisinisi fou ina ia aua nei faia ni suiga le fetaui i le mea tuai, ma faʻaaoga nai lo le mea tuai pe a faʻalauiloa mea fou. O kopi tuai o le a faaauau pea ona galue "pei o le taimi muamua";
  2. femalaga'i le tulaga faifai pea o faiga fa'apisinisi pe a fa'afou le fa'atatau o pisinisi.

O le auala muamua e faigofie, ae o loʻo i ai ona tapulaʻa ma faʻaletonu, mo se faʻataʻitaʻiga:

  • fa'aluaina o fa'atauga fa'apisinisi i le tele o fa'ata'ita'iga fa'agasologa o pisinisi, fa'ateleina le tele o fa'atatau pisinisi;
  • E masani ona manaʻomia se suiga vave i pisinisi fou (i tulaga o galuega tuʻufaʻatasia - toetoe lava o taimi uma);
  • e le iloa e le atinaʻe poʻo le a le taimi e mafai ai ona tapeina faʻataʻitaʻiga tuai.

I le faʻataʻitaʻiga matou te faʻaogaina auala uma e lua, ae ua matou faia ni filifiliga e faʻafaigofie ai o matou olaga:

  • I totonu o faʻamaumauga, o le tulaga faifaipea o se pisinisi pisinisi o loʻo teuina i se faʻaoga faigofie ma faigofie ona faʻaogaina: i totonu o se manoa JSON format. Ole mea lea e mafai ai ona fa'atino femalagaiga i totonu ole talosaga ma fafo. I le tulaga mulimuli, e mafai ona e faʻasaʻo ma le lima (aemaise lava le aoga i le atinaʻe i le taimi o le debugging);
  • e le faʻaogaina e le faʻaogaina pisinisi faʻamatalaga igoa o pisinisi pisinisi, ina ia mafai ai i soo se taimi ona sui le faʻatinoga o se tasi o faʻagasologa o loʻo auai i se mea fou ma se igoa fou (mo se faʻataʻitaʻiga, "InitialPlayerV2"). O le fusia e tupu e ala i le savali ma igoa faailo;
  • o le faʻataʻitaʻiga faʻataʻitaʻiga o loʻo i ai se numera faʻasologa, lea tatou te faʻatuputeleina pe a tatou faia ni suiga le fetaui i lenei faʻataʻitaʻiga, ma o lenei numera e faʻasaoina faʻatasi ma le tulaga o le faʻataʻitaʻiga;
  • o le tulaga faifai pea o le faagasologa o loʻo faitau muamua mai le faʻamaumauga i totonu o se faʻataʻitaʻiga mea faʻaoga talafeagai, lea e mafai ona galue le faiga o femalagaiga pe afai ua suia le numera faʻataʻitaʻiga;
  • o le faʻasologa o femalagaiga o loʻo tuʻuina i tafatafa o le pisinisi pisinisi ma e taʻua o le "paie" mo faʻataʻitaʻiga taʻitasi o le pisinisi i le taimi o lona toe faʻaleleia mai le database;
  • afai e te manaʻomia le faʻafeiloaʻi vave ma faʻatasi le tulaga o faʻagasologa faʻasologa, sili atu faʻamatalaga faʻamatalaga femalagaiga fofo e faʻaaogaina, ae e tatau ona e galue ma JSON.

E te mana'omia se isi auivi mo faiga fa'apisinisi?

O fofo o loʻo faʻamatalaina i totonu o le tusiga na faʻatagaina ai i matou e faʻafaigofie tele o matou olaga, faʻalautele le tele o mataupu e foia i le tulaga o le atinaʻeina o talosaga, ma faia le manatu o le vavaeeseina o pisinisi pisinisi i microservices sili atu ona manaia. Ina ia ausia lenei mea, o le tele o galuega na faia, o se faʻatulagaga sili ona "mama" mo faiga faʻapisinisi na faia, faʻapea foʻi ma vaega o auaunaga e foia ai faʻafitauli faʻamaonia i le tulaga o le tele o faʻafitauli faʻaoga. O lo'o i ai so matou mana'oga e fa'asoa nei taunu'uga ma faia le atina'eina o vaega masani e tatala avanoa i lalo o se laisene e leai se totogi. O lenei mea o le a manaʻomia ai sina taumafaiga ma taimi. O le malamalama i le manaoga mo ia fofo e mafai ona avea ma se faaosofiaga faaopoopo mo i tatou. I totonu o le tusiga fuafuaina, e itiiti lava le gauai atu i le gafatia o le auivi lava ia, ae o nisi oi latou o loʻo vaaia mai faʻataʻitaʻiga na tuʻuina atu. Afai tatou te fa'asalalauina la tatou auivi, o le a tu'uina atu se isi tusitusiga i ai. I le taimi nei, matou te faʻafetai pe afai e te tuʻuina sina faʻamatalaga e ala i le taliina o le fesili:

Na'o tagata fa'aigoaina e mafai ona auai i le su'esu'ega. Saini ese j, faʻamolemole.

E te mana'omia se isi auivi mo faiga fa'apisinisi?

  • 18,8%Ioe, ua leva ona ou su'eina se mea faapena

  • 12,5%Ou te fia a'oa'o atili i lau fa'atinoga, atonu e aoga2

  • 6,2%Matou te fa'aogaina se tasi o fa'avae o lo'o iai, ae o lo'o mafaufau e sui1

  • 18,8%Matou te faʻaogaina se tasi o faʻavae o loʻo iai, o loʻo lelei mea uma3

  • 18,8%matou te pulea e aunoa ma se auivi3

  • 25,0%tusi lau4

16 tagata fa'aoga na palota. 7 tagata fa'aoga na le fa'aaogaina.

puna: www.habr.com

Faaopoopo i ai se faamatalaga