Hoʻohui kaila BPM

Hoʻohui kaila BPM

Hui, Habr!

Kūleʻa kā mākou hui i ka hoʻomohala ʻana i nā hāmeʻa polokalamu ERP-class, ʻo ka hapa liona i noho ʻia e nā ʻōnaehana transactional me ka nui o ka loiloi ʻoihana a me ka kahe palapala a la EDMS. Hoʻokumu ʻia nā mana o kēia manawa o kā mākou huahana i nā ʻenehana JavaEE, akā ke hoʻāʻo ikaika nei mākou me nā microservices. ʻO kekahi o nā wahi pilikia loa o ia mau hoʻonā ʻana, ʻo ia ka hoʻohui ʻana o nā subsystem like ʻole e pili ana i nā kikowaena pili. ʻO nā pilikia hoʻohui i hāʻawi mau iā mākou i kahi poʻo nui, me ka nānā ʻole i ke ʻano o ka hoʻolālā ʻana, nā ʻenehana a me nā papa hana a mākou e hoʻohana ai, akā i kēia manawa ua holomua ka hoʻoponopono ʻana i ia mau pilikia.

Ma ka ʻatikala aʻu e lawe ai i kou manaʻo, e kamaʻilio wau e pili ana i ka ʻike a me ka noiʻi hoʻolālā ʻana i loaʻa iā NPO Krista ma kahi i koho ʻia. E nānā pū mākou i kahi laʻana o kahi hoʻonā maʻalahi i kahi pilikia hoʻohui mai ka manaʻo o kahi mea hoʻomohala noi a ʻike i ka mea i hūnā ʻia ma hope o kēia maʻalahi.

Hoʻolele

ʻO nā hana hoʻolālā a me nā ʻenehana i wehewehe ʻia i loko o ka ʻatikala ua noi ʻia e aʻu e pili ana i ka ʻike pilikino i ka pōʻaiapili o nā hana kikoʻī. ʻAʻole ʻōlelo kēia mau hoʻonā i ke ao holoʻokoʻa a ʻaʻole maikaʻi paha ma lalo o nā kūlana hoʻohana ʻē aʻe.

He aha ka pili o ka BPM me ia?

No ka pane ʻana i kēia nīnau, pono mākou e ʻimi hohonu i nā kikoʻī o nā pilikia i hoʻopili ʻia o kā mākou hoʻonā. ʻO ka ʻāpana nui o ka loiloi pāʻoihana i kā mākou ʻōnaehana transactional maʻamau ke komo ʻana i ka ʻikepili i loko o ka waihona ma o nā mea hoʻohana, ka manual a me ka hōʻoia automated o kēia ʻikepili, e lawe ana ma o kekahi workflow, e hoʻolaha ana i kahi ʻōnaehana / analytical database / archive, e hana ana i nā hōʻike. . No laila, ʻo ka hana koʻikoʻi o ka ʻōnaehana no nā mea kūʻai aku ʻo ka automation o kā lākou ʻoihana ʻoihana kūloko.

No ka maʻalahi, hoʻohana mākou i ka huaʻōlelo "palapala" ma ke kamaʻilio ʻana ma ke ʻano he abstraction o kahi pūʻulu ʻikepili i hoʻohui ʻia e kahi kī maʻamau i hiki ke "hoʻopili ʻia" kekahi kaila hana.
Akā, pehea e pili ana i ka loiloi hoʻohui? Ma hope o nā mea a pau, hana ʻia ka hana hoʻohui e ka hoʻolālā ʻana o ka ʻōnaehana, i "ʻoki ʻia" i nā ʻāpana NOT ma ke noi a ka mea kūʻai aku, akā ma lalo o ka mana o nā kumu like ʻole:

  • malalo o ke kanawai o Conway;
  • ma muli o ka hoʻohana hou ʻana i nā subsystem i kūkulu mua ʻia no nā huahana ʻē aʻe;
  • ma ka manaʻo o ka mea kākau, e pili ana i nā koi non-functional.

Aia kahi ho'āʻo nui e hoʻokaʻawale i ka loiloi hoʻohui mai ka loiloi ʻoihana o ke kaila hana nui, i ʻole e hoʻohaumia i ka loiloi ʻoihana me nā mea hoʻohui hoʻohui a hoʻokuʻu i ka mea hoʻomohala noi mai ka pono e komo i nā kikoʻī o ka ʻāina hoʻolālā o ka ʻōnaehana. He nui nā pono o kēia ala, akā hōʻike ka hoʻomaʻamaʻa i kona pono ʻole:

  • ʻO ka hoʻoponopono ʻana i nā pilikia hoʻohui e hāʻule pinepine i nā koho maʻalahi ma ke ʻano o nā kelepona synchronous ma muli o nā palena hoʻonui i ka hoʻokō ʻana i ke kaʻina hana nui (e kūkākūkā ʻia nā hemahema o ka hui pū ʻana ma lalo);
  • Hoʻokomo mau nā mea hana hoʻohui i ka loiloi ʻoihana koʻikoʻi ke koi ʻia nā manaʻo mai kahi subsystem ʻē aʻe;
  • ʻaʻole i nānā ka mea hoʻomohala noi i ka hoʻohui ʻana a hiki iā ia ke wāwahi maʻalahi ma ka hoʻololi ʻana i ke kahe hana;
  • pau ka ʻōnaehana holoʻokoʻa mai ka manaʻo o ka mea hoʻohana, ʻike ʻia nā "seams" ma waena o nā subsystems, a ʻike ʻia nā hana hoʻohana redundant, e hoʻomaka ana i ka hoʻoili ʻana o ka ʻikepili mai kekahi subsystem i kekahi.

ʻO kekahi ala ʻē aʻe ʻo ka noʻonoʻo ʻana i nā pilina hoʻohui ʻana ma ke ʻano he ʻāpana koʻikoʻi o ka loiloi ʻoihana koʻikoʻi a me ke kahe hana. No ka pale ʻana i nā hōʻailona mea hoʻomohala noi mai ka skyrocketing, pono e maʻalahi a maʻalahi ka hana ʻana i nā pilina hoʻohui hou, me nā koho liʻiliʻi no ke koho ʻana i kahi hopena. ʻOi aku ka paʻakikī o kēia hana ma mua o ka mea i manaʻo ʻia: pono e lawa ka ikaika o ka mea hoʻohana e hāʻawi i ka mea hoʻohana i nā ʻano koho like ʻole no kāna hoʻohana ʻana, me ka ʻole e ʻae iā ia e "pana iā ia iho i ka wāwae." Nui nā nīnau e pane ʻia e ka ʻenekinia ma ke ʻano o nā hana hoʻohui, akā ʻaʻole pono ka mea hoʻomohala noi e noʻonoʻo e pili ana i kāna hana i kēlā me kēia lā: nā palena kālepa, kūlike, atomicity, palekana, scaling, load and resource distribution, routing, marshaling, ka hāʻawi ʻana a me ka hoʻololi ʻana i nā pōʻaiapili, a me nā mea ʻē aʻe. Pono e hāʻawi i nā mea hoʻomohala noi i nā maʻalahi hoʻonā maʻalahi kahi i hūnā ʻia ai nā pane i ia mau nīnau. Pono e palekana kēia mau hiʻohiʻona: hoʻololi pinepine ka loiloi ʻoihana, kahi e hoʻonui ai i ka pilikia o ka hoʻokomo ʻana i nā hewa, pono e noho ke kumukūʻai o nā hewa ma kahi haʻahaʻa haʻahaʻa.

Akā he aha ka pili o BPM me ia? Nui nā koho no ka hoʻokō ʻana i ke kaʻina hana ...
ʻOiaʻiʻo, kaulana loa ka hoʻokō ʻana i nā kaʻina hana ʻoihana i kā mākou hoʻonā - ma o ka wehewehe wehewehe ʻana o kahi kiʻi hoʻololi mokuʻāina a me ka pilina o nā mea lawelawe me ka loiloi ʻoihana no nā hoʻololi. I kēia hihia, ʻo ka mokuʻāina e hoʻoholo i ke kūlana o kēia manawa o ka "palapala" i ka ʻoihana ʻoihana he ʻano o ka "palapala" ponoʻī.

Hoʻohui kaila BPM
ʻO kēia ke ʻano o ke kaʻina hana i ka hoʻomaka ʻana o kahi papahana

ʻO ka kaulana o kēia hoʻokō ma muli o ka maʻalahi a me ka wikiwiki o ka hana ʻana i nā kaʻina ʻoihana linear. Eia naʻe, i ka lilo ʻana o nā ʻōnaehana polokalamu i mea paʻakikī, e ulu a paʻakikī ka ʻāpana automated o ka ʻoihana ʻoihana. Pono ka decomposition, ka hoʻohana hou ʻana i nā ʻāpana o nā kaʻina hana, a me nā kaʻina hana lālā i hana like ʻia kēlā me kēia lālā. Ma lalo o ia mau kūlana, lilo ka mea hana i mea maʻalahi, a nalowale ka ʻikepili hoʻololi o ka mokuʻāina i kāna ʻike ʻike (ʻaʻole ʻike ʻia nā pilina hoʻohui i ka kiʻi).

Hoʻohui kaila BPM
ʻO kēia ke ʻano o ke kaʻina hana ma hope o ka hoʻomaʻamaʻa ʻana i nā koi.

ʻO ke ala i waho o kēia kūlana ʻo ia ka hoʻohui ʻana o ka ʻenekini jBPM i kekahi mau huahana me nā kaʻina ʻoihana paʻakikī loa. I ka wā pōkole, ua lanakila kēia hopena: ua hiki ke hoʻokō i nā kaʻina ʻoihana paʻakikī i ka wā e mālama ana i kahi kiʻi ʻike kūpono a pili i ka notation. BPMN2.

Hoʻohui kaila BPM
ʻO kahi ʻāpana liʻiliʻi o kahi kaʻina ʻoihana paʻakikī

I ka wā lōʻihi, ʻaʻole i kū ka hopena i nā mea i manaʻo ʻia: ʻo ka hana kiʻekiʻe o ka hana o ka hana ʻana i nā kaʻina hana ʻoihana ma o nā mea hana ʻike ʻaʻole i ʻae i ka loaʻa ʻana o nā hōʻailona huahana e ʻae ʻia, a ua lilo ka mea hana i mea makemake ʻole i waena o nā mea hoʻomohala. Aia kekahi mau hoʻopiʻi e pili ana i ke ʻano o loko o ka mīkini, i alakaʻi ʻia i ke ʻano o nā "patches" a me nā "crutches".

ʻO ka hiʻohiʻona maikaʻi o ka hoʻohana ʻana i ka jBPM ʻo ia ka ʻike i nā pōmaikaʻi a me nā pōʻino o ka loaʻa ʻana o kahi kaʻina hana ʻoihana i ke kūlana hoʻomau. Ua ʻike pū mākou i ka hiki ke hoʻohana i kahi kaʻina hana e hoʻokō i nā protocol hoʻohui paʻakikī ma waena o nā noi like ʻole me ka hoʻohana ʻana i nā pilina asynchronous ma o nā hōʻailona a me nā memo. He kuleana koʻikoʻi ka noho ʻana o kahi mokuʻāina hoʻomau i kēia.

Ma muli o ka mea i luna, hiki iā mākou ke hoʻoholo: ʻO ke kaʻina hana i ke kaila BPM e hiki ai iā mākou ke hoʻoponopono i nā hana he nui e hoʻomaʻamaʻa i nā kaʻina ʻoihana paʻakikī, kūpono i nā hana hoʻohui i kēia mau kaʻina a mālama i ka hiki ke hōʻike i ke kaʻina hana i hoʻokō ʻia i kahi notation kūpono.

ʻO nā hemahema o nā kelepona synchronous ma ke ʻano he kumu hoʻohui

ʻO ka hoʻohui like ʻana e pili ana i ke kelepona paʻa maʻalahi loa. Ke hana nei kekahi subsystem ma ka ʻaoʻao kikowaena a hōʻike i ka API me ke ʻano i koi ʻia. ʻO kekahi subsystem e hana ma ke ʻano he ʻaoʻao o ka mea kūʻai aku a i ka manawa kūpono e kelepona a kali i ka hopena. Ma muli o ka hoʻolālā ʻōnaehana, hiki ke loaʻa ka mea kūʻai aku a me nā ʻaoʻao kikowaena ma ka noi like a me ke kaʻina hana, a i ʻole nā ​​​​mea like ʻole. I ka lua o ka hihia, pono ʻoe e noi i kekahi hoʻokō RPC a hāʻawi i ka marshalling o nā ʻāpana a me ka hopena o ke kelepona.

Hoʻohui kaila BPM

ʻO kēia hiʻohiʻona hoʻohui i kahi ʻano nui o nā hemahema, akā hoʻohana nui ʻia i ka hana ma muli o kona maʻalahi. Ka wikiwiki o ka hoʻokō captivates a hoʻoikaika iā ʻoe e hoʻohana hou a hoʻohana hou i ke alo o ke kaomi ʻana i nā palena manawa, e hoʻopaʻa ana i ka hopena ma ke ʻano he ʻenehana. Akā, hiki nō hoʻi i ka hoʻohana ʻana o nā mea hoʻomohala ʻike ʻole me ka ʻike ʻole, ʻaʻole maopopo i nā hopena maikaʻi ʻole.

Ma waho aʻe o ka piʻi ʻana o ka subsystem connectivity, aia kekahi mau pilikia liʻiliʻi e pili ana i ka "ulu" a me ka "hoʻolōʻihi". ʻOiaʻiʻo, inā hoʻololi ka loiloi ʻoihana, a laila ʻaʻole hiki ke pale ʻia nā kālepa, a ʻo ka hoʻololi ʻana, e kāohi i kekahi mau kumuwaiwai noi i hoʻopili ʻia e kēia mau loli. ʻO ia hoʻi, a hiki i ka wā e kali ai kekahi subsystem no ka pane mai kekahi, ʻaʻole hiki iā ia ke hoʻopau i ke kālepa a wehe i nā laka. Hoʻonui nui kēia i ka pilikia o nā hopena like ʻole:

  • Ua nalowale ka pane o ka ʻōnaehana, kali lōʻihi nā mea hoʻohana no nā pane i nā noi;
  • ke ho'ōki nei ke kikowaena i ka pane ʻana i nā noi o nā mea hoʻohana ma muli o ka nui o nā lola: ua laka ʻia ka hapa nui o nā lola ma kahi kumuwaiwai i noho ʻia e kahi kālepa;
  • Hoʻomaka ka puka ʻana o nā deadlocks: ʻo ke ʻano o ko lākou hanana ʻana e hilinaʻi nui ʻia i ka lōʻihi o nā kālepa, ka nui o ka loiloi ʻoihana a me nā laka i pili i ke kālepa;
  • ʻike ʻia nā hewa i ka wā hoʻolimalima;
  • "Holo" ke kikowaena me OutOfMemory inā pono ka hana i ka hana a me ka hoʻololi ʻana i ka nui o nā ʻikepili, a ʻo ka hele ʻana o nā hoʻohui synchronous he mea paʻakikī loa ka hoʻokaʻawale ʻana i ka hana i nā hana "māmā".

Mai kahi manaʻo hoʻolālā, ʻo ka hoʻohana ʻana i nā kelepona paʻa i ka wā o ka hoʻohui ʻana e alakaʻi i ka nalowale o ka mana ma luna o ka maikaʻi o nā subsystems pākahi: ʻaʻole hiki ke hōʻoia i nā hōʻailona o ka maikaʻi o kahi subsystem ma kahi kaʻawale mai nā hōʻailona maikaʻi o kekahi subsystem. Inā hoʻomohala ʻia nā subsystem e nā hui like ʻole, he pilikia nui kēia.

ʻOi aku ka hoihoi o nā mea inā ʻo nā subsystem i hoʻohui ʻia i nā noi like ʻole a pono ʻoe e hana i nā loli synchronous ma nā ʻaoʻao ʻelua. Pehea e hōʻoia ai i ka transactionality o kēia mau hoʻololi?

Inā hoʻololi ʻia nā hoʻololi ʻokoʻa, a laila pono ʻoe e hāʻawi i ka lawelawe ʻokoʻa kūpono a me ka uku, a hoʻopau loa kēia i ka pōmaikaʻi nui o ka hoʻohui pū ʻana - maʻalahi.

Hoʻomaopopo pū ʻia nā kālepa i hāʻawi ʻia, akā ʻaʻole mākou e hoʻohana iā lākou i kā mākou hoʻonā: paʻakikī ke hōʻoia i ka hilinaʻi.

"Saga" ma ke ʻano he hopena i ka pilikia kālepa

Me ka ulu nui o ka microservices, ke koi no Kumu Saga.

Hoʻoponopono maikaʻi kēia ʻano i nā pilikia i ʻōlelo ʻia ma luna o nā kālepa lōʻihi, a hoʻonui pū i ka hiki ke hoʻokele i ka mokuʻāina o ka ʻōnaehana mai ka ʻaoʻao o ka loiloi ʻoihana: ʻaʻole hiki ke hoʻihoʻi i ka ʻōnaehana i kona kūlana mua, akā hāʻawi. he ala hana ʻikepili ʻē aʻe. ʻAe kēia iā ʻoe e pale i ka hana hou ʻana i nā kaʻina hana ʻikepili i hoʻopau ʻia i ka wā e hoʻāʻo ai e lawe i ke kaʻina hana i kahi hopena "maikaʻi".

ʻO ka mea e mahalo ai, i loko o nā ʻōnaehana monolithic, pili pū kēia ʻano i ka hoʻohui ʻana o nā subsystem i hoʻopili ʻia a me nā hopena maikaʻi ʻole i hoʻokumu ʻia e nā kālepa lōʻihi a me nā laka waiwai pili.

E pili ana i kā mākou ʻoihana ʻoihana ma ke ʻano BPM, ua maʻalahi ka hoʻokō ʻana i ka "Sagas": hiki ke kuhikuhi ʻia nā ʻanuʻu pākahi o ka "Saga" ma ke ʻano he mau hana i loko o ke kaʻina ʻoihana, a me ke kūlana hoʻomau o ke kaʻina ʻoihana. hoʻoholo i ke kūlana kūloko o ka "Saga". ʻO ia hoʻi, ʻaʻole mākou e koi aku i kahi mīkini hoʻohui hou. ʻO nā mea a pau āu e makemake ai he mea hoʻolaha leka e kākoʻo ana i ka "ma ka liʻiliʻi hoʻokahi" hōʻoiaʻiʻo ma ke ʻano he halihali.

Akā, aia nō kēia hoʻonā i kāna "kumu kūʻai" ponoʻī:

  • ʻoi aku ka paʻakikī o ka loiloi pāʻoihana: pono e hana ʻia ka uku;
  • pono e haʻalele i ke kūlike piha, hiki ke maʻalahi no nā ʻōnaehana monolithic;
  • ʻOi aku ka paʻakikī o ka hoʻolālā ʻana, a ʻike ʻia kahi pono hou no kahi mea hoʻolaha leka;
  • e koi ʻia nā mea hana nānā hou a me ka hoʻokele (ʻoiai ma ka laulā he maikaʻi kēia: e hoʻonui ʻia ka maikaʻi o ka lawelawe ʻōnaehana).

No nā ʻōnaehana monolithic, ʻaʻole maopopo ka manaʻo o ka hoʻohana ʻana i ka "Sag". No nā microservices a me nā SOA ʻē aʻe, kahi i loaʻa i kahi mea kūʻai aku, a hāʻawi ʻia ke kūpaʻa piha i ka hoʻomaka ʻana o ka papahana, hiki i nā pōmaikaʻi o ka hoʻohana ʻana i kēia ʻano ke ʻoi aku ka maikaʻi ma mua o nā hemahema, ʻoiai inā aia kahi API kūpono i ka loiloi ʻoihana. pae.

Hoʻopili i ka loiloi ʻoihana i nā microservices

I ka wā i hoʻomaka ai mākou e hoʻokolohua me nā microservices, ua kū mai kahi nīnau kūpono: ma hea kahi e waiho ai i ka logic ʻoihana domain e pili ana i ka lawelawe e hōʻoia i ka hoʻomau ʻana o ka ʻikepili domain?

I ka nānā ʻana i ka hoʻolālā ʻana o nā BPMS like ʻole, he mea kūpono paha ke hoʻokaʻawale i ka loiloi ʻoihana mai ka hoʻomau: hana i kahi papa o ka paepae a me nā microservices kūʻokoʻa domain e hana i kahi kaiapuni a me ka pahu no ka hoʻokō ʻana i ka loiloi ʻoihana domain, a hoʻolālā i ka hoʻomau ʻana o ka ʻikepili domain. he papa ʻokoʻa o nā microservices maʻalahi loa. ʻO nā kaʻina hana pāʻoihana i kēia hihia e hana i ka orchestration o nā lawelawe o ka papa hoʻomau.

Hoʻohui kaila BPM

He waiwai nui loa kēia ala: hiki iā ʻoe ke hoʻonui i ka hana o ka paepae e like me kou makemake, a ʻo ka papa kūpono o nā microservices platform e lilo i "momona" mai kēia. Hiki i nā kaʻina hana pāʻoihana mai kēlā me kēia kikowaena ke hoʻohana i ka hana hou o ka paepae i ka wā e hoʻonui ʻia ai.

Ua hōʻike ʻia kahi noiʻi kikoʻī i nā hemahema nui o kēia ala:

  • ʻO kahi lawelawe paepae e hoʻokō nei i ka loiloi ʻoihana o nā kikowaena he nui i ka manawa hoʻokahi e lawe i nā pilikia nui ma ke ʻano he hoʻokahi o ka hemahema. ʻO ka hoʻololi pinepine ʻana i ka loiloi ʻoihana e hoʻonui i ka pilikia o nā hewa e alakaʻi ana i nā hemahema o ka ʻōnaehana;
  • nā pilikia o ka hana: hana pū ka loiloi pāʻoihana me kāna ʻikepili ma o kahi pānaʻi haiki a lohi:
    • e hōʻiliʻili hou ʻia ka ʻikepili a paʻi ʻia i loko o ka waihona pūnaewele;
    • e hāʻawi pinepine kahi lawelawe kikowaena i nā ʻikepili hou aʻe ma mua o ka mea i koi ʻia no ka loiloi ʻoihana e hana ma muli o ka lawa ʻole o ka hiki no ka hoʻohālikelike ʻana i nā noi ma ka pae o ka API waho o ka lawelawe;
    • hiki i kekahi mau ʻāpana kūʻokoʻa o ka logic pāʻoihana ke noi hou i ka ʻikepili like no ka hoʻoili ʻana (hiki ke hoʻemi ʻia kēia pilikia ma ka hoʻohui ʻana i nā ʻāpana hui e hūnā i ka ʻikepili, akā hoʻopiʻi hou kēia i ka hoʻolālā a hoʻokumu i nā pilikia o ka pili o ka ʻikepili a me ka hōʻole ʻana i ka cache);
  • nā pilikia kālepa:
    • ʻO nā kaʻina hana ʻoihana me ke kūlana hoʻomau, i mālama ʻia e kahi lawelawe platform, ʻaʻole kūlike me ka ʻikepili domain, a ʻaʻohe ala maʻalahi e hoʻoponopono ai i kēia pilikia;
    • ke kau ʻana i ka ʻikepili domain blocking ma waho o ke kālepa: inā pono e hoʻololi ka logic ʻoihana domain ma hope o ka nānā mua ʻana i ka pololei o ka ʻikepili o kēia manawa, pono e kāpae i ka hiki ke hoʻololi hoʻokūkū i ka ʻikepili i hana ʻia. Hiki i ka pale ʻikepili waho ke kōkua i ka hoʻoponopono ʻana i ka pilikia, akā ʻo ia ʻano hoʻonā e lawe i nā pilikia hou aʻe a hōʻemi i ka hilinaʻi holoʻokoʻa o ka ʻōnaehana;
  • nā pilikia hou aʻe i ka wā e hoʻonui ai: i kekahi mau hihia, pono e hoʻonui ʻia ka lawelawe hoʻomau a me ka loiloi ʻoihana i ka synchronously a i ʻole i ke kaʻina koʻikoʻi.

ʻO ka hope, pono mākou e hoʻi i nā kumu: hoʻopili i ka ʻikepili domain a me ka loina ʻoihana domain i hoʻokahi microservice. ʻO kēia ala e hoʻomaʻamaʻa i ka ʻike o kahi microservice ma ke ʻano he mea hoʻohui o ka ʻōnaehana a ʻaʻole e hāʻawi i nā pilikia i luna. ʻAʻole hāʻawi manuahi ʻia kēia:

  • Pono ka standardization API no ka launa pū ʻana me ka loiloi ʻoihana (ma ke ʻano, e hoʻolako i nā hana mea hoʻohana ma ke ʻano he ʻāpana o nā kaʻina hana ʻoihana) a me nā lawelawe platform API; Pono ka nānā pono ʻana i nā loli API, ka hoʻohālikelike ʻana i mua a i hope;
  • pono e hoʻohui i nā hale waihona puke runtime e hōʻoia i ka hana ʻana o ka loiloi ʻoihana ma ke ʻano o kēlā me kēia microservice, a hāʻawi kēia i nā koi hou no ia mau hale waihona puke: māmā a me ka liʻiliʻi o nā hilinaʻi transitive;
  • Pono nā mea hoʻomohala noʻonoʻo pāʻoihana e nānā i nā mana waihona: inā ʻaʻole i hoʻopau ʻia kahi microservice no ka manawa lōʻihi, a laila e loaʻa paha kahi mana o nā hale waihona puke. He mea pilikia ʻole kēia i ka hoʻohui ʻana i kahi hiʻohiʻona hou a pono paha e neʻe i ka loina ʻoihana kahiko o ia lawelawe i nā mana hou o nā hale waihona puke inā loaʻa nā loli like ʻole ma waena o nā mana.

Hoʻohui kaila BPM

Aia kekahi papa o nā lawelawe paepae i loko o ia ʻano hoʻolālā, akā ʻaʻole kēia papa i hana hou i kahi pahu no ka hoʻokō ʻana i ka loiloi ʻoihana domain, akā ʻo kona kaiapuni wale nō, e hāʻawi ana i nā hana "platform" kōkua. ʻAʻole pono kēlā ʻano papa e mālama i ke ʻano māmā o nā microservices domain, akā no ka hoʻokele kikowaena.

No ka laʻana, hana nā mea hoʻohana i nā hana ʻoihana i nā hana. Eia nō naʻe, i ka hana ʻana me nā hana, pono ka mea hoʻohana e ʻike i nā hana mai nā kāʻei kapu a pau i ka papa inoa maʻamau, ʻo ia hoʻi, pono e loaʻa kahi lawelawe hoʻopaʻa inoa hana papahana, hoʻomaʻemaʻe ʻia mai ka loina ʻoihana domain. ʻO ka mālama ʻana i ka encapsulation o ka loiloi ʻoihana i kēlā ʻano pōʻaiapili he pilikia nui, a ʻo kēia kahi hoʻololi ʻē aʻe o kēia hoʻolālā.

Hoʻohui i nā kaʻina hana ʻoihana ma o nā maka o kahi mea hoʻomohala noi

E like me ka mea i ʻōlelo ʻia ma luna nei, pono e hoʻokaʻawale ʻia kahi mea hoʻomohala noi mai nā hiʻohiʻona ʻenehana a me ka ʻenekinia o ka hoʻokō ʻana i ka launa pū ʻana o kekahi mau noi i hiki i kekahi ke hilinaʻi i ka huahana hoʻomohala maikaʻi.

E hoʻāʻo kākou e hoʻoponopono i kahi pilikia hoʻohui paʻakikī, i hana kūikawā ʻia no ka ʻatikala. He hana "pāʻani" kēia e pili ana i ʻekolu mau noi, kahi e wehewehe ai kēlā me kēia o lākou i kahi inoa inoa: "app1", "app2", "app3".

I loko o kēlā me kēia noi, hoʻomaka ʻia nā kaʻina hana ʻoihana e hoʻomaka i ka "pāʻani kinipōpō" ma o ke kaʻa hoʻohui. ʻO nā memo me ka inoa "Ball" e hana ma ke ʻano he pōpō.

Nā papa o ka pāʻani:

  • ʻo ka mea pāʻani mua ka mea hoʻomaka. Kāheaʻo ia i nā mea pāʻani'ē aʻe i ka pāʻani, hoʻomaka i ka pāʻani a hiki ke hoʻopau i kēlā me kēia manawa;
  • haʻi aku nā mea pāʻani ʻē aʻe i ko lākou komo ʻana i ka pāʻani, "e ʻike" kekahi i kekahi a me ka mea pāʻani mua;
  • ma hope o ka loaʻa ʻana o ka pōleʻa, koho ka mea pāʻani i kekahi mea pāʻani a hāʻawi i ka pōleʻa iā ia. helu ʻia ka huina o nā hoʻouna;
  • Loaʻa i kēlā me kēia mea pāʻani ka "ikaika" e emi ana me kēlā me kēia pā o ka pōleʻa e kēlā mea pāʻani. Ke pau ka ikehu, haʻalele ka mea pāʻani i ka pāʻani, e hoʻolaha ana i kona haʻalele;
  • inā waiho wale ka mea pāʻani, hoʻolaha koke ʻo ia i kona haʻalele;
  • Ke hoʻopau ʻia nā mea pāʻani a pau, haʻi ka mea pāʻani mua i ka pau ʻana o ka pāʻani. Inā haʻalele koke ʻo ia i ka pāʻani, hoʻomau ʻo ia e hahai i ka pāʻani e hoʻopau.

No ka hoʻoponopono ʻana i kēia pilikia, e hoʻohana wau i kā mākou DSL no nā kaʻina hana ʻoihana, kahi e hiki ai iā mākou ke wehewehe i ka logic ma Kotlin compactly, me ka liʻiliʻi o ka boilerplate.

E hana ana ke kaʻina hana ʻoihana o ka mea pāʻani mua (ʻo ia ka mea hoʻomaka o ka pāʻani) ma ka noi app1:

class InitialPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.constraint.UniqueConstraints
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.dsl.taskOperation
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList : ArrayList<PlayerInfo>()

// Это класс экземпляра процесса: инкапсулирует его внутреннее состояние
class InitialPlayer : ProcessImpl<InitialPlayer>(initialPlayerModel) {
    var playerName: String by persistent("Player1")
    var energy: Int by persistent(30)
    var players: PlayersList by persistent(PlayersList())
    var shotCounter: Int = 0
}

// Это декларация модели процесса: создается один раз, используется всеми
// экземплярами процесса соответствующего класса
val initialPlayerModel = processModel<InitialPlayer>(name = "InitialPlayer",
                                                     version = 1) {

    // По правилам, первый игрок является инициатором игры и должен быть единственным
    uniqueConstraint = UniqueConstraints.singleton

    // Объявляем активности, из которых состоит бизнес-процесс
    val sendNewGameSignal = signal<String>("NewGame")
    val sendStopGameSignal = signal<String>("StopGame")
    val startTask = humanTask("Start") {
        taskOperation {
            processCondition { players.size > 0 }
            confirmation { "Подключилось ${players.size} игроков. Начинаем?" }
        }
    }
    val stopTask = humanTask("Stop") {
        taskOperation {}
    }
    val waitPlayerJoin = signalWait<String>("PlayerJoin") { signal ->
        players.add(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        println("... join player ${signal.data} ...")
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        println("... player ${signal.data} is out ...")
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val throwStartBall = messageSend<Int>("Ball") {
        messageData = { 1 }
        activation = { selectNextPlayer() }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    // Теперь конструируем граф процесса из объявленных активностей
    startFrom(sendNewGameSignal)
            .fork("mainFork") {
                next(startTask)
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut)
                        .branch("checkPlayers") {
                            ifTrue { players.isEmpty() }
                                    .next(sendStopGameSignal)
                                    .terminate()
                            ifElse().next(waitPlayerOut)
                        }
            }
    startTask.fork("afterStart") {
        next(throwStartBall)
                .branch("mainLoop") {
                    ifTrue { energy < 5 }.next(sendPlayerOut).next(waitBall)
                    ifElse().next(waitBall).next(throwBall).loop()
                }
        next(stopTask).next(sendStopGameSignal)
    }

    // Навешаем на активности дополнительные обработчики для логирования
    sendNewGameSignal.onExit { println("Let's play!") }
    sendStopGameSignal.onExit { println("Stop!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<InitialPlayer, Int>.selectNextPlayer() {
    val player = process.players.random()
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

Ma waho aʻe o ka hoʻokō ʻana i ka loiloi ʻoihana, hiki i ka code ma luna ke hana i kahi hiʻohiʻona o kahi kaʻina hana ʻoihana, hiki ke ʻike ʻia ma ke ʻano o kahi kiʻi. ʻAʻole mākou i hoʻokō i ka visualizer i kēia manawa, no laila pono mākou e hoʻolōʻihi i ka manawa e kiʻi iā ia (eia wau i maʻalahi i ka notation BPMN e pili ana i ka hoʻohana ʻana i nā ʻīpuka e hoʻomaikaʻi i ke kūlike o ke kiʻi me ke code i hāʻawi ʻia):

Hoʻohui kaila BPM

E hoʻokomo ʻo app2 i ke kaʻina ʻoihana ʻoihana ʻē aʻe:

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

Diagram:

Hoʻohui kaila BPM

Ma ka noi app3 e hana mākou i kahi mea pāʻani me kahi ʻano ʻokoʻa ʻē aʻe: ma kahi o ke koho ʻana i ka mea pāʻani aʻe, e hana ʻo ia e like me ka round-robin algorithm:

papa 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 i ʻole, ʻaʻole ʻokoʻa ka ʻano o ka mea pāʻani mai ka mea ma mua, no laila ʻaʻole loli ke kiʻi.

I kēia manawa pono mākou i kahi ho'āʻo e holo i kēia mau mea a pau. E hāʻawi wale wau i ke code o ka hoʻāʻo ponoʻī, i ʻole e hoʻopili i ka ʻatikala me kahi boilerplate (ʻoiaʻiʻo, ua hoʻohana wau i ka ʻenehana hoʻāʻo i hana ʻia ma mua e hoʻāʻo ai i ka hoʻohui ʻana i nā kaʻina hana ʻoihana ʻē aʻe):

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

E holo kāua i ka hoʻāʻo a nānā i ka log:

hoʻopuka ʻoluʻolu

Взята блокировка ключа 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 kēia mau mea a pau hiki iā mākou ke huki i nā hopena koʻikoʻi:

  • me nā mea hana pono, hiki i nā mea hoʻomohala noi ke hana i nā pilina hoʻohui ma waena o nā noi me ka ʻole e hoʻopau i ka loiloi ʻoihana;
  • hiki ke hūnā ʻia ka paʻakikī o kahi hana hoʻohui e koi ana i nā mākau ʻenekinia i loko o ke kāʻei inā i hoʻokomo mua ʻia kēia i loko o ka hoʻolālā ʻana o ka framework. ʻAʻole hiki ke hūnā ʻia ka paʻakikī o kahi pilikia, no laila e like ke ʻano o ka hoʻonā ʻana i kahi pilikia paʻakikī ma ke code;
  • I ka hoʻomohala ʻana i ka loiloi hoʻohui, pono ia e noʻonoʻo i ka kūlike a me ka nele o ka linearizability o nā loli i ke kūlana o nā mea hoʻohui a pau. Hoʻoikaika kēia iā mākou e paʻakikī i ka loiloi i mea e ʻike ʻole ai i ke ʻano o nā hanana o waho. I kā mākou laʻana, koi ʻia ka mea pāʻani e komo i ka pāʻani ma hope o kona haʻi ʻana i kona puka ʻana mai ka pāʻani: e hoʻomau nā mea pāʻani ʻē aʻe i ka hāʻawi ʻana i ka pōleʻa iā ia a hiki i ka ʻike e pili ana i kona puka ʻana a hoʻokō ʻia e nā poʻe a pau. ʻAʻole hahai kēia loiloi mai nā lula o ka pāʻani a he hopena kuʻikahi i loko o ke ʻano o ka hoʻolālā i koho ʻia.

Ma hope aʻe, e kamaʻilio mākou e pili ana i nā ʻano paʻakikī o kā mākou hoʻonā, hoʻopaʻapaʻa a me nā mea ʻē aʻe.

Aia nā memo a pau i ka laina hoʻokahi

Hoʻohana nā noi hoʻohui āpau me hoʻokahi kaʻa hoʻohui, i hōʻike ʻia ma ke ʻano o kahi broker waho, hoʻokahi BPMQueue no nā memo a hoʻokahi kumuhana BPMTopic no nā hōʻailona (nā hanana). ʻO ka hoʻokomo ʻana i nā memo a pau ma ka laina hoʻokahi, he kuʻikahi. I ka pae noʻonoʻo ʻoihana, hiki iā ʻoe ke hoʻolauna i nā ʻano memo hou e like me kou makemake me ka ʻole e hoʻololi i ka ʻōnaehana ʻōnaehana. He mea maʻalahi kēia, akā lawe ia i kekahi mau pilikia, i loko o ka pōʻaiapili o kā mākou mau hana maʻamau, ʻaʻole ia he mea koʻikoʻi iā mākou.

Hoʻohui kaila BPM

Eia nō naʻe, aia kahi maʻalahi ma aneʻi: kānana kēlā me kēia noi i nā memo "kona" mai ka pila ma ka puka komo, ma ka inoa o kāna kikowaena. Hiki ke kuhikuhi ʻia ka domain i nā hōʻailona inā pono ʻoe e kaupalena i ka "nui o ka ʻike" o ka hōʻailona i hoʻokahi noi hoʻokahi. Pono kēia e hoʻonui i ka holo kaʻa, akā pono e hana ka loiloi ʻoihana me nā inoa kikowaena: no ka hoʻoponopono ʻana i nā memo - pono, no nā hōʻailona - makemake ʻia.

E hōʻoia ana i ka hilinaʻi o ka Bus Integration

Aia ka hilinaʻi i kekahi mau helu:

  • ʻO ka mea kūʻai leka i koho ʻia he mea koʻikoʻi o ka hoʻolālā ʻana a me kahi wahi o ka hāʻule ʻole: pono e lawa ka hewa. Pono ʻoe e hoʻohana i nā hoʻokō i hoʻāʻo ʻia i ka manawa, me ke kākoʻo maikaʻi a me kahi kaiāulu nui;
  • pono e hōʻoia i ka loaʻa kiʻekiʻe o ka mea hoʻolaha memo, no ka mea, pono e hoʻokaʻawale kino ʻia mai nā noi i hoʻohui ʻia (ʻoi aku ka paʻakikī o ka loaʻa kiʻekiʻe o nā noi me ka loiloi ʻoihana noiʻi a ʻoi aku ka paʻakikī e hōʻoia);
  • pono ka mea hoʻolimalima e hāʻawi i "ma ka liʻiliʻi loa hoʻokahi" hōʻoia hoʻouna. He koi koi kēia no ka hana pono o ke kaʻa hoʻohui. ʻAʻohe pono no ka "hoʻokahi manawa" hōʻoia pae: ʻo nā kaʻina hana ʻoihana, ma ke ʻano he kānāwai, ʻaʻole i maʻalahi i ka hōʻea pinepine ʻana o nā memo a i ʻole nā ​​hanana, a ma nā hana kūikawā kahi mea nui kēia, ʻoi aku ka maʻalahi o ka hoʻohui ʻana i nā loiloi hou i ka ʻoihana. noʻonoʻo ma mua o ka hoʻohana mau ʻana i nā hōʻoiaʻiʻo "nui" ";
  • ʻO ka hoʻounaʻana i nā leka a me nā hōʻailona pono e komo i loko o kahi kālepa holoʻokoʻa me nā loli i ke kūlana o nā kaʻina hana a me nāʻikepili domain. ʻO ka koho i makemake ʻia e hoʻohana i kahi ʻano Pahu puka waho, akā e koi ʻia i kahi papa ʻē aʻe i ka waihona a me kahi mea hou. Ma nā noi JEE, hiki ke maʻalahi kēia me ka hoʻohana ʻana i kahi luna JTA kūloko, akā pono e hiki ke hana i ka pilina me ka mea koho i koho ʻia. XA;
  • ʻO nā mea lawelawe o nā memo a me nā hanana e hiki mai ana e hana pū me kahi kālepa e hoʻololi i ke kūlana o kahi kaʻina hana ʻoihana: inā e ʻōwili ʻia kēlā ʻano hana, a laila pono e hoʻopau ʻia ka loaʻa ʻana o ka leka;
  • ʻO nā memo i hiki ʻole ke hoʻouna ʻia ma muli o nā hewa, pono e mālama ʻia i kahi waihona ʻokoʻa D.L.Q. (Līlani Leta Make). No kēia kumu, ua hana mākou i kahi microservice ʻokoʻa e mālama i nā memo i loko o kāna waihona, kuhikuhi iā lākou ma nā ʻano (no ka hui wikiwiki a me ka huli ʻana), a hōʻike i kahi API no ka nānā ʻana, ka hoʻouna ʻana i ka helu wahi e hele ai, a me ka holoi ʻana i nā memo. Hiki i nā luna hoʻonohonoho pūnaewele ke hana me kēia lawelawe ma o kā lākou pūnaewele pūnaewele;
  • i nā hoʻonohonoho broker, pono ʻoe e hoʻoponopono i ka helu o ka hoʻihoʻi ʻana a me ka hoʻopaneʻe ʻana ma waena o nā hoʻopuka i mea e hōʻemi ai i ka hiki ke komo i nā leka i DLQ (ʻaneʻane hiki ʻole ke helu i nā palena kūpono, akā hiki iā ʻoe ke hana empirically a hoʻoponopono iā lākou i ka wā o ka hana. );
  • Pono e kiaʻi mau ʻia ka hale kūʻai DLQ, a pono e makaʻala ka ʻōnaehana kiaʻi i nā luna ʻōnaehana a hiki i ka wā e loaʻa ai nā memo i hoʻouna ʻole ʻia, hiki iā lākou ke pane koke i ka hiki. E ho'ēmi ana kēia i ka "wahi i hoʻopilikiaʻia" o ka hemahema a iʻole ka hewa loiloiʻoihana;
  • pono ʻole ke kaʻa kaʻa hoʻohui i ka haʻalele ʻana o nā noi: pono e paʻa ke kau inoa ʻana i kahi kumuhana, a he ʻokoʻa ka inoa inoa o ka palapala noi no laila ʻoiai ʻaʻole ka palapala noi, ʻaʻole e hoʻāʻo kekahi e hoʻoponopono i kāna mau memo mai ka laina laina.

ʻO ka hōʻoia ʻana i ka palekana o ka pae ʻoihana

Hiki i ke kaʻina hana ʻoihana ke loaʻa i nā memo a me nā hanana i ka manawa hoʻokahi, e hoʻomaka ana ka hana ʻana i ka like. I ka manawa like, no ka mea hoʻomohala noi, pono e maʻalahi nā mea a pau a palekana.

ʻO ka loiloi pāʻoihana o kahi kaʻina hana i kēlā me kēia hanana waho e pili ana i kēlā kaʻina ʻoihana pākahi. ʻO ia mau hanana paha:

  • ka hoʻomaka ʻana i kahi laʻana kaʻina hana ʻoihana;
  • hana hoʻohana e pili ana i ka hana i loko o kahi kaʻina hana;
  • ka loaʻa ʻana o kahi leka a i ʻole hōʻailona i hoʻopaʻa inoa ʻia ai kahi ʻano hana ʻoihana;
  • ka hoʻomaka ʻana o kahi manawa i hoʻonohonoho ʻia e kahi laʻana kaʻina hana;
  • ka hana hoʻomalu ma o API (no ka laʻana, hoʻopau kaʻina hana).

Hiki i kēlā me kēia hanana ke hoʻololi i ke kūlana o ke kaʻina hana ʻoihana: pau paha kekahi mau hana a hoʻomaka paha nā mea ʻē aʻe, a hiki ke loli nā waiwai o nā waiwai hoʻomau. ʻO ka pani ʻana i kekahi haʻawina hiki ke hoʻāla ʻia kekahi a ʻoi aku paha o kēia mau hana. Hiki iā lākou ke ho'ōki i ke kali ʻana i nā hanana ʻē aʻe a i ʻole, inā ʻaʻole pono lākou i nā ʻikepili hou, hiki ke hoʻopau i ka hana like. Ma mua o ka pani ʻana i ke kālepa, mālama ʻia ka mokuʻāina hou o ke kaʻina hana ʻoihana i ka waihona, kahi e kali ai no ka hanana ʻana o waho.

ʻO ka ʻikepili kaʻina hana hoʻomau i mālama ʻia i loko o kahi waihona relational kahi wahi kūpono loa no ka hoʻonohonoho ʻana i ka hana inā hoʻohana ʻoe i SELECT FOR UPDATE. Inā hiki i kekahi kālepa ke loaʻa ke kūlana o kahi kaʻina hana ʻoihana mai ke kumu no ka hoʻololi ʻana, a laila ʻaʻole hiki ke loaʻa ka mokuʻāina like ʻole no ka hoʻololi hou ʻana, a ma hope o ka pau ʻana o ka hana mua, ʻo ka lua. ʻoiaʻiʻo e loaʻa ka mokuʻāina i hoʻololi ʻia.

Ke hoʻohana nei i nā laka pessimistic ma ka ʻaoʻao DBMS, hoʻokō mākou i nā koi pono āpau ʻĀKIKA, a mālama pū i ka hiki ke hoʻonui i ka noi me ka loiloi ʻoihana ma ka hoʻonui ʻana i ka helu o nā manawa holo.

Eia nō naʻe, hoʻoweliweli nā laka pessimistic iā mākou me nā deadlocks, ʻo ia ka mea e kaupalena ʻia ʻo SELECT FOR UPDATE i kekahi manawa kūpono inā loaʻa nā deadlocks ma kekahi mau hihia koʻikoʻi i ka loina ʻoihana.

ʻO kekahi pilikia ʻo ka synchronization o ka hoʻomaka ʻana o kahi kaʻina ʻoihana. ʻOiai ʻaʻohe hiʻohiʻona o kahi kaʻina hana ʻoihana, ʻaʻohe mokuʻāina i ka waihona, no laila ʻaʻole e hana ke ʻano i wehewehe ʻia. Inā pono ʻoe e hōʻoia i ka ʻokoʻa o ke kaʻina hana ʻoihana ma kahi kikoʻī kikoʻī, a laila pono ʻoe i kekahi ʻano mea hoʻonohonoho like e pili ana i ka papa kaʻina hana a me ka laulā e pili ana. No ka hoʻoponopono ʻana i kēia pilikia, hoʻohana mākou i kahi ʻano laka ʻē aʻe e hiki ai iā mākou ke lawe i kahi laka ma kahi kumuwaiwai kūʻokoʻa i kuhikuhi ʻia e kahi kī i ka format URI ma o kahi lawelawe waho.

Ma kā mākou mau hiʻohiʻona, aia ka ʻoihana ʻoihana InitialPlayer i kahi ʻōlelo

uniqueConstraint = UniqueConstraints.singleton

No laila, aia i loko o ka log nā memo e pili ana i ka lawe ʻana a me ka hoʻokuʻu ʻana i ka laka o ke kī pili. ʻAʻohe memo like no nā kaʻina hana ʻoihana ʻē aʻe: ʻaʻole i hoʻonohonoho ʻia ka uniqueConstraint.

Nā pilikia o nā kaʻina hana ʻoihana me ke kūlana hoʻomau

I kekahi manawa ʻaʻole kōkua wale ke kūlana hoʻomau, akā keʻakeʻa maoli nō hoʻi i ka hoʻomohala ʻana.
Hoʻomaka nā pilikia i ka wā e pono ai e hoʻololi i ka loina ʻoihana a/a i ʻole ke ʻano hana ʻoihana. ʻAʻole kūpono kēlā me kēia hoʻololi me ke kūlana kahiko o nā kaʻina ʻoihana. Inā nui nā manawa ola i loko o ka waihona, a laila hiki i ka hana ʻana i nā loli like ʻole ke hoʻopilikia i ka pilikia, a mākou i hālāwai pinepine ai i ka wā e hoʻohana ai i ka jBPM.

Ma muli o ka hohonu o nā loli, hiki iā ʻoe ke hana ma nā ʻano ʻelua:

  1. hana i kahi ʻano kaʻina hana ʻoihana hou i ʻole e hoʻololi like ʻole i ka mea kahiko, a hoʻohana iā ia ma kahi o ka mea kahiko i ka wā e hoʻomaka ai i nā manawa hou. E hoʻomau nā kope kahiko e hana "e like me ka wā ma mua";
  2. e neʻe i ke kūlana hoʻomau o nā kaʻina hana ʻoihana i ka wā e hoʻonui ai i ka loiloi ʻoihana.

ʻOi aku ka maʻalahi o ke ala mua, akā aia kona mau palena a me nā hemahema, no ka laʻana:

  • ka hoʻopili hou ʻana i ka loina ʻoihana i nā ʻano hana kaʻina hana ʻoihana, e hoʻonui ana i ka nui o ka loiloi ʻoihana;
  • ʻO ka manawa pinepine e koi ʻia kahi hoʻololi koke i ka loiloi ʻoihana hou (ma ke ʻano o nā hana hoʻohui - kokoke i nā manawa a pau);
  • ʻAʻole ʻike ka mea hoʻomohala i kahi manawa e hiki ai ke hoʻopau ʻia nā hiʻohiʻona kahiko.

Ma ka hoʻomaʻamaʻa, hoʻohana mākou i nā ala ʻelua, akā ua hana mākou i nā hoʻoholo he nui i mea e maʻalahi ai ko mākou ola:

  • I loko o ka waihona, mālama ʻia ke kūlana hoʻomau o kahi kaʻina hana ʻoihana ma kahi ʻano maʻalahi hiki ke heluhelu a maʻalahi hoʻi: ma kahi kaula JSON format. Hāʻawi kēia i ka neʻe ʻana e hana i loko o ka noi a ma waho. Ma ke ʻano he hopena hope loa, hiki iā ʻoe ke hoʻoponopono iā ia me ka lima (pono loa i ka hoʻomohala ʻana i ka wā debugging);
  • ʻAʻole hoʻohana ka loiloi pāʻoihana hoʻohui i nā inoa o nā kaʻina ʻoihana, i hiki i kēlā me kēia manawa ke hoʻololi i ka hoʻokō ʻana o kekahi o nā kaʻina hana me kahi mea hou me kahi inoa hou (e like me ka "InitialPlayerV2"). Loaʻa ka paʻa ʻana ma o ka memo a me nā inoa hōʻailona;
  • He helu mana ko ke kŘkohu kaʻina hana, a mākou e hoʻonui ai inā hana mākou i nā hoʻololi like ʻole i kēia kŘkohu, a mālama ʻia kēia helu me ke ʻano o ke kaʻina hana;
  • ʻO ke kūlana hoʻomau o ke kaʻina hana e heluhelu mua ʻia mai ka waihona i loko o kahi kumu hoʻohālike kūpono, hiki i ke kaʻina hana neʻe ke hana me inā ua loli ka helu hoʻohālike;
  • ua kau ʻia ke kaʻina hana neʻe ma ka ʻaoʻao o ka loiloi ʻoihana a ua kapa ʻia ʻo "palaualelo" no kēlā me kēia manawa o ke kaʻina hana i ka manawa o kona hoʻihoʻi ʻana mai ka waihona;
  • inā pono ʻoe e neʻe i ka mokuʻāina o nā kaʻina hana āpau me ka wikiwiki a me ka synchronously, hoʻohana ʻia nā ʻōnaehana neʻe ʻikepili maʻamau, akā pono ʻoe e hana pū me JSON.

Makemake ʻoe i kahi hoʻolālā ʻē aʻe no nā kaʻina ʻoihana?

ʻO nā hoʻonā i wehewehe ʻia i loko o ka ʻatikala e ʻae iā mākou e hoʻomaʻamaʻa nui i ko mākou ola, hoʻonui i ka nui o nā pilikia i hoʻoholo ʻia ma ka pae hoʻomohala noi, a hoʻolilo i ka manaʻo o ka hoʻokaʻawale ʻana i ka loiloi ʻoihana i nā microservices ʻoi aku ka maikaʻi. No ka hoʻokōʻana i kēia, ua hanaʻia ka nui o nā hana, ua hanaʻia kahi papahana "māmā" loa no nāʻoihanaʻoihana, a me nā mea lawelawe no ka hoʻoponoponoʻana i nā pilikia iʻikeʻia i loko o ka pōʻaiapili o ka nui o nā pilikia noi. Loaʻa iā mākou ka makemake e kaʻana like i kēia mau hopena a hana i ka hoʻomohala ʻana i nā mea maʻamau i wehe ʻia ma lalo o kahi laikini manuahi. Pono kēia i ka hoʻoikaika a me ka manawa. ʻO ka hoʻomaopopo ʻana i ke koi no ia mau hoʻonā hiki ke lilo i mea hoʻoikaika hou iā mākou. Ma ka ʻatikala i manaʻo ʻia, ʻaʻole nui ka nānā ʻana i nā hiki o ka framework ponoʻī, akā ʻike ʻia kekahi o lākou mai nā hiʻohiʻona i hōʻike ʻia. Inā hoʻopuka mākou i kā mākou framework, e hoʻolaʻa ʻia kahi ʻatikala ʻokoʻa iā ia. I kēia manawa, mahalo mākou inā waiho ʻoe i kahi manaʻo ma ka pane ʻana i ka nīnau:

Hiki i nā mea hoʻohana i hoʻopaʻa inoa ʻia ke komo i ka noiʻi. Eʻe, e 'oluʻolu.

Makemake ʻoe i kahi hoʻolālā ʻē aʻe no nā kaʻina ʻoihana?

  • 18,8%ʻAe, ua lōʻihi koʻu ʻimi ʻana i kekahi mea e like me kēia

  • 12,5%Makemake au e aʻo hou e pili ana i kāu hoʻokō, pono paha ia2

  • 6,2%Hoʻohana mākou i kekahi o nā frameworks e kū nei, akā ke noʻonoʻo nei e hoʻololi i1

  • 18,8%Hoʻohana mākou i kekahi o nā frameworks e kū nei, maikaʻi nā mea āpau3

  • 18,8%Hoʻokele mākou me ka ʻole o ke kāʻei3

  • 25,0%e kākau i kāu4

16 mea hoʻohana i koho. Ua hōʻole nā ​​mea hoʻohana 7.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka