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ʻī.
ʻ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).
ʻ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.
ʻ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.
ʻ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.
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.
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):
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:
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;
}
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.
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:
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";
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.