BPM style kev koom ua ke

BPM style kev koom ua ke

Nyob zoo Hab!

Peb lub tuam txhab tshwj xeeb hauv kev txhim kho ntawm ERP-chav kawm software kev daws teeb meem, tus tsov ntxhuav feem ntawm uas yog nyob los ntawm kev lag luam kev lag luam nrog ntau qhov kev lag luam logic thiab cov ntaub ntawv ntws la EDMS. Cov qauv tam sim no ntawm peb cov khoom lag luam yog raws li JavaEE thev naus laus zis, tab sis peb kuj tseem muaj kev sim nrog microservices. Ib qho ntawm cov teeb meem feem ntau ntawm cov kev daws teeb meem no yog kev sib koom ua ke ntawm ntau lub subsystems uas nyob ib sab. Cov teeb meem kev koom ua ke ib txwm ua rau peb mob taub hau loj, tsis hais txog cov qauv kev tsim vaj tsev, cov txheej txheem thev naus laus zis thiab cov txheej txheem peb siv, tab sis tsis ntev los no tau muaj kev txhim kho hauv kev daws teeb meem zoo li no.

Hauv tsab xov xwm kuv coj los rau koj mloog, Kuv yuav tham txog cov kev paub dhau los thiab kev tshawb fawb architectural uas NPO "Krista" muaj nyob rau hauv cheeb tsam. Peb kuj tseem yuav saib ib qho piv txwv ntawm kev daws teeb meem yooj yim rau qhov teeb meem kev sib koom ua ke los ntawm qhov pom ntawm tus tsim daim ntawv thov thiab nrhiav seb dab tsi yog zais tom qab qhov yooj yim no.

Tsis lees paub

Cov kev daws teeb meem kev tsim vaj tsev thiab kev daws teeb meem tau piav qhia hauv tsab xov xwm yog thov los ntawm kuv raws li kev paub ntawm tus kheej hauv cov ntsiab lus ntawm cov haujlwm tshwj xeeb. Cov kev daws teeb meem no tsis lees tias yog universal thiab tej zaum yuav tsis zoo nyob rau hauv lwm yam kev siv.

BPM yuav ua li cas nrog nws?

Txhawm rau teb cov lus nug no, peb yuav tsum delve me ntsis tob rau hauv qhov tshwj xeeb ntawm cov teeb meem siv ntawm peb cov kev daws teeb meem. Qhov tseem ceeb ntawm kev lag luam logic hauv peb cov kev lag luam raug kaw yog nkag mus rau hauv cov ntaub ntawv los ntawm cov neeg siv interfaces, phau ntawv qhia thiab kev txheeb xyuas qhov tseeb ntawm cov ntaub ntawv no, nqa tawm los ntawm qee qhov kev ua haujlwm, luam tawm mus rau lwm qhov system / analytical database / archive, generating reports. . Yog li, lub luag haujlwm tseem ceeb ntawm lub kaw lus rau cov neeg siv khoom yog automation ntawm lawv cov txheej txheem kev lag luam sab hauv.

Rau kev yooj yim, peb siv lo lus "cov ntaub ntawv" hauv kev sib txuas lus raws li qee qhov kev paub daws teeb meem ntawm cov ntaub ntawv sib koom ua ke los ntawm ib qho tseem ceeb uas qee qhov kev ua haujlwm tuaj yeem "txuas".
Tab sis li cas txog kev sib koom ua ke logic? Tom qab tag nrho, cov hauj lwm kev koom ua ke yog tsim los ntawm lub architecture ntawm lub system, uas yog "txiav" rau hauv qhov chaw TSIS yog raws li qhov kev thov ntawm cov neeg siv khoom, tab sis nyob rau hauv tus ntawm cov yam ntxwv sib txawv kiag li:

  • raws li txoj cai Conway;
  • raws li kev siv cov subsystems yav dhau los tsim rau lwm cov khoom;
  • nyob ntawm tus kws tsim vaj tsev qhov kev txiav txim siab, raws li cov kev xav tau tsis ua haujlwm.

Muaj kev ntxias zoo rau kev sib cais kev sib koom ua ke los ntawm kev lag luam logic ntawm lub luag haujlwm tseem ceeb, yog li tsis txhob cuam tshuam rau kev lag luam logic nrog kev sib koom ua ke artifacts thiab txuag daim ntawv thov tsim tawm los ntawm qhov xav tau delve rau hauv cov yam ntxwv ntawm thaj chaw vaj tsev ntawm lub system. Txoj kev no muaj ntau qhov zoo, tab sis kev xyaum qhia nws qhov tsis muaj txiaj ntsig:

  • kev daws teeb meem kev koom ua ke feem ntau poob rov qab rau cov kev xaiv yooj yim tshaj plaws nyob rau hauv daim ntawv ntawm synchronous hu vim yog cov ntsiab lus txuas ntxiv hauv kev siv cov ntsiab lus tseem ceeb (qhov tsis zoo ntawm kev sib koom ua ke synchronous tau tham hauv qab no);
  • kev koom ua ke artifacts tseem nkag mus rau hauv lub ntsiab lag luam logic thaum tawm tswv yim los ntawm lwm lub subsystem yuav tsum tau;
  • tus tsim daim ntawv thov tsis quav ntsej txog kev sib koom ua ke thiab tuaj yeem ua txhaum nws yooj yim los ntawm kev hloov cov kev ua haujlwm;
  • Lub kaw lus tsis tas yuav yog ib qho tag nrho los ntawm tus neeg siv qhov kev xav, "seams" ntawm subsystems ua pom tau, thiab cov neeg siv tsis tau rov ua haujlwm tshwm sim, pib hloov cov ntaub ntawv los ntawm ib lub subsystem mus rau lwm qhov.

Lwm txoj hauv kev yog xav txog kev sib koom ua ke ntawm kev sib koom ua ke ua ib feem tseem ceeb ntawm kev lag luam tseem ceeb thiab kev ua haujlwm. Txhawm rau tiv thaiv daim ntawv thov tsim nyog tsim nyog los ntawm skyrocketing, tsim kom muaj kev sib koom ua ke tshiab yuav tsum yooj yim thiab siv zog, nrog tsawg lub sijhawm los xaiv txoj kev daws teeb meem. Qhov no yog qhov nyuaj dua li nws zoo li: lub cuab yeej yuav tsum muaj zog txaus los muab cov neeg siv nrog ntau yam kev xaiv rau nws siv, tsis pub nws "tua nws tus kheej hauv ko taw." Muaj ntau cov lus nug uas tus kws ua haujlwm yuav tsum teb rau hauv cov ntsiab lus ntawm kev sib koom ua haujlwm, tab sis qhov twg tus tsim daim ntawv thov yuav tsum tsis txhob xav txog hauv nws txoj haujlwm niaj hnub: kev lag luam ciam teb, sib xws, atomicity, kev ruaj ntseg, scaling, load thiab kev faib khoom, routing, marshaling, kev faib tawm thiab hloov cov ntsiab lus, thiab lwm yam. Nws yog ib qho tsim nyog los muab cov ntawv thov tsim cov qauv yooj yim yooj yim uas cov lus teb rau tag nrho cov lus nug no twb muab zais lawm. Cov qauv no yuav tsum muaj kev nyab xeeb heev: kev lag luam logic hloov ntau zaus, uas ua rau muaj kev pheej hmoo ntawm kev qhia txog kev ua yuam kev, tus nqi ntawm kev ua yuam kev yuav tsum nyob twj ywm rau theem qis.

Tab sis BPM yuav ua li cas nrog nws? Muaj ntau txoj hauv kev rau kev ua haujlwm ...
Qhov tseeb, lwm qhov kev siv ntawm cov txheej txheem kev lag luam yog nrov heev hauv peb cov kev daws teeb meem - los ntawm kev tshaj tawm cov ntsiab lus ntawm lub xeev txoj kev hloov pauv daim duab kos duab thiab kev sib txuas ntawm cov neeg ua haujlwm nrog kev lag luam logic rau kev hloov pauv. Hauv qhov no, lub xeev uas txiav txim siab txoj haujlwm tam sim no ntawm "cov ntaub ntawv" hauv cov txheej txheem kev lag luam yog tus cwj pwm ntawm "cov ntaub ntawv" nws tus kheej.

BPM style kev koom ua ke
Qhov no yog qhov txheej txheem zoo li thaum pib ntawm qhov project

Qhov nrov ntawm qhov kev siv no yog vim qhov txheeb ze simplicity thiab ceev ntawm kev tsim cov txheej txheem kev lag luam tawm. Txawm li cas los xij, raws li cov txheej txheem software txuas ntxiv ua ntau txoj hauv kev, qhov automated ib feem ntawm cov txheej txheem kev lag luam loj hlob thiab ua ntau dua. Yuav tsum tau decomposition, rov siv dua ntawm cov txheej txheem, nrog rau cov txheej txheem branching kom txhua ceg raug tua nyob rau hauv parallel. Nyob rau hauv cov xwm txheej zoo li no, lub cuab yeej ua tsis yooj yim, thiab lub xeev daim duab hloov pauv poob nws cov ntaub ntawv cov ntsiab lus (kev sib koom ua ke tsis cuam tshuam rau hauv daim duab txhua).

BPM style kev koom ua ke
Qhov no yog dab tsi tus txheej txheem zoo li tom qab ob peb iterations ntawm yuav tsum tau kom meej meej.

Txoj kev tawm ntawm qhov teeb meem no yog kev koom ua ke ntawm lub cav jBPM rau hauv qee cov khoom nrog cov txheej txheem kev lag luam nyuaj tshaj plaws. Hauv lub sijhawm luv luv, qhov kev daws teeb meem no tau muaj kev vam meej: nws tau dhau los ua cov txheej txheem kev lag luam nyuaj thaum tuav cov ntaub ntawv ncaj ncees thiab muaj feem cuam tshuam hauv daim ntawv sau. BPMN2.

BPM style kev koom ua ke
Ib feem me me ntawm cov txheej txheem ua lag luam nyuaj

Nyob rau hauv lub sij hawm ntev, cov kev daws teeb meem tsis ua raws li qhov kev cia siab: kev siv zog ua haujlwm siab ntawm kev tsim cov txheej txheem kev lag luam los ntawm cov cuab yeej pom tsis tau tso cai ua tiav cov txiaj ntsig tau txais txiaj ntsig, thiab cov cuab yeej nws tus kheej tau dhau los ua ib qho tsis nyiam ntawm cov neeg tsim khoom. Kuj tseem muaj kev tsis txaus siab txog cov qauv sab hauv ntawm lub cav, uas ua rau pom ntau qhov "patches" thiab "crutches".

Lub ntsiab zoo ntawm kev siv jBPM yog kev paub txog cov txiaj ntsig thiab kev puas tsuaj ntawm kev ua lag luam piv txwv tus kheej lub xeev tsis tu ncua. Peb kuj tau pom qhov muaj peev xwm ntawm kev siv cov txheej txheem los siv cov txheej txheem kev sib koom ua ke ntawm cov kev siv sib txawv uas siv cov kev sib cuam tshuam asynchronous los ntawm cov cim thiab cov lus. Lub xub ntiag ntawm lub xeev tsis tu ncua plays lub luag haujlwm tseem ceeb hauv qhov no.

Raws li cov saum toj no, peb tuaj yeem xaus: Cov txheej txheem txoj hauv kev hauv BPM style tso cai rau peb los daws ntau yam dej num los ua kom cov txheej txheem ua lag luam nyuaj zuj zus, sib haum xeeb haum rau kev sib koom ua ke rau hauv cov txheej txheem no thiab tuav lub peev xwm los pom cov txheej txheem ua tiav hauv cov cim tsim nyog.

Disadvantages ntawm synchronous hu raws li ib tug integration qauv

Synchronous kev koom ua ke yog hais txog qhov yooj yim tshaj plaws thaiv kev hu. Ib lub subsystem ua raws li tus neeg rau zaub mov sab thiab nthuav tawm API nrog rau txoj kev xav tau. Lwm subsystem ua raws li tus neeg siv khoom sab thiab thaum lub sijhawm hu thiab tos rau qhov tshwm sim. Nyob ntawm qhov system architecture, cov neeg siv khoom thiab cov neeg rau zaub mov tuaj yeem nyob rau hauv tib daim ntawv thov thiab txheej txheem, lossis sib txawv. Nyob rau hauv rooj plaub thib ob, koj yuav tsum tau siv qee qhov kev siv RPC thiab muab kev sib tw ntawm cov kev txwv thiab qhov tshwm sim ntawm kev hu.

BPM style kev koom ua ke

Cov qauv kev sib koom ua ke no muaj cov txheej txheem loj ntawm qhov tsis zoo, tab sis nws tau siv dav hauv kev xyaum vim nws qhov yooj yim. Qhov ceev ntawm kev siv captivates thiab yuam koj siv nws dua thiab dua nyob rau hauv lub ntsej muag ntawm nias lub sijhawm kawg, sau cov kev daws teeb meem raws li cov nuj nqis. Tab sis nws kuj tshwm sim tias inexperienced developers siv nws unconsciously, tsuas yog tsis paub qhov tshwm sim tsis zoo.

Ntxiv nrog rau qhov pom tseeb tshaj plaws hauv kev sib txuas hauv subsystem, kuj tseem muaj teeb meem tsis tshua pom tseeb nrog "loj hlob" thiab "txog" kev lag luam. Tseeb, yog tias kev lag luam logic ua rau qee qhov kev hloov pauv, ces kev hloov pauv tsis tuaj yeem zam tau, thiab kev hloov pauv, tig mus, thaiv qee qhov kev thov cuam tshuam los ntawm cov kev hloov pauv no. Ntawd yog, kom txog rau thaum ib lub subsystem tos rau cov lus teb los ntawm lwm tus, nws yuav tsis tuaj yeem ua tiav qhov kev sib pauv thiab tshem tawm cov xauv. Qhov no ua rau muaj kev pheej hmoo ntawm ntau yam teebmeem:

  • Kev teb ntawm lub kaw lus poob, cov neeg siv tos ntev rau cov lus teb rau cov lus nug;
  • tus neeg rau zaub mov feem ntau tsis teb rau cov neeg siv cov lus thov vim muaj cov xov tooj ntau dhau: feem ntau ntawm cov xov raug kaw ntawm cov khoom siv los ntawm kev sib pauv;
  • Deadlocks pib tshwm sim: qhov tshwm sim ntawm lawv qhov tshwm sim muaj zog nyob ntawm lub sijhawm ntawm kev lag luam, tus nqi ntawm kev lag luam logic thiab cov xauv nkag rau hauv kev sib pauv;
  • kev ua lag luam timeout yuam kev tshwm sim;
  • tus neeg rau zaub mov "ua tsis tau" nrog OutOfMemory yog tias txoj haujlwm yuav tsum tau ua thiab hloov pauv cov ntaub ntawv ntau, thiab muaj kev sib koom ua ke ua rau nws nyuaj heev rau kev faib ua "teeb" sib dua.

Los ntawm qhov kev xav ntawm kev tsim vaj tsev, kev siv thaiv kev hu xov tooj thaum sib koom ua ke ua rau poob ntawm kev tswj hwm qhov zoo ntawm ib tus neeg subsystems: nws yog tsis yooj yim sua kom ntseeg tau lub hom phiaj zoo ntsuas ntawm ib lub subsystem nyob rau hauv kev sib cais los ntawm cov kev ntsuas zoo ntawm lwm subsystem. Yog tias cov subsystems tsim los ntawm cov pab pawg sib txawv, qhov no yog qhov teeb meem loj.

Tej yam tau txais txiaj ntsig ntau dua yog tias cov subsystems tau koom ua ke nyob rau hauv cov ntawv thov sib txawv thiab koj yuav tsum ua kom muaj kev hloov pauv ntawm ob sab. Yuav ua li cas kom ntseeg tau qhov kev hloov pauv ntawm cov kev hloov pauv no?

Yog tias cov kev hloov pauv tau ua nyob rau hauv kev sib cais, ces koj yuav tsum tau muab kev txhim khu kev qha tshwj xeeb tuav thiab them nyiaj, thiab qhov no tshem tawm tag nrho cov txiaj ntsig tseem ceeb ntawm kev sib koom ua ke - simplicity.

Kev faib khoom lag luam kuj tuaj rau hauv siab, tab sis peb tsis siv lawv hauv peb cov kev daws teeb meem: nws nyuaj rau kev ntseeg tau.

"Saga" raws li kev daws teeb meem kev lag luam

Nrog rau kev loj hlob ntawm microservices, qhov kev thov rau Saga Pattern.

Cov qauv no zoo kawg nkaus daws cov teeb meem saum toj no ntawm kev ua lag luam ntev, thiab tseem nthuav dav lub peev xwm ntawm kev tswj hwm lub xeev ntawm cov txheej txheem los ntawm ib sab ntawm kev lag luam logic: kev them nyiaj tom qab kev lag luam ua tsis tiav yuav tsis thim rov qab rau hauv nws lub xeev qub, tab sis muab lwm txoj kev ua cov ntaub ntawv. Qhov no kuj tso cai rau koj kom tsis txhob rov ua tiav cov ntaub ntawv ua tiav cov kauj ruam thaum sim coj cov txheej txheem mus rau qhov kawg "zoo".

Interestingly, nyob rau hauv monolithic systems no tus qauv kuj tseem ceeb thaum nws los txog rau kev koom ua ke ntawm loosely coupled subsystems thiab tsis zoo tshwm sim los ntawm kev khiav hauj lwm mus sij hawm ntev thiab cov kev pab cuam locks yog pom.

Hais txog peb cov txheej txheem kev lag luam hauv BPM style, nws hloov tawm kom yooj yim heev rau kev siv "Sagas": tus kheej cov kauj ruam ntawm "Saga" tuaj yeem raug teev raws li kev ua ub no hauv cov txheej txheem kev lag luam, thiab lub xeev tsis tu ncua ntawm cov txheej txheem lag luam kuj txiav txim siab lub xeev sab hauv ntawm "Saga". Ntawd yog, peb tsis tas yuav muaj kev sib koom tes ntxiv. Txhua yam koj xav tau yog tus xa xov xwm uas txhawb nqa "tsawg kawg ib zaug" lav raws li kev thauj mus los.

Tab sis qhov kev daws teeb meem no kuj muaj nws tus kheej "tus nqi":

  • kev lag luam logic ua ntau nyuaj: cov nyiaj yuav tsum tau ua kom tiav;
  • nws yuav tsim nyog tso tseg tag nrho cov sib xws, uas tuaj yeem yog qhov tshwj xeeb tshaj yog rau cov kab ke monolithic;
  • Lub architecture ua ib qho nyuaj me ntsis, thiab ib qho kev xav tau ntxiv rau cov lus broker tshwm;
  • Kev saib xyuas ntxiv thiab kev tswj hwm cov cuab yeej yuav tsum tau (txawm hais tias feem ntau qhov no yog qhov zoo: qhov kev pabcuam zoo yuav nce ntxiv).

Rau cov kab ke monolithic, qhov kev ncaj ncees rau kev siv "Sag" tsis yog li pom tseeb. Rau microservices thiab lwm yam SOA, qhov feem ntau yuav muaj ib tug broker, thiab tag nrho cov sib xws yog txi thaum pib ntawm qhov project, cov txiaj ntsig ntawm kev siv cov qauv no tuaj yeem ua rau muaj qhov tsis zoo, tshwj xeeb tshaj yog tias muaj API yooj yim ntawm kev lag luam logic. qib.

Encapsulating kev lag luam logic hauv microservices

Thaum peb pib sim nrog microservices, ib lo lus nug tsim nyog tau tshwm sim: qhov twg yuav tso qhov kev lag luam kev lag luam hauv kev cuam tshuam nrog cov kev pabcuam uas ua kom muaj kev pheej hmoo ntawm cov ntaub ntawv sau npe?

Thaum saib cov architecture ntawm ntau yam BPMSs, nws yuav zoo li tsim nyog los cais kev lag luam logic los ntawm kev pheej hmoo: tsim ib txheej ntawm platform thiab domain-independent microservices uas tsim ib puag ncig thiab ntim rau kev ua lag luam kev lag luam logic, thiab tsim kom muaj kev pheej hmoo ntawm cov ntaub ntawv sau npe. ib txheej nyias ntawm qhov yooj yim heev thiab lub teeb yuag microservices. Cov txheej txheem ua lag luam nyob rau hauv cov ntaub ntawv no ua orchestration ntawm cov kev pab cuam ntawm cov persistence txheej.

BPM style kev koom ua ke

Txoj hauv kev no muaj qhov txiaj ntsig loj heev: koj tuaj yeem ua kom lub luag haujlwm ntawm lub platform ntau npaum li koj nyiam, thiab tsuas yog cov txheej txheem sib txuas ntawm lub platform microservices yuav dhau los ua "rog" los ntawm qhov no. Cov txheej txheem kev lag luam los ntawm txhua tus sau npe tam sim ntawd tuaj yeem siv cov haujlwm tshiab ntawm lub platform sai li sai tau thaum hloov kho.

Ib txoj kev tshawb fawb ntxaws ntxiv qhia txog qhov tsis zoo ntawm txoj hauv kev no:

  • ib qho kev pabcuam platform uas ua tiav kev lag luam logic ntawm ntau tus thawj tswj hwm ib zaug ua rau muaj kev pheej hmoo loj raws li ib qho ntawm qhov tsis ua tiav. Kev hloov pauv ntau zaus rau kev lag luam logic ua rau muaj kev pheej hmoo ntawm kev ua yuam kev ua rau kev ua tsis tiav thoob plaws hauv lub cev;
  • Cov teeb meem kev ua haujlwm: kev lag luam logic ua haujlwm nrog nws cov ntaub ntawv los ntawm qhov nqaim thiab qeeb interface:
    • cov ntaub ntawv yuav ib zaug ntxiv marshalled thiab pumped los ntawm lub network pawg;
    • ib qho kev pabcuam sau npe feem ntau yuav muab cov ntaub ntawv ntau dua li qhov xav tau rau kev lag luam logic los ua haujlwm vim tsis muaj peev xwm txaus rau parameterizing kev thov ntawm qib ntawm API sab nraud ntawm qhov kev pabcuam;
    • ob peb qhov kev ywj pheej ntawm kev lag luam logic tuaj yeem rov thov tib cov ntaub ntawv rau kev ua haujlwm (qhov teeb meem no tuaj yeem txo tau los ntawm kev ntxiv cov khoom sib tham uas cov ntaub ntawv cache, tab sis qhov no ua rau nyuaj rau cov qauv tsim thiab tsim teeb meem ntawm cov ntaub ntawv cuam tshuam thiab cache invalidation);
  • teeb meem kev hloov pauv:
    • cov txheej txheem kev lag luam nrog lub xeev tsis tu ncua, uas yog khaws cia los ntawm kev pabcuam platform, tsis sib haum nrog cov ntaub ntawv sau npe, thiab tsis muaj txoj hauv kev yooj yim los daws qhov teeb meem no;
    • tso cov ntaub ntawv sau npe thaiv sab nraum qhov kev lag luam: yog tias lub lag luam logic xav tau hloov pauv tom qab thawj zaug kuaj xyuas qhov tseeb ntawm cov ntaub ntawv tam sim no, nws yog ib qho tsim nyog kom tshem tawm qhov muaj peev xwm ntawm kev sib tw ntawm cov ntaub ntawv ua tiav. Kev thaiv cov ntaub ntawv sab nraud tuaj yeem pab daws qhov teeb meem, tab sis qhov kev daws teeb meem no muaj kev pheej hmoo ntxiv thiab txo qhov kev ntseeg tau ntawm tag nrho cov kab ke;
  • cov teeb meem ntxiv thaum hloov kho: qee zaum, qhov kev pabcuam persistence thiab kev lag luam logic yuav tsum tau hloov kho synchronously los yog nruj ua ntu zus.

Thaum kawg, peb yuav tsum rov qab mus rau hauv paus: encapsulate cov ntaub ntawv sau npe thiab sau cov lag luam logic rau hauv ib qho microservice. Txoj hauv kev no ua kom yooj yim rau kev nkag siab ntawm microservice ua ib qho tseem ceeb ntawm lub cev thiab tsis ua rau muaj teeb meem saum toj no. Qhov no kuj tsis pub dawb:

  • API standardization yuav tsum muaj kev cuam tshuam nrog kev lag luam logic (tshwj xeeb, muab cov neeg siv cov dej num raws li ib feem ntawm cov txheej txheem kev lag luam) thiab API platform kev pab cuam; yuav tsum tau ua tib zoo saib xyuas ntxiv rau API kev hloov pauv, kev sib raug zoo rau pem hauv ntej thiab rov qab;
  • Nws yog ib qho tsim nyog yuav tsum tau ntxiv cov tsev qiv ntawv runtime ntxiv los xyuas kom meej tias kev ua haujlwm ntawm kev lag luam logic yog ib feem ntawm txhua qhov kev pabcuam microservice, thiab qhov no ua rau muaj kev xav tau tshiab rau cov tsev qiv ntawv: lightness thiab tsawg kawg ntawm kev hloov pauv hloov pauv;
  • kev lag luam logic developers yuav tsum tau saib xyuas cov tsev qiv ntawv versions: yog hais tias ib tug microservice tsis tau ua tiav rau lub sij hawm ntev, ces nws yuav feem ntau yuav muaj ib tug outdated version ntawm cov tsev qiv ntawv. Qhov no tuaj yeem yog qhov tsis txaus siab rau kev ntxiv ib qho tshiab thiab yuav xav tau kev hloov pauv cov kev lag luam qub ntawm cov kev pabcuam no rau cov tsev qiv ntawv tshiab yog tias muaj kev hloov pauv tsis sib xws ntawm cov qauv.

BPM style kev koom ua ke

Ib txheej ntawm cov kev pabcuam platform kuj muaj nyob rau hauv xws li kev tsim qauv, tab sis txheej txheej no tsis tsim lub thawv rau kev ua lag luam kev lag luam logic, tab sis tsuas yog nws ib puag ncig, muab kev pabcuam "platform" ua haujlwm. Xws li ib txheej yog xav tau tsis yog tsuas yog los tswj lub teeb yuag xwm ntawm domain microservices, tab sis kuj rau centralize tswj.

Piv txwv li, cov neeg siv cov dej num hauv cov txheej txheem kev lag luam tsim cov haujlwm. Txawm li cas los xij, thaum ua haujlwm nrog cov haujlwm, tus neeg siv yuav tsum pom cov dej num los ntawm txhua tus thawj tswj hwm hauv cov npe dav dav, uas txhais tau tias yuav tsum muaj kev sib koom ua haujlwm sib koom ua haujlwm rau npe, tshem tawm ntawm kev lag luam logic. Kev tuav pov hwm ntawm kev lag luam logic hauv cov ntsiab lus no yog qhov teeb meem heev, thiab qhov no yog lwm qhov kev cuam tshuam ntawm qhov kev tsim vaj tsev no.

Kev koom ua ke ntawm cov txheej txheem kev lag luam los ntawm qhov muag ntawm tus tsim daim ntawv thov

Raws li tau hais los saum toj no, tus tsim daim ntawv thov yuav tsum tau ua kom pom tseeb los ntawm cov txuj ci thiab kev tsim vaj tsev ntawm kev siv cov kev sib cuam tshuam ntawm ntau daim ntawv thov kom ib tus tuaj yeem suav nrog kev tsim khoom zoo.

Cia peb sim daws qhov teeb meem nyuaj sib koom ua ke, tshwj xeeb tshaj yog tsim rau kab lus. Qhov no yuav yog "kev ua si" ua haujlwm nrog peb daim ntawv thov, qhov twg lawv txhua tus txhais lub npe sau npe: "app1", "app2", "app3".

Hauv txhua daim ntawv thov, cov txheej txheem kev lag luam tau pib pib "ua si pob" los ntawm kev sib koom ua ke tsheb npav. Cov lus nrog lub npe "Pob" yuav ua raws li lub pob.

Cov kev cai ntawm qhov kev ua si:

  • thawj tus neeg ua si yog tus pib. Nws caw lwm tus neeg ua si rau qhov kev ua si, pib qhov kev ua si thiab tuaj yeem xaus rau txhua lub sijhawm;
  • lwm tus players tshaj tawm lawv txoj kev koom tes hauv kev ua si, "tau paub" ib leeg thiab thawj tus neeg ua si;
  • tom qab tau txais pob, tus neeg uas ua ntawv xaiv lwm tus neeg uas koom nrog thiab hla lub pob rau nws. Tag nrho cov kis tau tus mob raug suav;
  • Txhua tus neeg ua si muaj "zog" uas txo qis nrog txhua qhov kis ntawm pob los ntawm tus neeg uas ua ntawv. Thaum lub zog khiav tawm, tus neeg ua si tawm ntawm qhov kev ua si, tshaj tawm nws txoj haujlwm tawm;
  • Yog hais tias tus neeg uas ua ntawv nyob ib leeg, nws tam sim ntawd tshaj tawm nws tawm mus;
  • Thaum txhua tus players raug tshem tawm, thawj tus neeg ua si tshaj tawm qhov kev ua si dhau. Yog tias nws tawm ntawm qhov kev ua si ntxov, nws tseem ua raws li qhov kev ua si kom tiav.

Txhawm rau daws qhov teeb meem no, kuv yuav siv peb DSL rau cov txheej txheem kev lag luam, uas tso cai rau peb piav qhia txog cov laj thawj hauv Kotlin compactly, nrog tsawg kawg ntawm boilerplate.

Cov txheej txheem kev lag luam ntawm thawj tus neeg ua si (aka tus pib ntawm qhov kev ua si) yuav ua haujlwm hauv app1 daim ntawv thov:

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

Ntxiv nrog rau kev ua lag luam logic, cov cai saum toj no tuaj yeem tsim cov khoom qauv ntawm cov txheej txheem kev lag luam, uas tuaj yeem pom hauv daim duab kos duab. Peb tseem tsis tau siv lub visualizer, yog li peb yuav tsum tau siv sij hawm me ntsis kev kos duab (ntawm no kuv ua kom yooj yim me ntsis ntawm BPMN cov lus hais txog kev siv lub rooj vag los txhim kho qhov sib xws ntawm daim duab nrog cov cai hauv qab no):

BPM style kev koom ua ke

app2 yuav suav nrog lwm tus neeg ua si cov txheej txheem kev lag luam:

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

Daim duab:

BPM style kev koom ua ke

Hauv daim ntawv thov app3 peb yuav ua rau tus neeg ua si nrog tus cwj pwm txawv me ntsis: es tsis txhob xaiv tus neeg ua si tom ntej, nws yuav ua raws li kev sib tw-robin algorithm:

Chav Kawm 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}")
}

Txwv tsis pub, tus neeg ua si tus cwj pwm tsis txawv ntawm qhov dhau los, yog li daim duab tsis hloov.

Tam sim no peb xav tau ib qho kev sim kom khiav tag nrho cov no. Kuv yuav muab cov cai ntawm qhov kev xeem nws tus kheej nkaus xwb, yog li tsis txhob cuam tshuam cov kab lus nrog lub boilerplate (qhov tseeb, kuv siv qhov chaw sim tsim ua ntej los ntsuas kev sib koom ua ke ntawm lwm cov txheej txheem kev lag luam):

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

Cia peb khiav qhov kev xeem thiab saib lub cav:

console tso zis

Взята Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΊΠ»ΡŽΡ‡Π° 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!

Los ntawm tag nrho cov no peb tuaj yeem kos ntau cov lus xaus tseem ceeb:

  • nrog rau cov cuab yeej tsim nyog, cov neeg tsim daim ntawv thov tuaj yeem tsim kev sib koom ua ke ntawm cov ntawv thov yam tsis muaj kev cuam tshuam kev lag luam logic;
  • qhov nyuaj ntawm txoj haujlwm kev sib koom ua ke uas yuav tsum muaj kev txawj ntse engineering tuaj yeem muab zais rau hauv lub moj khaum yog tias qhov no yog thawj zaug suav nrog hauv architecture ntawm lub moj khaum. Qhov nyuaj ntawm qhov teeb meem tsis tuaj yeem muab zais, yog li kev daws teeb meem nyuaj hauv cov lej yuav zoo li nws;
  • Thaum txhim kho kev sib koom ua ke, nws yog ib qho tseem ceeb uas yuav tsum tau coj mus rau hauv tus account qhov tshwm sim sib xws thiab qhov tsis muaj kev hloov pauv ntawm kev hloov pauv hauv lub xeev ntawm txhua tus neeg koom nrog kev koom ua ke. Qhov no ua rau peb nyuaj rau qhov kev xav kom ua rau nws tsis xis nyob rau qhov kev txiav txim uas tshwm sim sab nraud. Hauv peb qhov piv txwv, tus neeg ua si raug yuam kom koom nrog hauv qhov kev ua si tom qab nws tshaj tawm nws tawm ntawm qhov kev ua si: lwm tus neeg ua si yuav txuas ntxiv hla lub pob rau nws kom txog thaum cov ntaub ntawv hais txog nws qhov kev tawm mus txog thiab ua tiav los ntawm txhua tus neeg koom. Qhov kev xav no tsis ua raws li cov cai ntawm qhov kev ua si thiab yog qhov kev daws teeb meem tsis txaus ntseeg nyob rau hauv lub moj khaum ntawm kev xaiv architecture.

Tom ntej no, peb yuav tham txog ntau yam intricacies ntawm peb txoj kev daws teeb meem, kev sib haum xeeb thiab lwm yam ntsiab lus.

Tag nrho cov lus nyob hauv ib kab

Txhua daim ntawv thov kev koom ua ke ua haujlwm nrog ib lub npav sib koom ua ke, uas tau nthuav tawm hauv daim ntawv ntawm tus neeg sab nraud, ib qho BPMQueue rau cov lus thiab ib lub ntsiab lus BPMTopic rau cov teeb liab (cov xwm txheej). Muab tag nrho cov lus los ntawm ib kab yog nws tus kheej kev sib haum xeeb. Nyob rau theem kev lag luam logic, tam sim no koj tuaj yeem qhia ntau hom lus tshiab raws li koj nyiam yam tsis tau hloov pauv rau cov qauv txheej txheem. Qhov no yog qhov yooj yim yooj yim, tab sis nws muaj qee qhov kev pheej hmoo, uas nyob rau hauv cov ntsiab lus ntawm peb cov dej num tsis zoo li tseem ceeb rau peb.

BPM style kev koom ua ke

Txawm li cas los xij, muaj ib qho kev nkag siab ntawm no: txhua daim ntawv thov lim "nws" cov lus los ntawm kab ntawm qhov nkag, los ntawm lub npe ntawm nws lub npe. Lub npe tseem tuaj yeem teev nyob rau hauv cov cim yog tias koj xav tau txwv qhov "scope of visibility" ntawm lub teeb liab rau ib daim ntawv thov. Qhov no yuav tsum tau nce lub tsheb npav hla, tab sis kev lag luam logic yuav tsum tam sim no ua haujlwm nrog cov npe sau npe: rau kev hais lus - yuav tsum tau, rau cov teeb liab - xav tau.

Ua kom muaj kev sib koom ua ke hauv tsheb npav kev ntseeg siab

Kev ntseeg tau muaj ntau lub ntsiab lus:

  • Cov lus xaiv tus broker yog ib qho tseem ceeb ntawm kev tsim vaj tsev thiab ib qho kev ua tsis tiav: nws yuav tsum muaj kev ua txhaum txaus. Koj yuav tsum tsuas yog siv lub sijhawm sim ua haujlwm, nrog kev txhawb nqa zoo thiab lub zej zog loj;
  • Nws yog ib qho tsim nyog los xyuas kom meej tias muaj ntau cov lus broker, uas nws yuav tsum tau muab cais tawm ntawm lub cev los ntawm cov ntawv thov kev sib koom ua ke (qhov muaj ntau ntawm cov ntawv thov nrog kev ua lag luam logic yog qhov nyuaj thiab kim heev los xyuas kom meej);
  • tus broker yuav tsum tau muab "tsawg kawg ib zaug" lav kev xa khoom. Qhov no yog qhov yuav tsum tau ua rau kev ua haujlwm txhim khu kev qha ntawm kev sib koom ua ke tsheb npav. Tsis tas yuav tsum tau "tseem ceeb ib zaug" qib lav: cov txheej txheem kev lag luam, raws li txoj cai, tsis muaj kev cuam tshuam rau qhov rov tuaj txog ntawm cov lus lossis cov xwm txheej, thiab hauv cov haujlwm tshwj xeeb uas qhov no tseem ceeb, nws yooj yim dua ntxiv cov tshev rau kev lag luam. logic tshaj li niaj zaus siv heev "kim" " guarantees;
  • xa cov lus thiab cov teeb liab yuav tsum tau koom nrog hauv kev lag luam tag nrho nrog kev hloov pauv hauv lub xeev cov txheej txheem kev lag luam thiab cov ntaub ntawv sau npe. Qhov kev xaiv zoo dua yuav yog siv tus qauv Transactional Outbox, tab sis nws yuav xav tau ib lub rooj ntxiv nyob rau hauv lub database thiab ib tug repeater. Hauv daim ntawv thov JEE, qhov no tuaj yeem ua kom yooj yim los ntawm kev siv tus thawj tswj hwm hauv zos JTA, tab sis kev sib txuas rau tus broker xaiv yuav tsum tuaj yeem ua haujlwm hauv XA;
  • cov neeg ua haujlwm ntawm cov lus xa tuaj thiab cov xwm txheej yuav tsum tau ua haujlwm nrog kev sib pauv hloov pauv lub xeev ntawm cov txheej txheem kev lag luam: yog tias qhov kev hloov pauv no tau dov rov qab, ces qhov tau txais cov lus yuav tsum raug muab tso tseg;
  • cov lus uas tsis tuaj yeem xa tuaj vim yog qhov yuam kev yuav tsum tau muab cia rau hauv ib qho chaw cia D.L.Q. (Dead Letter Queue). Rau lub hom phiaj no, peb tsim ib lub platform microservice cais uas khaws cov lus zoo li no hauv nws qhov chaw cia, ntsuas lawv los ntawm cov cwj pwm (rau kev pab pawg sai thiab tshawb nrhiav), thiab nthuav tawm API rau kev saib, rov xa mus rau qhov chaw nyob, thiab tshem tawm cov lus. Cov thawj tswj hwm tuaj yeem ua haujlwm nrog cov kev pabcuam no los ntawm lawv lub vev xaib interface;
  • Hauv kev teeb tsa tus broker, koj yuav tsum tau kho tus naj npawb ntawm cov khoom xa rov qab thiab ncua sij hawm ntawm cov khoom xa tuaj kom txo tau cov lus tau txais mus rau DLQ (nws yuav luag tsis tuaj yeem xam qhov pom tsis zoo, tab sis koj tuaj yeem ua raws li empirically thiab kho lawv thaum lub sijhawm ua haujlwm. );
  • Lub khw DLQ yuav tsum tau saib xyuas tsis tu ncua, thiab cov kev saib xyuas yuav tsum ceeb toom rau cov thawj coj ua haujlwm kom thaum cov lus tsis xa tuaj, lawv tuaj yeem teb sai li sai tau. Qhov no yuav txo qhov "kev cuam tshuam cheeb tsam" ntawm kev ua tsis tiav lossis kev lag luam logic yuam kev;
  • lub tsheb npav kev koom ua ke yuav tsum yog qhov tsis txaus ntseeg rau qhov tsis muaj ib ntus ntawm daim ntawv thov: kev tso npe mus rau ib lub ncauj lus yuav tsum tau ua kom ntev, thiab lub npe ntawm daim ntawv thov yuav tsum yog qhov tshwj xeeb kom thaum daim ntawv thov tsis tuaj, lwm tus yuav tsis sim ua nws cov lus los ntawm kab.

Kev ruaj ntseg xov ntawm kev lag luam logic

Tib qhov piv txwv ntawm cov txheej txheem kev lag luam tuaj yeem tau txais ntau cov lus thiab cov xwm txheej ib zaug, kev ua haujlwm ntawm qhov yuav pib ua ke. Nyob rau tib lub sijhawm, rau tus tsim daim ntawv thov, txhua yam yuav tsum yooj yim thiab muaj kev nyab xeeb.

Kev lag luam logic ntawm cov txheej txheem txheej txheem txhua qhov xwm txheej sab nraud uas cuam tshuam rau cov txheej txheem kev lag luam ib tus zuj zus. Cov xwm txheej zoo li no tuaj yeem yog:

  • pib ua lag luam ua piv txwv;
  • tus neeg siv kev txiav txim ntsig txog kev ua haujlwm hauv cov txheej txheem kev lag luam;
  • tau txais cov lus los yog teeb liab rau qhov kev ua lag luam ua piv txwv tau sau npe;
  • ua rau lub sijhawm teem los ntawm kev ua lag luam piv txwv;
  • tswj kev txiav txim ntawm API (piv txwv li, cov txheej txheem cuam tshuam).

Txhua qhov xwm txheej zoo li no tuaj yeem hloov pauv lub xeev ntawm cov txheej txheem kev lag luam: qee qhov kev ua ub no yuav xaus thiab lwm tus yuav pib, thiab cov txiaj ntsig ntawm kev pheej hmoo yuav hloov. Kaw ib qho kev ua ub no yuav ua rau kom muaj ib lossis ntau dua ntawm cov dej num hauv qab no. Cov, nyob rau hauv lem, tuaj yeem nres tos lwm yam xwm txheej lossis, yog tias lawv tsis xav tau cov ntaub ntawv ntxiv, tuaj yeem ua tiav hauv tib qho kev hloov pauv. Ua ntej kaw qhov kev hloov pauv, lub xeev tshiab ntawm cov txheej txheem kev lag luam raug cawm hauv cov ntaub ntawv, qhov chaw nws yuav tos rau qhov tshwm sim sab nraud tom ntej.

Cov ntaub ntawv ua lag luam tsis tu ncua khaws cia hauv cov ntaub ntawv sib raug zoo yog qhov yooj yim heev rau kev ua haujlwm synchronizing yog tias koj siv SELECT FOR UPDATE. Yog tias ib qho kev lag luam tswj hwm kom tau txais lub xeev ntawm cov txheej txheem kev lag luam los ntawm lub hauv paus rau kev hloov pauv, ces tsis muaj lwm yam kev lag luam nyob rau hauv tib lub sijhawm yuav muaj peev xwm tau txais tib lub xeev rau lwm qhov kev hloov pauv, thiab tom qab ua tiav ntawm thawj qhov kev hloov pauv, qhov thib ob yog. guaranteed tau txais lub xeev hloov lawm.

Siv lub ntsuas pim tsis zoo ntawm DBMS sab, peb ua tiav txhua qhov tsim nyog acid, thiab tseem khaws lub peev xwm los ntsuas daim ntawv thov nrog kev lag luam logic los ntawm kev nce tus lej ntawm kev khiav haujlwm.

Txawm li cas los xij, qhov ntsuas pim tsis zoo ua rau peb muaj kev tsis sib haum xeeb, uas txhais tau hais tias SELECT FOR UPDATE tseem yuav tsum tau txwv rau qee lub sijhawm tsim nyog nyob rau hauv cov ntaub ntawv kev tuag tshwm sim ntawm qee qhov xwm txheej loj hauv kev lag luam logic.

Lwm qhov teeb meem yog qhov synchronization ntawm kev pib ua lag luam. Thaum tsis muaj qhov piv txwv ntawm cov txheej txheem kev lag luam, tsis muaj lub xeev hauv cov ntaub ntawv, yog li cov txheej txheem piav qhia yuav tsis ua haujlwm. Yog tias koj xav tau kom ntseeg tau qhov tsis sib xws ntawm cov txheej txheem kev lag luam hauv ib qho tshwj xeeb, ces koj yuav xav tau qee yam khoom siv synchronization cuam tshuam nrog cov txheej txheem hauv chav kawm thiab qhov sib thooj. Txhawm rau daws qhov teeb meem no, peb siv lub tshuab xauv sib txawv uas tso cai rau peb txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txheeb xyuas los ntawm tus yuam sij hauv URI hom los ntawm kev pabcuam sab nraud.

Hauv peb cov piv txwv, cov txheej txheem kev lag luam InitialPlayer muaj cov lus tshaj tawm

uniqueConstraint = UniqueConstraints.singleton

Yog li ntawd, lub cav muaj cov lus hais txog kev noj thiab tso lub xauv ntawm tus yuam sij sib raug. Tsis muaj cov lus zoo li no rau lwm cov txheej txheem kev lag luam: kev txwv tsis pub muaj teeb meem.

Teeb meem ntawm cov txheej txheem kev lag luam nrog lub xeev tsis tu ncua

Qee lub sij hawm muaj lub xeev tsis tu ncua tsis tsuas yog pab tau, tab sis kuj tseem cuam tshuam kev loj hlob.
Cov teeb meem pib thaum hloov pauv yuav tsum tau ua rau kev lag luam logic thiab / lossis cov qauv txheej txheem kev lag luam. Tsis yog txhua qhov kev hloov pauv no yog sib xws nrog lub xeev qub ntawm cov txheej txheem kev lag luam. Yog tias muaj ntau qhov xwm txheej nyob hauv cov ntaub ntawv, ces kev hloov pauv tsis sib xws tuaj yeem ua rau muaj teeb meem ntau, uas peb feem ntau ntsib thaum siv jBPM.

Nyob ntawm qhov tob ntawm qhov kev hloov pauv, koj tuaj yeem ua ob txoj hauv kev:

  1. tsim cov txheej txheem kev lag luam tshiab kom tsis txhob ua kom tsis sib haum xeeb rau qhov qub, thiab siv nws tsis yog qhov qub thaum tso tawm cov xwm txheej tshiab. Cov ntawv luam qub yuav ua haujlwm txuas ntxiv "zoo li ua ntej";
  2. migrate lub xeev tsis tu ncua ntawm cov txheej txheem kev lag luam thaum hloov kho kev lag luam logic.

Thawj txoj kev yog yooj yim dua, tab sis muaj nws cov kev txwv thiab qhov tsis zoo, piv txwv li:

  • duplication ntawm kev lag luam logic nyob rau hauv ntau cov qauv kev lag luam, nce ntim ntawm kev lag luam logic;
  • Feem ntau yuav tsum muaj kev hloov pauv tam sim rau kev lag luam tshiab (raws li kev ua haujlwm ntawm kev sib koom ua ke - yuav luag ib txwm);
  • tus tsim tawm tsis paub nyob rau hauv dab tsi point outdated qauv yuav deleted.

Hauv kev xyaum peb siv ob txoj hauv kev, tab sis tau txiav txim siab ntau los ua kom peb lub neej yooj yim dua:

  • Hauv cov ntaub ntawv, lub xeev tsis tu ncua ntawm cov txheej txheem kev lag luam yog khaws cia rau hauv ib qho yooj yim nyeem tau thiab ua tiav daim ntawv: hauv JSON hom hlua. Qhov no tso cai rau kev tsiv teb tsaws tuaj yeem ua ob qho tib si hauv daim ntawv thov thiab sab nraud. Raws li qhov chaw kawg, koj tuaj yeem kho nws manually (tshwj xeeb tshaj yog muaj txiaj ntsig hauv kev txhim kho thaum lub sijhawm debugging);
  • kev sib koom ua lag luam logic tsis siv cov npe ntawm cov txheej txheem ua lag luam, yog li txhua lub sijhawm nws muaj peev xwm hloov qhov kev siv ntawm ib qho ntawm cov txheej txheem koom nrog ib lub npe tshiab (piv txwv li, "InitialPlayerV2"). Kev sib khi tshwm sim los ntawm cov lus thiab cov cim npe;
  • tus qauv txheej txheem muaj tus lej version, uas peb nce ntxiv yog tias peb hloov pauv tsis haum rau tus qauv no, thiab tus lej no tau txais kev cawmdim nrog rau lub xeev ntawm cov txheej txheem piv txwv;
  • lub xeev tsis tu ncua ntawm cov txheej txheem yog nyeem los ntawm cov ntaub ntawv ua ntej mus rau hauv cov khoom siv yooj yim qauv, uas cov txheej txheem tsiv teb tsaws tuaj yeem ua haujlwm nrog yog tus qauv version tus lej hloov pauv;
  • cov txheej txheem tsiv teb tsaws raug muab tso rau ib sab ntawm kev lag luam logic thiab hu ua "tub nkeeg" rau txhua qhov piv txwv ntawm cov txheej txheem kev lag luam thaum lub sijhawm nws rov qab los ntawm cov ntaub ntawv;
  • Yog tias koj xav tau tsiv teb tsaws lub xeev ntawm tag nrho cov xwm txheej ceev thiab synchronously, ntau cov kev hloov pauv cov ntaub ntawv qub tau siv, tab sis koj yuav tsum ua haujlwm nrog JSON.

Koj puas xav tau lwm lub hauv paus rau kev ua lag luam?

Cov kev daws teeb meem tau piav qhia hauv tsab xov xwm tau tso cai rau peb kom yooj yim rau peb lub neej, nthuav dav ntau yam ntawm cov teeb meem daws teeb meem ntawm cov ntawv thov kev txhim kho, thiab ua kom lub tswv yim ntawm kev sib cais kev lag luam logic rau hauv microservices zoo nkauj dua. Txhawm rau ua tiav qhov no, ntau txoj haujlwm tau ua tiav, tsim "lub teeb" lub hauv paus rau cov txheej txheem kev lag luam, nrog rau cov khoom siv los daws cov teeb meem hauv cov ntsiab lus ntawm ntau yam teeb meem ntawm daim ntawv thov. Peb muaj lub siab xav qhia cov txiaj ntsig no thiab ua kom muaj kev txhim kho ntawm cov khoom sib xyaw qhib kev nkag mus rau hauv daim ntawv tso cai pub dawb. Qhov no yuav xav tau qee qhov kev siv zog thiab sijhawm. Kev nkag siab txog qhov kev thov rau cov kev daws teeb meem no tuaj yeem yog qhov kev txhawb siab ntxiv rau peb. Nyob rau hauv tsab xov xwm uas tau hais tseg, kev saib xyuas me ntsis yog them rau lub peev xwm ntawm lub moj khaum nws tus kheej, tab sis qee qhov ntawm lawv pom los ntawm cov piv txwv tau nthuav tawm. Yog tias peb luam tawm peb lub moj khaum, ib tsab xov xwm cais yuav raug mob siab rau nws. Lub sijhawm no, peb yuav ua tsaug yog tias koj tawm tswv yim me ntsis los ntawm kev teb cov lus nug:

Tsuas yog cov neeg siv sau npe tuaj yeem koom nrog hauv daim ntawv ntsuam xyuas. Kos npe rau hauvthov.

Koj puas xav tau lwm lub hauv paus rau kev ua lag luam?

  • 18,8%Yog lawm, kuv tau nrhiav tej yam zoo li no ntev lawm

  • 12,5%Kuv xav kawm ntxiv txog koj qhov kev siv, tej zaum yuav muaj txiaj ntsig2

  • 6,2%Peb siv ib lub moj khaum uas twb muaj lawm, tab sis tab tom xav txog kev hloov 1

  • 18,8%Peb siv ib lub moj khaum uas twb muaj lawm, txhua yam zoo 3

  • 18,8%peb tswj tsis muaj lub moj khaum 3

  • 25,0%sau koj li 4

16 cov neeg siv pov npav. 7 cov neeg siv txwv tsis pub siv.

Tau qhov twg los: www.hab.com

Ntxiv ib saib