Paghiusa sa istilo sa BPM

Paghiusa sa istilo sa BPM

Kumusta, Si Habr!

Ang among kompanya nag-espesyalisar sa pagpauswag sa mga solusyon sa software nga klase sa ERP, diin ang bahin sa leon giokupahan sa mga sistema sa transaksyon nga adunay daghang kantidad sa lohika sa negosyo ug dagan sa trabaho a la EDMS. Ang mga modernong bersyon sa among mga produkto gibase sa mga teknolohiya sa JavaEE, apan aktibo usab kami nga nag-eksperimento sa mga microservice. Usa sa labing problemado nga mga lugar sa ingon nga mga solusyon mao ang paghiusa sa lainlaing mga subsystem nga may kalabotan sa kasikbit nga mga dominyo. Ang mga buluhaton sa paghiusa kanunay nga naghatag kanamo usa ka dako nga labad sa ulo, bisan unsa pa ang mga istilo sa arkitektura, mga stack sa teknolohiya ug mga balangkas nga among gigamit, apan bag-ohay lang adunay pag-uswag sa pagsulbad sa ingon nga mga problema.

Sa artikulo nga gidala sa imong pagtagad, akong hisgutan ang bahin sa kasinatian ug panukiduki sa arkitektura sa NPO Krista sa gitudlo nga lugar. Atong hisgotan usab ang usa ka pananglitan sa usa ka yano nga solusyon sa usa ka problema sa panagsama gikan sa punto sa pagtan-aw sa usa ka developer sa aplikasyon ug mahibal-an kung unsa ang gitago sa luyo niini nga kayano.

Disclaimer

Ang mga solusyon sa arkitektura ug teknikal nga gihulagway sa artikulo gitanyag nako base sa personal nga kasinatian sa konteksto sa piho nga mga buluhaton. Kini nga mga solusyon wala mag-angkon nga unibersal ug mahimong dili kamalaumon ubos sa ubang mga kondisyon sa paggamit.

Unsa may kalabotan niini sa BPM?

Aron matubag kini nga pangutana, kinahanglan naton nga usisahon ang mga detalye sa mga gipadapat nga mga problema sa atong mga solusyon. Ang panguna nga bahin sa lohika sa negosyo sa among naandan nga sistema sa transaksyon mao ang pagsulod sa datos sa database pinaagi sa mga interface sa gumagamit, mano-mano ug awtomatiko nga susihon kini nga datos, nga gipasa kini sa pipila ka daloy sa trabaho, gipatik kini sa lain nga sistema / analytical database / archive, paghimo mga taho. Busa, ang yawe nga function sa sistema alang sa mga kustomer mao ang automation sa ilang internal nga mga proseso sa negosyo.

Alang sa kasayon, gigamit namo ang termino nga "dokumento" sa komunikasyon isip pipila ka abstraction sa usa ka set sa datos, nga gihiusa sa usa ka komon nga yawe, diin ang usa ka piho nga workflow mahimong "gilakip".
Apan komosta ang lohika sa panagsama? Pagkahuman, ang tahas sa panagsama gihimo sa arkitektura sa sistema, nga "giputol" sa mga bahin DILI sa hangyo sa kustomer, apan sa ilawom sa impluwensya sa hingpit nga lainlaing mga hinungdan:

  • ubos sa impluwensya sa balaod ni Conway;
  • isip resulta sa paggamit pag-usab sa mga subsystem nga naugmad kaniadto alang sa ubang mga produkto;
  • ingon nga gidesisyonan sa arkitekto, base sa mga kinahanglanon nga dili magamit.

Adunay usa ka dako nga tintasyon sa pagbulag sa integration logic gikan sa negosyo logic sa nag-unang workflow aron dili mahugawan ang negosyo logic uban sa integration artifacts ug sa pagluwas sa mga aplikasyon developer gikan sa pag-deve sa mga peculiarities sa arkitektura talan-awon sa sistema. Kini nga pamaagi adunay daghang mga bentaha, apan ang pagpraktis nagpakita sa pagkadili epektibo niini:

  • Ang pagsulbad sa mga problema sa integrasyon kasagarang mag-slide ngadto sa pinakasimple nga mga kapilian sa porma sa mga dungan nga tawag tungod sa limitado nga extension nga mga punto sa pagpatuman sa nag-unang workflow (labaw pa sa mga kakulangan sa synchronous integration sa ubos);
  • ang mga artifact sa panagsama molusot gihapon sa panguna nga lohika sa negosyo kung gikinahanglan ang feedback gikan sa laing subsystem;
  • gibalewala sa developer sa aplikasyon ang integrasyon ug dali nga mabuak kini pinaagi sa pagbag-o sa dagan sa trabaho;
  • ang sistema mohunong nga mahimong usa ka bug-os gikan sa user sa punto sa panglantaw, ang "seams" sa taliwala sa mga subsystem mahimong mamatikdan, sobra nga user operasyon makita nga nagsugod sa pagbalhin sa data gikan sa usa ka subsystem ngadto sa lain.

Ang usa pa nga pamaagi mao ang pagkonsiderar sa mga interaksyon sa panagsama ingon usa ka hinungdanon nga bahin sa panguna nga lohika sa negosyo ug dagan sa trabaho. Aron mapadayon ang mga kinahanglanon sa kahanas sa mga nag-develop sa aplikasyon gikan sa pag-skyrocketing, ang paghimo og mga bag-ong interaksyon sa panagsama kinahanglan buhaton nga dali ug natural, nga adunay gamay nga kapilian sa pagpili sa usa ka solusyon. Kini mas lisud kaysa kini tan-awon: ang himan kinahanglan nga adunay igo nga kusog aron mahatagan ang tiggamit sa kinahanglan nga lainlaing mga kapilian alang sa paggamit niini ug sa samang higayon dili tugutan ang ilang kaugalingon nga mapusilan sa tiil. Adunay daghang mga pangutana nga kinahanglan tubagon sa usa ka inhenyero sa konteksto sa mga buluhaton sa panagsama, apan dili angay hunahunaon sa usa ka developer sa aplikasyon sa ilang adlaw-adlaw nga trabaho: mga utlanan sa transaksyon, pagkamakanunayon, atomicity, seguridad, pag-scale, pag-apod-apod sa load ug kapanguhaan, pag-ruta, pag-marshaling, propagation ug switching contexts, ug uban pa. Kinahanglang itanyag ang mga developers sa aplikasyon nga medyo yano nga mga templates sa desisyon, diin ang mga tubag sa tanan nga mga pangutana gitago na. Kini nga mga sumbanan kinahanglan nga luwas nga igo: ang lohika sa negosyo kanunay nga nagbag-o, nga nagdugang sa peligro sa pagpaila sa mga sayup, ang gasto sa mga sayup kinahanglan magpabilin sa usa ka medyo ubos nga lebel.

Apan sa gihapon, unsa may kalabotan niini sa BPM? Adunay daghang mga kapilian alang sa pagpatuman sa workflow ...
Sa tinuud, ang lain nga pagpatuman sa mga proseso sa negosyo popular kaayo sa among mga solusyon - pinaagi sa deklaratibo nga setting sa diagram sa pagbalhin sa estado ug pagkonektar sa mga tigdumala nga adunay lohika sa negosyo sa mga pagbalhin. Sa parehas nga oras, ang estado nga nagtino sa karon nga posisyon sa "dokumento" sa proseso sa negosyo usa ka kinaiya sa "dokumento" mismo.

Paghiusa sa istilo sa BPM
Ingon niini ang hitsura sa proseso sa pagsugod sa proyekto

Ang pagkapopular sa ingon nga pagpatuman tungod sa relatibong kayano ug katulin sa paghimo sa mga linear nga proseso sa negosyo. Apan, samtang ang mga sistema sa software nahimong mas komplikado, ang automated nga bahin sa proseso sa negosyo motubo ug mahimong mas komplikado. Adunay panginahanglan alang sa pagkadunot, paggamit pag-usab sa mga bahin sa mga proseso, ingon man sa mga proseso sa forking aron ang matag sanga ipatuman nga managsama. Ubos sa ingon nga mga kondisyon, ang himan mahimong dili kombenyente, ug ang diagram sa transisyon sa estado nawad-an sa sulud sa kasayuran niini (ang mga interaksyon sa panagsama wala gyud makita sa diagram).

Paghiusa sa istilo sa BPM
Kini ang hitsura sa proseso pagkahuman sa daghang mga pag-uli sa pagpatin-aw sa mga kinahanglanon

Ang paagi gikan niini nga sitwasyon mao ang paghiusa sa makina jBPM sa pipila ka mga produkto nga adunay labing komplikado nga proseso sa negosyo. Sa mubo nga termino, kini nga solusyon adunay pipila nga kalampusan: nahimo’g posible nga ipatuman ang mga komplikado nga proseso sa negosyo samtang gipadayon ang usa ka medyo informative ug labing bag-o nga diagram sa notasyon BPMN2.

Paghiusa sa istilo sa BPM
Usa ka gamay nga bahin sa usa ka komplikado nga proseso sa negosyo

Sa taas nga termino, ang solusyon wala motuman sa mga gipaabut: ang taas nga kusog sa pagtrabaho sa paghimo sa mga proseso sa negosyo pinaagi sa visual nga mga himan wala magtugot sa pagkab-ot sa madawat nga mga indikasyon sa produktibo, ug ang himan mismo nahimong usa sa labing dili gusto sa mga developers. Adunay usab mga reklamo bahin sa internal nga istruktura sa makina, nga misangpot sa dagway sa daghang mga "patch" ug "mga crutches".

Ang panguna nga positibo nga aspeto sa paggamit sa jBPM mao ang pagkaamgo sa mga benepisyo ug kadaot sa pagbaton sa kaugalingon nga padayon nga kahimtang alang sa usa ka pananglitan sa proseso sa negosyo. Nakita usab namo ang posibilidad sa paggamit sa usa ka proseso nga pamaagi sa pagpatuman sa komplikadong mga protocol sa panagsama tali sa lain-laing mga aplikasyon gamit ang asynchronous nga mga interaksyon pinaagi sa mga signal ug mga mensahe. Ang presensya sa usa ka makanunayon nga estado adunay hinungdanon nga papel niini.

Base sa ibabaw, makahinapos kita: Ang pamaagi sa proseso sa istilo sa BPM nagtugot kanamo nga masulbad ang usa ka halapad nga mga buluhaton alang sa pag-automate sa labi ka komplikado nga mga proseso sa negosyo, nga nahiuyon nga mohaum sa mga kalihokan sa pag-integrate sa kini nga mga proseso ug ipadayon ang katakus nga makita nga ipakita ang gipatuman nga proseso sa usa ka angay nga notasyon.

Mga disbentaha sa mga dungan nga tawag ingon usa ka sumbanan sa panagsama

Ang synchronous integration gisabot nga pinakasimple nga blocking call. Ang usa ka subsystem naglihok isip bahin sa server ug gibutyag ang API sa gusto nga pamaagi. Ang laing subsystem naglihok isip usa ka bahin sa kliyente ug, sa husto nga panahon, naghimo sa usa ka tawag uban ang pagpaabut sa usa ka resulta. Depende sa arkitektura sa sistema, ang mga kilid sa kliyente ug server mahimong ma-host sa parehas nga aplikasyon ug proseso, o sa lainlaing mga. Sa ikaduhang kaso, kinahanglan nimo nga i-apply ang pipila ka pagpatuman sa RPC ug paghatag og marshalling sa mga parameter ug ang resulta sa tawag.

Paghiusa sa istilo sa BPM

Ang ingon nga sumbanan sa panagsama adunay usa ka medyo dako nga hugpong sa mga kakulangan, apan kini kaylap nga gigamit sa praktis tungod sa kayano niini. Ang katulin sa pagpatuman nakabihag ug naghimo kanimo nga magamit kini pag-usab sa mga kondisyon sa "pagsunog" nga mga deadline, pagsulat sa solusyon sa teknikal nga utang. Apan mahitabo usab nga ang walay kasinatian nga mga developers naggamit niini nga walay panimuot, nga wala makaamgo sa negatibo nga mga sangputanan.

Dugang pa sa labing klaro nga pagtaas sa koneksyon sa mga subsystem, adunay dili kaayo klaro nga mga problema sa "pagkaylap" ug "pag-inat" nga mga transaksyon. Sa tinuud, kung ang lohika sa negosyo maghimo bisan unsang mga pagbag-o, nan ang mga transaksyon kinahanglanon, ug ang mga transaksyon, sa baylo, nag-lock sa pipila nga mga kapanguhaan sa aplikasyon nga naapektuhan sa kini nga mga pagbag-o. Kana mao, hangtod ang usa ka subsystem maghulat alang sa tubag gikan sa lain, dili kini makompleto ang transaksyon ug buhian ang mga kandado. Kini kamahinungdanon nga nagdugang sa risgo sa lainlaing mga epekto:

  • nawala ang pagtubag sa sistema, dugay nga naghulat ang mga tiggamit alang sa mga tubag sa mga hangyo;
  • ang server sa kasagaran mohunong sa pagtubag sa mga hangyo sa user tungod sa nag-awas nga thread pool: kadaghanan sa mga thread "nagbarog" sa lock sa kapanguhaan nga giokupar sa transaksyon;
  • Ang mga deadlocks nagsugod sa pagpakita: ang kalagmitan sa ilang panghitabo nag-agad sa gidugayon sa mga transaksyon, ang kantidad sa negosyo nga lohika ug mga kandado nga nalangkit sa transaksyon;
  • Ang mga sayup sa pag-expire sa oras sa transaksyon makita;
  • ang server "nahulog" sa OutOfMemory kung ang buluhaton nanginahanglan pagproseso ug pagbag-o sa daghang mga datos, ug ang presensya sa mga dungan nga panagsama nagpalisud kaayo sa pagbahin sa pagproseso sa mga "gaan" nga mga transaksyon.

Gikan sa usa ka arkitektura nga punto sa panglantaw, ang paggamit sa pag-block sa mga tawag sa panahon sa integration mosangpot sa pagkawala sa kalidad nga kontrol sa tagsa-tagsa nga mga subsystem: imposible nga masiguro ang kalidad nga mga target sa usa ka subsystem nga nahimulag gikan sa kalidad nga mga target sa laing subsystem. Kung ang mga subsystem gihimo sa lainlaing mga koponan, kini usa ka dako nga problema.

Ang mga butang mahimong labi ka makapaikag kung ang mga subsystem nga gisagol naa sa lainlaing mga aplikasyon ug ang mga dungan nga pagbag-o kinahanglan himuon sa duha ka kilid. Giunsa paghimo kini nga mga pagbag-o nga transactional?

Kung ang mga pagbag-o gihimo sa lahi nga mga transaksyon, nan kinahanglan nga hatagan ang lig-on nga pagdumala sa eksepsiyon ug bayad, ug kini hingpit nga nagwagtang sa panguna nga bentaha sa mga dungan nga panagsama - kayano.

Ang mga gipang-apod-apod nga mga transaksyon moabut usab sa hunahuna, apan wala namo kini gigamit sa among mga solusyon: lisud ang pagsiguro sa kasaligan.

"Saga" isip solusyon sa problema sa mga transaksyon

Sa nagkadako nga pagkapopular sa mga microservice, adunay nagkadako nga panginahanglan alang sa Sumbanan sa Saga.

Kini nga sumbanan hingpit nga nagsulbad sa mga problema sa taas sa taas nga mga transaksyon, ug nagpalapad usab sa mga posibilidad sa pagdumala sa estado sa sistema gikan sa kilid sa lohika sa negosyo: ang kompensasyon human sa usa ka dili malampuson nga transaksyon mahimong dili ibalik ang sistema sa orihinal nga kahimtang niini, apan maghatag og alternatibo ruta sa pagproseso sa datos. Gitugotan usab niini nga dili nimo masubli ang malampuson nga nahuman nga mga lakang sa pagproseso sa datos kung gisulayan nimo nga dad-on ang proseso sa usa ka "maayo" nga katapusan.

Makapainteres, sa mga monolithic nga sistema, kini nga sumbanan adunay kalabotan usab kung bahin sa paghiusa sa mga loosely coupled subsystems ug adunay mga negatibo nga epekto nga gipahinabo sa taas nga mga transaksyon ug ang katugbang nga mga kandado sa kapanguhaan.

Mahitungod sa atong mga proseso sa negosyo sa estilo sa BPM, kini nahimong sayon ​​kaayo nga ipatuman ang Sagas: ang tagsa-tagsa nga mga lakang sa Sagas mahimong ibutang isip mga kalihokan sulod sa proseso sa negosyo, ug ang padayon nga kahimtang sa proseso sa negosyo nagtino, ug uban pang mga butang. , ang internal nga estado sa Sagas. Sa ato pa, wala na kita magkinahanglan ug dugang nga mekanismo sa koordinasyon. Ang tanan nga imong gikinahanglan mao ang usa ka mensahe broker uban sa suporta alang sa "labing menos kausa" garantiya ingon sa usa ka transportasyon.

Apan ang ingon nga solusyon adunay kaugalingon usab nga "presyo":

  • Ang lohika sa negosyo nahimong mas komplikado: kinahanglan nimo nga magtrabaho sa bayad;
  • kinahanglan nga biyaan ang bug-os nga pagkamakanunayon, nga mahimong labi ka sensitibo alang sa mga monolithic nga sistema;
  • ang arkitektura nahimong usa ka gamay nga mas komplikado, adunay dugang nga panginahanglan alang sa usa ka mensahe broker;
  • gikinahanglan ang dugang nga monitoring ug administrasyon nga mga himan (bisan pa sa kinatibuk-an maayo pa kini: ang kalidad sa serbisyo sa sistema motaas).

Alang sa monolitikong mga sistema, ang katarungan sa paggamit sa "Sags" dili kaayo klaro. Alang sa mga microservice ug uban pang mga SOA, diin, lagmit, aduna nay usa ka broker, ug ang bug-os nga pagkamakanunayon gisakripisyo sa pagsugod sa proyekto, ang mga benepisyo sa paggamit niini nga sumbanan mahimong mas labaw pa kay sa mga disbentaha, ilabi na kung adunay usa ka kombenyente nga API sa lebel sa lohika sa negosyo.

Encapsulation sa business logic sa microservices

Kung nagsugod kami sa pag-eksperimento sa mga microservice, usa ka makatarunganon nga pangutana ang mitungha: asa ibutang ang lohika sa negosyo sa domain nga may kalabotan sa serbisyo nga naghatag pagpadayon sa datos sa domain?

Kung tan-awon ang arkitektura sa lainlaing BPMS, mahimo’g makatarunganon nga ibulag ang lohika sa negosyo gikan sa pagpadayon: paghimo usa ka layer sa platform ug mga domain-independent nga microservice nga nagporma sa palibot ug sulud alang sa pagpatuman sa lohika sa negosyo sa domain, ug paghan-ay ang pagpadayon sa datos sa domain ingon usa ka bulag. layer sa yano kaayo ug gaan nga microservices. Ang mga proseso sa negosyo sa kini nga kaso nag-orkestrate sa mga serbisyo sa pagpadayon nga layer.

Paghiusa sa istilo sa BPM

Kini nga pamaagi adunay usa ka dako kaayo nga dugang: mahimo nimong madugangan ang pag-andar sa plataporma kutob sa imong gusto, ug ang katugbang nga layer sa mga microservice sa platform ang "magtambok" gikan niini. Ang mga proseso sa negosyo gikan sa bisan unsang natad nakakuha dayon ug higayon nga magamit ang bag-ong pagpaandar sa plataporma sa diha nga kini na-update.

Ang usa ka mas detalyado nga pagtuon nagpadayag sa hinungdanon nga mga kakulangan sa kini nga pamaagi:

  • usa ka serbisyo sa plataporma nga nagpatuman sa lohika sa negosyo sa daghang mga dominyo sa usa ka higayon nagdala og dagkong mga risgo isip usa ka punto sa kapakyasan. Ang kanunay nga mga pagbag-o sa lohika sa negosyo nagdugang sa risgo sa mga bug nga mosangpot sa mga kapakyasan sa tibuok sistema;
  • mga isyu sa pasundayag: ang lohika sa negosyo nagtrabaho uban ang datos niini pinaagi sa usa ka pig-ot ug hinay nga interface:
    • ang datos sa makausa pa mamarshall ug pumped pinaagi sa network stack;
    • ang serbisyo sa domain kanunay nga magbalik ug daghang datos kaysa gikinahanglan sa lohika sa negosyo alang sa pagproseso, tungod sa dili igo nga kapabilidad sa parameterization sa pangutana sa lebel sa eksternal nga API sa serbisyo;
    • ubay-ubay nga independente nga mga piraso sa lohika sa negosyo mahimong balik-balik nga hangyoon pag-usab ang parehas nga datos alang sa pagproseso (mahimo nimong maminusan ang kini nga problema pinaagi sa pagdugang mga beans sa session nga nag-cache sa data, apan labi pa nga nagpakomplikado kini sa arkitektura ug nagmugna mga problema sa pagkabag-o sa datos ug pagka-invalidation sa cache);
  • mga isyu sa transaksyon:
    • Ang mga proseso sa negosyo nga adunay makanunayon nga estado nga gitipigan sa serbisyo sa plataporma wala magkauyon sa datos sa domain, ug wala’y dali nga paagi aron masulbad kini nga problema;
    • pagbalhin sa lock sa domain data gikan sa transaksyon: kon ang domain negosyo lohika kinahanglan sa paghimo sa mga kausaban, human sa una nga pagsusi sa tukma sa aktuwal nga data, kini mao ang gikinahanglan nga dili iapil ang posibilidad sa usa ka competitive kausaban sa proseso data. Ang gawas nga pagbabag sa datos makatabang sa pagsulbad sa problema, apan ang ingon nga solusyon nagdala og dugang nga mga risgo ug makapakunhod sa kinatibuk-ang kasaligan sa sistema;
  • dugang nga mga komplikasyon kung mag-update: sa pipila ka mga kaso, kinahanglan nimo nga i-update ang pagpadayon sa serbisyo ug lohika sa negosyo nga dungan o sa higpit nga pagkasunod-sunod.

Sa katapusan, kinahanglan kong mobalik sa mga sukaranan: i-encapsulate ang data sa domain ug lohika sa negosyo sa domain sa usa ka microservice. Kini nga pamaagi nagpasimple sa panglantaw sa microservice isip usa ka integral nga bahin sa sistema ug dili makahatag sa mga problema sa ibabaw. Dili usab kini libre:

  • Ang standardisasyon sa API gikinahanglan alang sa interaksyon sa lohika sa negosyo (sa partikular, aron mahatagan ang mga kalihokan sa user isip bahin sa mga proseso sa negosyo) ug mga serbisyo sa platform sa API; mas mabinantayon nga pagtagad sa mga pagbag-o sa API, gikinahanglan ang pagpahiangay sa unahan ug paatras;
  • gikinahanglan nga magdugang og dugang nga runtime nga mga librarya aron masiguro ang paggana sa lohika sa negosyo isip kabahin sa matag usa sa maong microservice, ug kini naghatag og mga bag-ong kinahanglanon alang sa maong mga librarya: gaan ug usa ka minimum nga transitive dependencies;
  • Ang mga tigpasiugda sa lohika sa negosyo kinahanglan nga magsubay sa mga bersyon sa librarya: kung ang usa ka microservice wala pa mahuman sa dugay nga panahon, nan kini lagmit adunay usa ka karaan nga bersyon sa mga librarya. Kini mahimo nga usa ka wala damha nga babag sa pagdugang sa usa ka bag-ong bahin ug mahimong magkinahanglan nga ang daan nga lohika sa negosyo sa ingon nga serbisyo nga ibalhin sa mga bag-ong bersyon sa mga librarya kung adunay dili magkatugma nga mga pagbag-o tali sa mga bersyon.

Paghiusa sa istilo sa BPM

Ang usa ka layer sa mga serbisyo sa plataporma anaa usab sa ingon nga arkitektura, apan kini nga layer dili na usa ka sudlanan alang sa pagpatuman sa domain business logic, apan ang palibot lamang niini, nga naghatag og auxiliary "platform" nga mga gimbuhaton. Ang ingon nga usa ka layer gikinahanglan dili lamang aron mapadayon ang kagaan sa mga microservice sa domain, apan usab aron masentro ang pagdumala.

Pananglitan, ang mga kalihokan sa tiggamit sa mga proseso sa negosyo makamugna og mga buluhaton. Bisan pa, kung nagtrabaho uban ang mga buluhaton, ang tiggamit kinahanglan nga makakita sa mga buluhaton gikan sa tanan nga mga dominyo sa kinatibuk-ang lista, nga nagpasabut nga kinahanglan adunay usa ka angay nga serbisyo sa platform sa pagrehistro sa buluhaton, nga gitangtang sa lohika sa negosyo sa domain. Ang pagpadayon sa encapsulation sa lohika sa negosyo sa kini nga konteksto medyo problemado, ug kini usa pa nga pagkompromiso sa kini nga arkitektura.

Paghiusa sa mga proseso sa negosyo pinaagi sa mga mata sa usa ka developer sa aplikasyon

Sama sa nahisgutan na sa ibabaw, ang developer sa aplikasyon kinahanglan nga makuha gikan sa teknikal ug engineering nga mga bahin sa pagpatuman sa interaksyon sa daghang mga aplikasyon aron makasalig sa maayo nga produktibidad sa pag-uswag.

Atong sulayan nga masulbad ang usa ka lisud nga problema sa panagsama, labi nga giimbento alang sa artikulo. Kini usa ka "dula" nga buluhaton nga naglambigit sa tulo ka mga aplikasyon, diin ang matag usa kanila naghubit sa pipila ka ngalan sa domain: "app1", "app2", "app3".

Sa sulod sa matag aplikasyon, ang mga proseso sa negosyo gilunsad nga nagsugod sa "pagdula og bola" pinaagi sa integration bus. Ang mga mensahe nga gihinganlan og "Ball" maoy molihok isip bola.

Mga lagda sa dula:

  • ang unang magdudula mao ang initiator. Gidapit niya ang ubang mga magdudula sa dula, sugdan ang dula ug mahimo kining tapuson bisan unsang orasa;
  • ang ubang mga magdudula nagpahayag sa ilang pag-apil sa dula, "magkilala" sa usag usa ug sa una nga magdudula;
  • human madawat ang bola, ang magdudula mopili og laing partisipante nga magdudula ug ipasa ang bola ngadto kaniya. Ang kinatibuk-ang gidaghanon sa mga pass giihap;
  • ang matag magdudula adunay "enerhiya", nga mikunhod sa matag pass sa bola sa kana nga magdudula. Kung mahurot na ang kusog, ang magdudula matangtang sa dula, nga nagpahibalo sa ilang pagretiro;
  • kon ang magdudula mabiyaan nga nag-inusara, siya diha-diha dayon mopahayag sa iyang pagbiya;
  • sa diha nga ang tanan nga mga magdudula mawagtang, ang unang magdudula modeklarar sa katapusan sa dula. Kung siya mibiya sa dula sa sayo pa, nan kini nagpabilin sa pagsunod sa dula aron makompleto kini.

Aron masulbad kini nga problema, akong gamiton ang among DSL alang sa mga proseso sa negosyo, nga nagtugot kanimo sa paghulagway sa lohika sa Kotlin nga compact, nga adunay labing gamay nga boilerplate.

Sa aplikasyon sa app1, ang proseso sa negosyo sa una nga magdudula (siya usab ang nagpasiugda sa dula) molihok:

klase nga 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}")
}

Dugang sa pagpatuman sa lohika sa negosyo, ang code sa ibabaw makahimo og usa ka modelo sa butang sa usa ka proseso sa negosyo nga mahimong makita isip usa ka diagram. Wala pa namo gipatuman ang visualizer, mao nga kinahanglan namong mogugol og pipila ka panahon sa pagdrowing (dinhi akong gipasimple ang notasyon sa BPMN mahitungod sa paggamit sa mga ganghaan aron mapalambo ang pagkamakanunayon sa diagram sa code sa ibabaw):

Paghiusa sa istilo sa BPM

Ang app2 maglakip sa proseso sa negosyo sa laing magdudula:

klase nga 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:

Paghiusa sa istilo sa BPM

Sa aplikasyon sa app3, himuon namon ang magdudula nga adunay gamay nga lahi nga pamatasan: imbis nga random nga pagpili sa sunod nga magdudula, molihok siya sumala sa round-robin algorithm:

klase nga 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}")
}

Kung dili, ang pamatasan sa magdudula dili lahi sa nauna, mao nga ang diagram dili mausab.

Karon kinahanglan namon ang usa ka pagsulay aron mapadagan kini tanan. Ihatag ra nako ang code sa pagsulay mismo, aron dili mabutang ang artikulo sa usa ka boilerplate (sa tinuud, gigamit nako ang palibot sa pagsulay nga gihimo sa sayo pa aron sulayan ang paghiusa sa ubang mga proseso sa negosyo):

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

Pagdalagan ang pagsulay, tan-awa ang log:

output sa console

Взята блокировка ключа lock://app1/process/InitialPlayer
Let's play!
Снята блокировка ключа lock://app1/process/InitialPlayer
Player2: I'm here!
Player3: I'm here!
Player4: I'm here!
Player5: I'm here!
... join player Player2 ...
... join player Player4 ...
... join player Player3 ...
... join player Player5 ...
Step 1: Player1 >>> Player3
Step 2: Player3 >>> Player5
Step 3: Player5 >>> Player3
Step 4: Player3 >>> Player4
Step 5: Player4 >>> Player3
Step 6: Player3 >>> Player4
Step 7: Player4 >>> Player5
Step 8: Player5 >>> Player2
Step 9: Player2 >>> Player5
Step 10: Player5 >>> Player4
Step 11: Player4 >>> Player2
Step 12: Player2 >>> Player4
Step 13: Player4 >>> Player1
Step 14: Player1 >>> Player4
Step 15: Player4 >>> Player3
Step 16: Player3 >>> Player1
Step 17: Player1 >>> Player2
Step 18: Player2 >>> Player3
Step 19: Player3 >>> Player1
Step 20: Player1 >>> Player5
Step 21: Player5 >>> Player1
Step 22: Player1 >>> Player2
Step 23: Player2 >>> Player4
Step 24: Player4 >>> Player5
Step 25: Player5 >>> Player3
Step 26: Player3 >>> Player4
Step 27: Player4 >>> Player2
Step 28: Player2 >>> Player5
Step 29: Player5 >>> Player2
Step 30: Player2 >>> Player1
Step 31: Player1 >>> Player3
Step 32: Player3 >>> Player4
Step 33: Player4 >>> Player1
Step 34: Player1 >>> Player3
Step 35: Player3 >>> Player4
Step 36: Player4 >>> Player3
Step 37: Player3 >>> Player2
Step 38: Player2 >>> Player5
Step 39: Player5 >>> Player4
Step 40: Player4 >>> Player5
Step 41: Player5 >>> Player1
Step 42: Player1 >>> Player5
Step 43: Player5 >>> Player3
Step 44: Player3 >>> Player5
Step 45: Player5 >>> Player2
Step 46: Player2 >>> Player3
Step 47: Player3 >>> Player2
Step 48: Player2 >>> Player5
Step 49: Player5 >>> Player4
Step 50: Player4 >>> Player2
Step 51: Player2 >>> Player5
Step 52: Player5 >>> Player1
Step 53: Player1 >>> Player5
Step 54: Player5 >>> Player3
Step 55: Player3 >>> Player5
Step 56: Player5 >>> Player2
Step 57: Player2 >>> Player1
Step 58: Player1 >>> Player4
Step 59: Player4 >>> Player1
Step 60: Player1 >>> Player4
Step 61: Player4 >>> Player3
Step 62: Player3 >>> Player2
Step 63: Player2 >>> Player5
Step 64: Player5 >>> Player4
Step 65: Player4 >>> Player5
Step 66: Player5 >>> Player1
Step 67: Player1 >>> Player5
Step 68: Player5 >>> Player3
Step 69: Player3 >>> Player4
Step 70: Player4 >>> Player2
Step 71: Player2 >>> Player5
Step 72: Player5 >>> Player2
Step 73: Player2 >>> Player1
Step 74: Player1 >>> Player4
Step 75: Player4 >>> Player1
Step 76: Player1 >>> Player2
Step 77: Player2 >>> Player5
Step 78: Player5 >>> Player4
Step 79: Player4 >>> Player3
Step 80: Player3 >>> Player1
Step 81: Player1 >>> Player5
Step 82: Player5 >>> Player1
Step 83: Player1 >>> Player4
Step 84: Player4 >>> Player5
Step 85: Player5 >>> Player3
Step 86: Player3 >>> Player5
Step 87: Player5 >>> Player2
Step 88: Player2 >>> Player3
Player2: I'm out!
Step 89: Player3 >>> Player4
... player Player2 is out ...
Step 90: Player4 >>> Player1
Step 91: Player1 >>> Player3
Step 92: Player3 >>> Player1
Step 93: Player1 >>> Player4
Step 94: Player4 >>> Player3
Step 95: Player3 >>> Player5
Step 96: Player5 >>> Player1
Step 97: Player1 >>> Player5
Step 98: Player5 >>> Player3
Step 99: Player3 >>> Player5
Step 100: Player5 >>> Player4
Step 101: Player4 >>> Player5
Player4: I'm out!
... player Player4 is out ...
Step 102: Player5 >>> Player1
Step 103: Player1 >>> Player3
Step 104: Player3 >>> Player1
Step 105: Player1 >>> Player3
Step 106: Player3 >>> Player5
Step 107: Player5 >>> Player3
Step 108: Player3 >>> Player1
Step 109: Player1 >>> Player3
Step 110: Player3 >>> Player5
Step 111: Player5 >>> Player1
Step 112: Player1 >>> Player3
Step 113: Player3 >>> Player5
Step 114: Player5 >>> Player3
Step 115: Player3 >>> Player1
Step 116: Player1 >>> Player3
Step 117: Player3 >>> Player5
Step 118: Player5 >>> Player1
Step 119: Player1 >>> Player3
Step 120: Player3 >>> Player5
Step 121: Player5 >>> Player3
Player5: I'm out!
... player Player5 is out ...
Step 122: Player3 >>> Player5
Step 123: Player5 >>> Player1
Player5: I'm out!
Step 124: Player1 >>> Player3
... player Player5 is out ...
Step 125: Player3 >>> Player1
Step 126: Player1 >>> Player3
Player1: I'm out!
... player Player1 is out ...
Step 127: Player3 >>> Player3
Player3: I'm out!
Step 128: Player3 >>> Player3
... player Player3 is out ...
Player3: I'm out!
Stop!
Step 129: Player3 >>> Player3
Player3: I'm out!

Pipila ka importante nga mga konklusyon mahimong makuha gikan niining tanan:

  • kung ang gikinahanglan nga mga himan anaa, ang mga developers sa aplikasyon makahimo og mga interaksyon sa panagsama tali sa mga aplikasyon nga dili mobulag sa lohika sa negosyo;
  • ang pagkakomplikado (kompleksidad) sa usa ka buluhaton sa integrasyon nga nanginahanglan mga kahanas sa inhenyero mahimong matago sa sulod sa balangkas kung kini una nga gibutang sa arkitektura sa balangkas. Ang kalisud sa buluhaton (kalisud) dili matago, mao nga ang solusyon sa usa ka lisud nga buluhaton sa code tan-awon sumala niana;
  • sa diha nga pagpalambo sa integration lohika, kini mao ang gikinahanglan nga sa pagkuha ngadto sa asoy sa ngadto-ngadto pagkamakanunayon ug ang kakulang sa linearizability sa estado kausaban sa tanan nga integration partisipante. Kini nagpugos kanato sa pagkomplikado sa lohika aron mahimo kining dili sensitibo sa han-ay sa mga panghitabo sa gawas. Sa among pananglitan, ang magdudula napugos sa pag-apil sa dula human niya ipahibalo ang iyang paggawas gikan sa dula: ang ubang mga magdudula magpadayon sa pagpasa sa bola ngadto kaniya hangtud nga ang impormasyon mahitungod sa iyang exit moabut ug maproseso sa tanan nga mga partisipante. Kini nga lohika wala magsunod sa mga lagda sa dula ug usa ka solusyon sa pagkompromiso sulod sa gambalay sa gipili nga arkitektura.

Sunod, maghisgot kita bahin sa lainlaing mga subtlety sa among solusyon, pagkompromiso ug uban pang mga punto.

Tanan nga mensahe sa usa ka pila

Ang tanan nga integrated nga mga aplikasyon nagtrabaho uban sa usa ka integration bus, nga gipresentar isip usa ka eksternal nga broker, usa ka BPMQueue alang sa mga mensahe ug usa ka BPMTopic nga hilisgutan alang sa mga signal (mga panghitabo). Ang pagpasa sa tanan nga mga mensahe pinaagi sa usa ka pila sa kaugalingon usa ka pagkompromiso. Sa lebel sa lohika sa negosyo, mahimo nimong ipaila ang daghang mga bag-ong tipo sa mga mensahe nga gusto nimo nga wala’y pagbag-o sa istruktura sa sistema. Kini usa ka mahinungdanon nga pagpayano, apan kini adunay pipila ka mga risgo, nga, sa konteksto sa among kasagaran nga mga buluhaton, alang kanamo dili kaayo importante.

Paghiusa sa istilo sa BPM

Bisan pa, adunay usa ka maliputon dinhi: ang matag aplikasyon nagsala sa "iya" nga mga mensahe gikan sa pila sa entrada, pinaagi sa ngalan sa domain niini. Usab, ang domain mahimong ipiho sa mga signal, kung kinahanglan nimo nga limitahan ang "kasakup" sa signal sa usa ka aplikasyon. Kini kinahanglan nga madugangan ang bandwidth sa bus, apan ang negosyo nga lohika kinahanglan na karon nga molihok uban ang mga ngalan sa domain: mandatory alang sa pagtubag sa mga mensahe, tilinguhaon alang sa mga signal.

Pagsiguro sa pagkakasaligan sa integration bus

Ang kasaligan gilangkoban sa daghang mga butang:

  • Ang gipili nga broker sa mensahe usa ka kritikal nga bahin sa arkitektura ug usa ka punto sa kapakyasan: kini kinahanglan nga adunay igo nga pagtugot sa sayup. Kinahanglan nga mogamit ka lamang sa gisulayan sa panahon nga mga pagpatuman nga adunay maayong suporta ug usa ka dako nga komunidad;
  • gikinahanglan aron maseguro ang taas nga pagkaanaa sa mensahe sa broker, diin kini kinahanglan nga pisikal nga mahimulag gikan sa integrated nga mga aplikasyon (taas nga pagkaanaa sa mga aplikasyon nga adunay gigamit nga lohika sa negosyo mas lisud ug mahal nga ihatag);
  • ang broker obligado sa paghatag og "labing menos kausa" nga mga garantiya sa pagpadala. Kini usa ka mandatory nga kinahanglanon alang sa kasaligan nga operasyon sa integration bus. Wala'y kinahanglan alang sa "eksaktong kausa" nga mga garantiya sa lebel: ang mga proseso sa negosyo kasagaran dili sensitibo sa balik-balik nga pag-abot sa mga mensahe o mga panghitabo, ug sa mga espesyal nga buluhaton diin kini importante, mas sayon ​​ang pagdugang og dugang nga mga tseke sa lohika sa negosyo kay sa kanunay nga paggamit. hinoon "mahal" " mga garantiya;
  • Ang pagpadala sa mga mensahe ug mga signal kinahanglang maapil sa usa ka komon nga transaksyon nga adunay kausaban sa kahimtang sa mga proseso sa negosyo ug datos sa domain. Ang gipalabi nga kapilian mao ang paggamit sa sumbanan Transaksyonal nga Outbox, apan magkinahanglan kini og dugang nga lamesa sa database ug usa ka relay. Sa mga aplikasyon sa JEE, mahimo kini nga pasimplehon pinaagi sa paggamit sa usa ka lokal nga manager sa JTA, apan ang koneksyon sa gipili nga broker kinahanglan nga molihok sa mode XA;
  • Ang mga tigdumala sa umaabot nga mga mensahe ug mga panghitabo kinahanglan usab nga magtrabaho sa transaksyon sa pagbag-o sa kahimtang sa proseso sa negosyo: kung ang ingon nga transaksyon ibalik, nan ang resibo sa mensahe kinahanglan usab nga kanselahon;
  • Ang mga mensahe nga dili mahatag tungod sa mga sayup kinahanglan nga tipigan sa usa ka bulag nga tindahan DLQ (Patay nga Sulat nga Pila). Aron mahimo kini, naghimo kami usa ka lahi nga platform nga microservice nga nagtipig sa ingon nga mga mensahe sa pagtipig niini, nag-indeks niini pinaagi sa mga hiyas (alang sa dali nga paggrupo ug pagpangita), ug gibutyag ang API alang sa pagtan-aw, pagpadala pag-usab sa adres sa destinasyon, ug pagtangtang sa mga mensahe. Ang mga tigdumala sa sistema makatrabaho niini nga serbisyo pinaagi sa ilang web interface;
  • sa mga setting sa broker, kinahanglan nimo nga ayohon ang gidaghanon sa mga pagsulay sa pagpadala ug mga paglangan tali sa mga paghatud aron makunhuran ang posibilidad nga ang mga mensahe makasulod sa DLQ (halos imposible nga makalkulo ang kamalaumon nga mga parameter, apan mahimo ka nga molihok nga empiriko ug i-adjust kini sa panahon operasyon);
  • ang tindahan sa DLQ kinahanglan nga padayon nga bantayan, ug ang sistema sa pag-monitor kinahanglan magpahibalo sa mga tagdumala sa sistema aron sila makatubag sa labing madali kung adunay mga mensahe nga wala mapadala. Kini makapakunhod sa "damage zone" sa usa ka kapakyasan o sayop nga lohika sa negosyo;
  • ang integration bus kinahanglan nga dili sensitibo sa temporaryo nga pagkawala sa mga aplikasyon: ang mga subskripsyon sa hilisgutan kinahanglan nga lig-on, ug ang domain name sa aplikasyon kinahanglan nga talagsaon aron ang uban dili mosulay sa pagproseso sa mensahe niini gikan sa pila sa panahon nga wala ang aplikasyon.

Pagsiguro sa kaluwasan sa thread sa lohika sa negosyo

Ang parehas nga pananglitan sa usa ka proseso sa negosyo mahimong makadawat daghang mga mensahe ug mga panghitabo sa usa ka higayon, ang pagproseso niini magsugod nga managsama. Sa samang higayon, alang sa usa ka developer sa aplikasyon, ang tanan kinahanglan nga yano ug luwas sa hilo.

Ang proseso nga lohika sa negosyo nagproseso sa matag eksternal nga panghitabo nga nakaapekto sa kini nga proseso sa negosyo sa tinagsa. Kini nga mga panghitabo mahimong:

  • paglansad sa usa ka pananglitan sa proseso sa negosyo;
  • usa ka aksyon sa user nga may kalabutan sa usa ka kalihokan sulod sa usa ka proseso sa negosyo;
  • resibo sa usa ka mensahe o signal diin ang usa ka pananglitan sa proseso sa negosyo gi-subscribe;
  • pag-expire sa timer nga gitakda sa pananglitan sa proseso sa negosyo;
  • pagkontrol sa aksyon pinaagi sa API (e.g. pag-abort sa proseso).

Ang matag ingon nga panghitabo mahimong magbag-o sa kahimtang sa usa ka pananglitan sa proseso sa negosyo: ang pipila nga mga kalihokan mahimong matapos ug ang uban magsugod, ang mga kantidad sa padayon nga mga kabtangan mahimong mabag-o. Ang pagsira sa bisan unsang kalihokan mahimong moresulta sa pagpaaktibo sa usa o daghan pa sa mosunod nga mga kalihokan. Kadtong, sa baylo, mahimong mohunong sa paghulat alang sa ubang mga panghitabo, o, kung wala sila magkinahanglan bisan unsang dugang nga datos, mahimo nila makompleto sa parehas nga transaksyon. Sa wala pa isira ang transaksyon, ang bag-ong kahimtang sa proseso sa negosyo gitipigan sa database, diin maghulat kini sa sunod nga panghitabo sa gawas.

Ang padayon nga datos sa proseso sa negosyo nga gitipigan sa usa ka relational database usa ka kombenyente kaayo nga punto sa pag-synchronize sa pagproseso kung gamiton ang SELECT FOR UPDATE. Kung ang usa ka transaksyon nakahimo sa pagkuha sa kahimtang sa proseso sa negosyo gikan sa database aron mabag-o kini, nan wala’y lain nga transaksyon nga managsama ang makakuha sa parehas nga kahimtang alang sa lain nga pagbag-o, ug pagkahuman sa pagkompleto sa una nga transaksyon, ang ikaduha mao ang gigarantiyahan nga makadawat sa nausab na nga estado.

Gamit ang mga pessimistic nga kandado sa kilid sa DBMS, among gituman ang tanan nga kinahanglanon nga kinahanglanon ASID, ug ipadayon usab ang abilidad sa pag-scale sa aplikasyon sa lohika sa negosyo pinaagi sa pagdugang sa gidaghanon sa mga nagdagan nga mga higayon.

Bisan pa, ang mga pessimistic nga mga kandado naghulga kanamo nga adunay mga deadlock, nga nagpasabut nga ang PILI ALANG SA UPDATE kinahanglan nga limitado sa pipila ka makatarunganon nga oras kung adunay mga deadlock sa pipila ka grabe nga mga kaso sa lohika sa negosyo.

Ang laing problema mao ang pag-synchronize sa pagsugod sa proseso sa negosyo. Samtang wala’y pananglitan sa proseso sa negosyo, wala usab estado sa database, busa ang gihulagway nga pamaagi dili molihok. Kung gusto nimo masiguro ang pagkatalagsaon sa usa ka pananglitan sa proseso sa negosyo sa usa ka partikular nga sakup, nan kinahanglan nimo ang usa ka matang sa butang nga pag-synchronize nga may kalabotan sa klase sa proseso ug ang katugbang nga sakup. Aron masulbad kini nga problema, naggamit kami usa ka lahi nga mekanismo sa pag-lock nga nagtugot kanamo nga makakuha usa ka kandado sa usa ka arbitraryong kapanguhaan nga gitino sa usa ka yawe sa format nga URI pinaagi sa usa ka serbisyo sa gawas.

Sa among mga pananglitan, ang proseso sa negosyo sa InitialPlayer adunay usa ka deklarasyon

uniqueConstraint = UniqueConstraints.singleton

Busa, ang log adunay mga mensahe bahin sa pagkuha ug pagpagawas sa lock sa katugbang nga yawe. Walay ingon nga mga mensahe alang sa ubang mga proseso sa negosyo: ang uniqueConstraint wala gitakda.

Mga problema sa proseso sa negosyo nga adunay padayon nga kahimtang

Usahay ang pagbaton sa usa ka makanunayon nga kahimtang dili lamang makatabang, apan makapugong usab sa pag-uswag.
Nagsugod ang mga problema kung kinahanglan nimo nga magbag-o sa lohika sa negosyo ug / o modelo sa proseso sa negosyo. Wala’y bisan unsang pagbag-o nga nakit-an nga nahiuyon sa daan nga kahimtang sa mga proseso sa negosyo. Kung adunay daghang mga "live" nga mga higayon sa database, nan ang paghimo sa dili magkatugma nga mga pagbag-o mahimong hinungdan sa daghang kasamok, nga kanunay namon nasugatan sa paggamit sa jBPM.

Depende sa giladmon sa pagbag-o, mahimo kang molihok sa duha ka paagi:

  1. paghimo og usa ka bag-ong matang sa proseso sa negosyo aron dili makahimo og dili katugbang nga mga pagbag-o sa daan, ug gamita kini imbes sa daan sa pagsugod sa bag-ong mga higayon. Ang daan nga mga higayon magpadayon sa pagtrabaho "sa daan nga paagi";
  2. ibalhin ang padayon nga kahimtang sa mga proseso sa negosyo kung gi-update ang lohika sa negosyo.

Ang una nga paagi mas simple, apan adunay mga limitasyon ug disbentaha, pananglitan:

  • pagdoble sa lohika sa negosyo sa daghang mga modelo sa proseso sa negosyo, usa ka pagtaas sa gidaghanon sa lohika sa negosyo;
  • kasagaran gikinahanglan ang diha-diha nga transisyon ngadto sa bag-ong lohika sa negosyo (halos kanunay bahin sa mga buluhaton sa paghiusa);
  • wala mahibal-an sa developer kung unsang punto nga posible nga mapapas ang mga karaan nga mga modelo.

Sa praktis, gigamit namo ang duha ka mga pamaagi, apan nakahimo og daghang mga desisyon aron pasimplehon ang among kinabuhi:

  • sa database, ang padayon nga kahimtang sa proseso sa negosyo gitipigan sa usa ka dali mabasa ug dali maproseso nga porma: sa usa ka JSON format string. Kini nagtugot kanimo sa paghimo sa mga paglalin sa sulod sa aplikasyon ug sa gawas. Sa grabe nga mga kaso, mahimo usab nimo nga i-tweak kini gamit ang mga gunitanan (labi na mapuslanon sa pag-uswag sa panahon sa pag-debug);
  • ang integrasyon nga lohika sa negosyo wala mogamit mga ngalan sa proseso sa negosyo, aron sa bisan unsang oras posible nga ilisan ang pagpatuman sa usa sa mga partisipante nga proseso sa usa ka bag-o, nga adunay bag-ong ngalan (pananglitan, "InitialPlayerV2"). Ang pagbugkos mahitabo pinaagi sa mga ngalan sa mga mensahe ug mga signal;
  • ang modelo sa proseso adunay numero sa bersyon, nga atong madugangan kon mohimo kitag dili magkauyon nga mga kausaban niini nga modelo, ug kini nga numero gitipigan uban sa kahimtang sa proseso nga pananglitan;
  • ang padayon nga kahimtang sa proseso gibasa una gikan sa base ngadto sa usa ka kombenyente nga modelo sa butang nga ang pamaagi sa paglalin mahimong magamit kung ang numero sa bersyon sa modelo nausab;
  • ang pamaagi sa paglalin gibutang sunod sa lohika sa negosyo ug gitawag nga "tapulan" alang sa matag higayon sa proseso sa negosyo sa panahon sa pagpahiuli niini gikan sa database;
  • kung kinahanglan nimo nga ibalhin ang kahimtang sa tanan nga mga higayon sa proseso nga dali ug dungan, daghang mga klasiko nga solusyon sa paglalin sa database ang gigamit, apan kinahanglan nimo nga magtrabaho kauban ang JSON didto.

Nagkinahanglan ba ko og laing balangkas alang sa mga proseso sa negosyo?

Ang mga solusyon nga gihulagway sa artikulo nagtugot kanamo nga mapasimple ang among kinabuhi, mapalapad ang lainlaing mga isyu nga nasulbad sa lebel sa pag-uswag sa aplikasyon, ug himuon ang ideya sa pagbulag sa lohika sa negosyo sa mga microservice nga labi ka madanihon. Alang niini, daghang trabaho ang nahimo, usa ka kaayo nga "gaan" nga balangkas alang sa mga proseso sa negosyo ang gihimo, ingon man ang mga sangkap sa serbisyo alang sa pagsulbad sa mga nahibal-an nga mga problema sa konteksto sa usa ka halapad nga gipatuman nga mga buluhaton. Kami adunay tinguha nga ipaambit kini nga mga resulta, aron madala ang pagpalambo sa komon nga mga sangkap ngadto sa bukas nga pag-access ubos sa usa ka libre nga lisensya. Nagkinahanglan kini og pipila ka paningkamot ug panahon. Ang pagsabut sa panginahanglan alang sa ingon nga mga solusyon mahimong usa ka dugang nga insentibo alang kanamo. Sa gisugyot nga artikulo, gamay ra kaayo nga pagtagad ang gihatag sa mga kapabilidad sa balangkas mismo, apan ang pipila niini makita gikan sa mga pananglitan nga gipresentar. Kung atong imantala ang atong gambalay, usa ka bulag nga artikulo ang igahin niini. Sa kasamtangan, mapasalamaton kami kung magbilin ka og gamay nga feedback pinaagi sa pagtubag sa pangutana:

Ang mga rehistradong tiggamit lamang ang makaapil sa survey. Sign in, walay sapayan.

Nagkinahanglan ba ko og laing balangkas alang sa mga proseso sa negosyo?

  • 18,8%Oo, dugay na ko nangita ug ingon ani.

  • 12,5%makapaikag nga makat-on pa bahin sa imong pagpatuman, mahimo’g mapuslanon2

  • 6,2%gigamit namo ang usa sa kasamtangan nga mga gambalay, apan kami naghunahuna sa pag-ilis niini1

  • 18,8%gigamit namo ang usa sa kasamtangan nga mga gambalay, ang tanan angay3

  • 18,8%pagsagubang nga walay balangkas3

  • 25,0%pagsulat sa imong kaugalingon4

16 ka tiggamit ang nagboto. 7 ka tiggamit ang nag-abstain.

Source: www.habr.com

Idugang sa usa ka comment