Haɗin salon BPM

Haɗin salon BPM

Barka dai Habr!

Kamfaninmu ya ƙware a ci gaban ERP-aji software mafita, a cikin abin da zaki ta kason ne shagaltar da tsarin ma'amala da wata babbar adadin kasuwanci dabaru da workflow a la EDMS. Nau'in samfuranmu na zamani sun dogara ne akan fasahar JavaEE, amma kuma muna yin gwaji sosai da ƙananan sabis. Ɗaya daga cikin mafi yawan matsalolin matsalolin irin waɗannan hanyoyin shine haɗakar da tsarin tsarin ƙasa daban-daban da ke da alaka da yankunan da ke kusa. Ayyukan haɗin kai sun kasance koyaushe suna ba mu babban ciwon kai, ba tare da la'akari da salon gine-gine, tarin fasaha da tsarin da muke amfani da su ba, amma kwanan nan an sami ci gaba wajen magance irin waɗannan matsalolin.

A cikin labarin da aka kawo hankalin ku, zan yi magana game da kwarewa da bincike na gine-gine na NPO Krista a cikin yankin da aka keɓe. Za mu kuma yi la'akari da misali na sauƙi mai sauƙi ga matsalar haɗin kai daga ra'ayi na mai haɓaka aikace-aikacen kuma gano abin da ke ɓoye a bayan wannan sauƙi.

Disclaimer

Hanyoyin gine-gine da fasaha da aka kwatanta a cikin labarin ana ba da su ne bisa ga kwarewa na sirri a cikin mahallin ayyuka na musamman. Waɗannan mafita ba sa da'awar zama na duniya kuma maiyuwa ba za su kasance mafi kyau a ƙarƙashin wasu sharuɗɗan amfani ba.

Menene alakar BPM da ita?

Don amsa wannan tambayar, muna buƙatar ɗan ɗan bincika takamaiman matsalolin da ake amfani da su na hanyoyin magance mu. Babban ɓangaren dabarun kasuwanci a cikin tsarin mu'amalar mu na yau da kullun shine shigar da bayanai a cikin bayanan ta hanyar mu'amalar mai amfani, tabbacin hannu da ta atomatik na wannan bayanan, wucewa ta hanyar wasu ayyukan aiki, buga shi zuwa wani tsarin / bayanan nazari / adana bayanai, samar da rahotanni. Don haka, babban aikin tsarin ga abokan ciniki shine sarrafa kansa na tsarin kasuwancin su na ciki.

Don saukakawa, muna amfani da kalmar “takardun” a cikin sadarwa azaman ɗan taƙaitaccen saitin bayanai, wanda aka haɗa shi da maɓalli na gama gari, wanda za a iya “haɗe wani takamaiman aikin”.
Amma menene game da dabaru na haɗin kai? Bayan haka, aikin haɗin kai yana haifar da tsarin gine-ginen tsarin, wanda aka "sawed" cikin sassa BA bisa ga buƙatar abokin ciniki ba, amma a ƙarƙashin rinjayar mabanbantan dalilai:

  • ƙarƙashin rinjayar dokar Conway;
  • sakamakon sake yin amfani da tsarin da aka yi a baya don wasu samfuran;
  • kamar yadda maginin ya yanke shawara, bisa ga buƙatun marasa aiki.

Akwai babban jaraba don raba dabarun haɗin kai daga dabarun kasuwanci na babban aikin aiki don kada a gurɓata dabarun kasuwanci tare da kayan haɗin kai da kuma adana mai haɓaka aikace-aikacen daga samun zurfafa cikin abubuwan da ke cikin tsarin tsarin gine-ginen tsarin. Wannan tsarin yana da fa'idodi da yawa, amma aikin yana nuna rashin ingancinsa:

  • warware matsalolin haɗin kai yawanci nunin faifai zuwa mafi sauƙi zaɓuɓɓuka a cikin nau'i na kira na aiki tare saboda iyakataccen wuraren haɓakawa a cikin aiwatar da babban aikin aiki (ƙari akan gazawar haɗin kai tare da ke ƙasa);
  • kayan aikin haɗin kai har yanzu suna shiga cikin ainihin dabarun kasuwanci lokacin da ake buƙatar amsawa daga wani tsarin ƙasa;
  • mai haɓaka aikace-aikacen ya yi watsi da haɗin kai kuma yana iya karya shi cikin sauƙi ta hanyar canza tsarin aiki;
  • tsarin ya daina zama guda ɗaya daga ra'ayi na mai amfani, "seams" tsakanin ƙananan tsarin ya zama sananne, ayyukan masu amfani da yawa sun bayyana wanda ke fara canja wurin bayanai daga wannan tsarin zuwa wani.

Wata hanyar ita ce yin la'akari da hulɗar haɗin kai a matsayin wani ɓangare na ainihin dabarun kasuwanci da tafiyar da aiki. Don kiyaye buƙatun fasaha na masu haɓaka aikace-aikacen daga haɓakawa, ƙirƙirar sabbin hulɗar haɗin kai ya kamata ya zama mai sauƙi da wahala, tare da ƙaramin zaɓi don zaɓar mafita. Wannan ya fi wuya fiye da yadda yake gani: dole ne kayan aiki ya kasance mai ƙarfi don samar wa mai amfani da nau'ikan zaɓuɓɓukan da ake buƙata don amfani da shi kuma a lokaci guda kada su yarda a harbe su a ƙafa. Akwai tambayoyi da yawa da injiniya dole ne ya amsa a cikin mahallin ayyukan haɗin kai, amma wanda mai haɓaka aikace-aikacen bai kamata ya yi tunani game da ayyukansu na yau da kullun ba: iyakokin ma'amala, daidaito, atomity, tsaro, scaling, lodi da rarraba albarkatu, zirga-zirga, marshaling, Yadawa da sauya mahallin, da dai sauransu. Wajibi ne a ba wa masu haɓaka aikace-aikacen samfuran mafita masu sauƙi masu sauƙi, waɗanda amsoshin duk waɗannan tambayoyin an riga an ɓoye su. Wadannan alamu ya kamata su kasance amintacce sosai: dabarun kasuwanci suna canzawa sau da yawa, wanda ke ƙara haɗarin gabatar da kurakurai, farashin kurakurai ya kamata ya kasance a ƙaramin matakin ƙasa.

Amma har yanzu, menene BPM ya yi da shi? Akwai zaɓuɓɓuka da yawa don aiwatar da aikin aiki ...
Lallai, wani aiwatar da hanyoyin kasuwanci ya shahara sosai a cikin hanyoyinmu - ta hanyar bayyana saitin tsarin mika mulki na jiha da kuma haɗa masu sarrafa tare da dabarun kasuwanci zuwa sauye-sauye. A lokaci guda kuma, jihar da ke ƙayyade matsayi na yanzu na "takardun" a cikin tsarin kasuwanci shine sifa na "takardun" kanta.

Haɗin salon BPM
Wannan shine yadda tsarin ya kasance a farkon aikin

Shaharar irin wannan aiwatarwa shine saboda sauƙi mai sauƙi da saurin ƙirƙirar hanyoyin kasuwanci na layi. Koyaya, yayin da tsarin software ke ƙaruwa, ɓangaren sarrafa kansa na tsarin kasuwanci yana girma kuma yana ƙara rikitarwa. Akwai bukatar rugujewa, sake amfani da sassa na tafiyar matakai, da kuma aiwatar da cokali mai yatsa domin kowane reshe yana aiwatar da shi a layi daya. A karkashin irin wannan yanayi, kayan aiki ya zama maras kyau, kuma tsarin jujjuyawar jihar ya rasa abun ciki na bayanan sa (haɗin haɗin kai ba a nuna shi a cikin zane ba kwata-kwata).

Haɗin salon BPM
Wannan shine yadda tsarin yake kama da shi bayan an yi gyare-gyare da yawa na fayyace buƙatun

Hanyar fita daga cikin wannan yanayin shine haɗin injin jBPM cikin wasu samfurori tare da mafi rikitarwa tsarin kasuwanci. A cikin ɗan gajeren lokaci, wannan bayani ya sami nasara: ya zama mai yiwuwa a aiwatar da tsarin kasuwanci mai rikitarwa yayin da yake riƙe da cikakken bayani da zane na zamani a cikin bayanin kula. Farashin BPMN2.

Haɗin salon BPM
Ƙananan ɓangaren tsarin kasuwanci mai rikitarwa

A cikin dogon lokaci, mafita ba ta ci gaba da tsammanin ba: babban ƙarfin aiki na samar da hanyoyin kasuwanci ta hanyar kayan aikin gani bai ba da damar samun alamun yawan aiki mai karɓa ba, kuma kayan aiki da kansa ya zama ɗaya daga cikin mafi ƙi a tsakanin masu haɓakawa. Har ila yau, akwai gunaguni game da tsarin ciki na injin, wanda ya haifar da bayyanar da yawa "faci" da "crutches".

Babban abin da ya dace na amfani da jBPM shine fahimtar fa'idodi da lahani na samun juriyar yanayinsa don misalin tsarin kasuwanci. Mun kuma ga yiwuwar yin amfani da tsarin tsari don aiwatar da ƙayyadaddun ƙa'idodin haɗin kai tsakanin aikace-aikace daban-daban ta amfani da hulɗar asynchronous ta hanyar sakonni da sakonni. Kasancewar yanayi mai tsayi yana taka muhimmiyar rawa a cikin wannan.

Bisa ga abin da ke sama, za mu iya kammala: Tsarin tsari a cikin salon BPM yana ba mu damar warware ayyuka da yawa don sarrafa sarrafa tsarin tafiyar da kasuwanci mai rikitarwa, daidaita ayyukan haɗa kai cikin waɗannan hanyoyin da kuma riƙe ikon nuna aikin da aka aiwatar a cikin ingantaccen bayanin kula.

Lalacewar kira na aiki tare azaman tsarin haɗin kai

Ana fahimtar haɗin haɗin gwiwa azaman mafi sauƙin toshe kira. Ɗayan tsarin ƙasa yana aiki azaman gefen uwar garken kuma yana fallasa API tare da hanyar da ake so. Wani tsarin ƙasa yana aiki azaman gefen abokin ciniki kuma, a daidai lokacin, yayi kira tare da tsammanin sakamako. Dangane da tsarin gine-gine na tsarin, abokin ciniki da bangarorin uwar garken za a iya karbar bakuncin ko dai a cikin aikace-aikacen da tsari iri ɗaya, ko kuma a cikin daban-daban. A cikin akwati na biyu, kuna buƙatar aiwatar da wasu aiwatar da RPC kuma ku samar da marshalling na sigogi da sakamakon kiran.

Haɗin salon BPM

Irin wannan tsarin haɗin kai yana da babban tsari na koma baya, amma ana amfani da shi sosai a aikace saboda sauƙin sa. Gudun aiwatarwa yana ɗaukar hankali kuma yana sa ku yi amfani da shi akai-akai a cikin yanayin "ƙonawa" ƙayyadaddun ƙayyadaddun bayanai, rubuta bayani a cikin bashin fasaha. Amma kuma yana faruwa cewa ƙwararrun masu haɓakawa suna amfani da shi ba tare da saninsa ba, kawai ba su fahimci mummunan sakamako ba.

Baya ga mafi bayyanan karuwa a cikin haɗin tsarin tsarin ƙasa, akwai ƙananan matsalolin da ba a bayyana ba game da " yadawa" da "mikewa" ma'amaloli. Lallai, idan dabarar kasuwanci ta yi kowane canje-canje, to, ma'amaloli ba makawa ne, kuma ma'amaloli, bi da bi, suna kulle wasu albarkatun aikace-aikacen da waɗannan canje-canjen suka shafa. Wato har sai wani tsarin da ke jiran amsa daga wani, ba zai iya kammala ciniki da sakin makullai ba. Wannan yana ƙara haɓaka haɗarin tasiri iri-iri:

  • An rasa amsawar tsarin, masu amfani suna jira dogon lokaci don amsoshin buƙatun;
  • uwar garken gabaɗaya yana dakatar da amsa buƙatun mai amfani saboda tafkin zaren da ya mamaye: yawancin zaren suna “tsaye” akan kulle albarkatun da cinikin ya mamaye;
  • deadlocks fara bayyana: yiwuwar faruwarsu da karfi ya dogara da tsawon lokacin ma'amaloli, adadin dabaru na kasuwanci da makullai da ke cikin ma'amala;
  • kurakurai na ƙarewar lokacin ma'amala sun bayyana;
  • uwar garken "ya fadi" a kan OutOfMemory idan aikin yana buƙatar sarrafawa da canza yawancin bayanai, kuma kasancewar haɗin haɗin kai yana sa ya zama da wuya a raba aiki zuwa ma'amaloli "masu haske".

Daga ra'ayi na gine-gine, yin amfani da toshe kira a lokacin haɗin kai yana haifar da asarar kula da ingancin tsarin tsarin kowane mutum: ba shi yiwuwa a tabbatar da ingantattun maƙasudin tsarin tsarin guda ɗaya a ware daga ingantattun maƙasudin wani tsarin tsarin. Idan ƙungiyoyi daban-daban sun haɓaka tsarin tsarin ƙasa, wannan babbar matsala ce.

Abubuwa suna da ban sha'awa sosai idan ƙananan tsarin da ake haɗa su suna cikin aikace-aikace daban-daban kuma ana buƙatar yin canje-canje na aiki tare a ɓangarorin biyu. Yadda ake yin waɗannan sauye-sauyen ciniki?

Idan an yi canje-canje a cikin ma'amaloli daban-daban, to ana buƙatar samar da ingantaccen kulawa da ramuwa, kuma wannan gaba ɗaya yana kawar da babban fa'idar haɗin kai - sauƙi.

Har ila yau, ma'amaloli da aka rarraba suna zuwa hankali, amma ba ma amfani da su a cikin hanyoyinmu: yana da wuya a tabbatar da aminci.

"Saga" a matsayin mafita ga matsalar ma'amala

Tare da karuwar shaharar ƙananan sabis, ana samun karuwar buƙata Tsarin Saga.

Wannan tsarin daidai warware matsalolin da ke sama na tsawon ma'amaloli, kuma yana faɗaɗa yiwuwar sarrafa yanayin tsarin daga gefen dabarun kasuwanci: diyya bayan ma'amala mara nasara bazai mirgine tsarin zuwa asalin sa ba, amma samar da madadin. hanyar sarrafa bayanai. Hakanan yana ba ku damar sake maimaita matakan sarrafa bayanai cikin nasara lokacin da kuke ƙoƙarin kawo tsarin zuwa ƙarshen "mai kyau".

Abin sha'awa shine, a cikin tsarin monolithic, wannan ƙirar kuma yana da dacewa idan ana batun haɗa tsarin tsarin da ba a kwance ba kuma akwai mummunan tasirin da dogayen ma'amaloli ke haifar da makullin albarkatu masu dacewa.

Dangane da tsarin kasuwancin mu a cikin salon BPM, ya zama mai sauƙin aiwatar da Sagas: ana iya saita matakan mutum ɗaya na Sagas azaman ayyuka a cikin tsarin kasuwanci, kuma yanayin tsarin kasuwanci ya ƙayyade, tsakanin wasu abubuwa, yanayin ciki na Sagas. Wato ba ma buƙatar ƙarin hanyar haɗin kai. Duk abin da kuke buƙata shine dillalin saƙo tare da goyan bayan garantin "aƙalla sau ɗaya" azaman sufuri.

Amma irin wannan maganin kuma yana da nasa "farashin":

  • dabarun kasuwanci ya zama mafi rikitarwa: kuna buƙatar aiwatar da ramuwa;
  • zai zama dole a watsar da cikakken daidaito, wanda zai iya zama mai mahimmanci ga tsarin monolithic;
  • gine-ginen ya zama dan kadan mai rikitarwa, akwai ƙarin buƙatar mai kulla sako;
  • ƙarin saka idanu da kayan aikin gudanarwa za a buƙaci (ko da yake a gaba ɗaya wannan yana da kyau: ingancin sabis na tsarin zai ƙara).

Don tsarin monolithic, hujjar amfani da "Sags" ba a bayyane yake ba. Don microservices da sauran SOAs, inda, mafi kusantar, akwai rigar dillali, kuma an sadaukar da cikakken daidaito a farkon aikin, fa'idodin amfani da wannan ƙirar na iya fin rashin amfani sosai, musamman idan akwai API mai dacewa a wurin. kasuwanci dabaru matakin.

Ƙaddamar da dabarun kasuwanci a cikin ƙananan ayyuka

Lokacin da muka fara gwaji tare da microservices, tambaya mai ma'ana ta taso: inda za a sanya dabarun kasuwanci na yanki dangane da sabis ɗin da ke ba da juriyar bayanan yanki?

Lokacin kallon tsarin gine-gine na BPMS daban-daban, yana iya zama kamar ma'ana don raba dabarun kasuwanci daga dagewa: ƙirƙirar dandamali na dandamali da microservices masu zaman kansu waɗanda ke samar da yanayi da akwati don aiwatar da dabarun kasuwanci na yanki, da kuma tsara bayanan yanki a matsayin keɓantacce. Layer na ƙananan ayyuka masu sauƙi da sauƙi. Hanyoyin kasuwanci a cikin wannan yanayin suna tsara ayyukan layin dagewa.

Haɗin salon BPM

Wannan tsarin yana da babban ƙari: zaku iya haɓaka aikin dandamali gwargwadon yadda kuke so, kuma kawai layin da ya dace na microservices na dandamali zai “sami mai” daga wannan. Hanyoyin kasuwanci daga kowane yanki nan da nan suna samun damar yin amfani da sabon aikin dandamali da zarar an sabunta shi.

Binciken da aka yi dalla-dalla ya nuna gazawar wannan hanya:

  • sabis na dandamali wanda ke aiwatar da dabarun kasuwanci na yankuna da yawa a lokaci ɗaya yana ɗaukar haɗari mai girma a matsayin maki ɗaya na gazawa. Canje-canje akai-akai ga dabarun kasuwanci yana ƙara haɗarin kwari da ke haifar da gazawar tsarin;
  • al'amurran da suka shafi aiki: dabaru na kasuwanci yana aiki tare da bayanan sa ta hanyar kunkuntar ke dubawa da jinkirin:
    • za a sake murƙushe bayanan kuma a zuga su ta cikin tarin cibiyar sadarwa;
    • Sabis na yanki zai sau da yawa ya dawo da ƙarin bayanai fiye da dabarun kasuwanci da ake buƙata don sarrafawa, saboda rashin isassun damar daidaita ma'aunin tambaya a matakin API na waje na sabis;
    • da dama masu zaman kansu na dabarun kasuwanci na iya maimaita neman bayanai iri ɗaya don sarrafawa (zaka iya rage wannan matsala ta ƙara waken zaman da ke ɓoye bayanan, amma wannan yana ƙara dagula tsarin gine-gine kuma yana haifar da matsalolin sabobin bayanai da ɓarnawar cache);
  • al'amurran mu'amala:
    • Hanyoyin kasuwanci tare da yanayin dagewa da aka adana ta hanyar sabis ɗin dandamali ba su dace da bayanan yanki ba, kuma babu hanyoyi masu sauƙi don magance wannan matsala;
    • matsar da makullin bayanan yanki daga cikin ma'amala: idan dabarun kasuwanci na yanki yana buƙatar yin canje-canje, bayan da aka fara bincika daidaitattun bayanan na ainihi, ya zama dole don ware yiwuwar canji mai gasa a cikin bayanan da aka sarrafa. Kashe bayanan waje na iya taimakawa wajen magance matsalar, amma irin wannan maganin yana ɗaukar ƙarin haɗari kuma yana rage yawan amincin tsarin;
  • ƙarin rikitarwa lokacin ɗaukakawa: a wasu lokuta, kuna buƙatar sabunta sabis na dagewa da dabaru na kasuwanci tare ko a tsayayyen jeri.

A ƙarshe, dole ne in koma ga tushen asali: tattara bayanan yanki da dabaru na kasuwanci na yanki cikin ƙaramin sabis guda ɗaya. Wannan tsarin yana sauƙaƙe fahimtar microservice a matsayin wani abu mai mahimmanci a cikin tsarin kuma baya haifar da matsalolin da ke sama. Wannan kuma ba kyauta ba ne:

  • Ana buƙatar daidaitawar API don hulɗa tare da dabarun kasuwanci (musamman, don samar da ayyukan mai amfani a matsayin wani ɓangare na tsarin kasuwanci) da sabis na dandalin API; yanayin da ya fi hankali ga canje-canjen API, ana buƙatar dacewa gaba da baya;
  • ana buƙatar ƙara ƙarin ɗakunan karatu na lokaci-lokaci don tabbatar da aiki na dabarun kasuwanci a matsayin wani ɓangare na kowane nau'in microservice, kuma wannan yana haifar da sabbin buƙatu don irin waɗannan ɗakunan karatu: haske da ƙaramin abin dogaro;
  • Masu haɓaka dabaru na kasuwanci suna buƙatar ci gaba da lura da nau'ikan laburare: idan microservice bai daɗe ba, to tabbas zai ƙunshi sigar ɗakunan karatu da suka tsufa. Wannan na iya zama cikas da ba zato ba tsammani don ƙara sabon fasali kuma yana iya buƙatar tsohon dabarun kasuwanci na irin wannan sabis ɗin don ƙaura zuwa sabbin nau'ikan ɗakunan karatu idan akwai canje-canjen da ba su dace ba tsakanin nau'ikan.

Haɗin salon BPM

Har ila yau, Layer na sabis na dandamali yana cikin irin wannan gine-gine, amma wannan Layer ba ya zama akwati don aiwatar da dabarun kasuwanci na yanki, amma kawai yanayinsa, yana samar da ayyuka na "dandamali". Ana buƙatar irin wannan Layer ba kawai don kula da hasken microservices na yanki ba, har ma don daidaita gudanarwa.

Misali, ayyukan mai amfani a cikin hanyoyin kasuwanci suna haifar da ayyuka. Koyaya, lokacin aiki tare da ɗawainiya, mai amfani dole ne ya ga ayyuka daga duk yankuna a cikin jeri na gabaɗaya, wanda ke nufin cewa dole ne a sami sabis ɗin dandamali na rajista mai dacewa, wanda aka share daga dabarun kasuwanci na yanki. Tsayawa haƙƙin haƙƙin kasuwanci a cikin wannan mahallin yana da matsala sosai, kuma wannan wani sulhu ne na wannan gine-gine.

Haɗin tsarin kasuwanci ta hanyar idon mai haɓaka aikace-aikacen

Kamar yadda aka riga aka ambata a sama, dole ne a cire mai haɓaka aikace-aikacen daga fasalolin fasaha da injiniya na aiwatar da hulɗar aikace-aikacen da yawa don samun damar ƙididdige haɓakar haɓakar haɓaka mai kyau.

Bari mu yi ƙoƙari mu warware matsalar haɗin kai mai wahala, musamman ƙirƙira don labarin. Wannan zai zama aikin "wasa" mai kunshe da aikace-aikace guda uku, inda kowannen su ya bayyana wasu sunaye: "app1", "app2", "app3".

A cikin kowane aikace-aikacen, ana ƙaddamar da ayyukan kasuwanci waɗanda ke fara "wasa ball" ta hanyar bas ɗin haɗin gwiwa. Saƙonni masu sunan "Ball" za su yi aiki azaman ƙwallon.

Dokokin Wasan:

  • dan wasa na farko shine mai farawa. Ya gayyaci sauran 'yan wasa zuwa wasan, ya fara wasan kuma zai iya ƙare shi a kowane lokaci;
  • sauran 'yan wasan suna bayyana shiga cikin wasan, "sanya" juna da dan wasa na farko;
  • bayan ya karbi kwallon, dan wasan ya zabi wani dan wasan da zai shiga ya mika masa kwallon. An ƙidaya jimlar adadin wucewa;
  • kowane ɗan wasa yana da “makamashi”, wanda ke raguwa tare da kowane wucewar ƙwallon ta wannan ɗan wasan. Lokacin da makamashi ya ƙare, an cire dan wasan daga wasan, yana sanar da yin ritaya;
  • idan aka bar dan wasan shi kadai, nan take ya bayyana tafiyarsa;
  • lokacin da aka kawar da duk 'yan wasa, ɗan wasa na farko ya bayyana ƙarshen wasan. Idan ya bar wasan a baya, to ya rage a bi wasan don kammala shi.

Don magance wannan matsalar, zan yi amfani da DSL ɗinmu don tafiyar da harkokin kasuwanci, wanda ke ba ku damar kwatanta dabaru a cikin Kotlin a hankali, tare da ƙaramin tukunyar jirgi.

A cikin aikace-aikacen app1, tsarin kasuwanci na ɗan wasa na farko (shine wanda ya fara wasan) zai yi aiki:

Class InitialPlayer

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

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

class PlayersList : ArrayList<PlayerInfo>()

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

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

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

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

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

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

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

Baya ga aiwatar da dabarun kasuwanci, lambar da ke sama za ta iya samar da samfurin abu na tsarin kasuwanci wanda za a iya gani a matsayin zane. Har yanzu ba mu aiwatar da na'urar gani ba tukuna, don haka dole ne mu ɗauki ɗan lokaci zana zane (a nan na ɗan sauƙaƙa bayanin BPMN game da amfani da ƙofofin don inganta daidaiton zane tare da lambar da ke sama):

Haɗin salon BPM

app2 zai ƙunshi tsarin kasuwanci na wani ɗan wasa:

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

Tsari:

Haɗin salon BPM

A cikin aikace-aikacen app3, za mu sanya mai kunnawa da ɗan ƙaramin hali: maimakon zaɓin ɗan wasa na gaba ba da gangan ba, zai yi aiki bisa ga tsarin zagaye-robin:

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

In ba haka ba, halin ɗan wasan bai bambanta da na baya ba, don haka zane ba ya canzawa.

Yanzu muna buƙatar gwaji don gudanar da shi duka. Zan ba da lambar gwajin da kanta kawai, don kada in lalata labarin tare da tukunyar jirgi (a zahiri, na yi amfani da yanayin gwajin da aka kirkira a baya don gwada haɗakar sauran hanyoyin kasuwanci):

wasan gwaji()

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

Guda gwajin, duba log ɗin:

kayan aikin wasan bidiyo

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

Ana iya yanke shawara da yawa daga duk waɗannan:

  • idan akwai kayan aikin da ake buƙata, masu haɓaka aikace-aikacen na iya ƙirƙirar hulɗar haɗin kai tsakanin aikace-aikacen ba tare da rabu da dabarun kasuwanci ba;
  • hadaddun (rikitarwa) na aikin haɗin kai wanda ke buƙatar ƙwarewar injiniya za a iya ɓoye a cikin tsarin idan an fara shi a cikin gine-ginen tsarin. Ba za a iya ɓoye wahalar aikin (wahala) ba, don haka maganin aiki mai wahala a cikin lambar zai duba daidai;
  • lokacin da ake haɓaka dabarun haɗin kai, ya zama dole a yi la'akari da daidaituwa na ƙarshe da rashin daidaituwar layi na canjin jihar na duk mahalarta haɗin gwiwa. Wannan yana tilasta mana mu rikitar da hankali don sanya shi rashin kula da tsarin da al'amuran waje ke faruwa. A cikin misalinmu, an tilasta wa dan wasan shiga wasan bayan ya sanar da ficewarsa daga wasan: sauran 'yan wasa za su ci gaba da ba shi kwallon har sai bayanan fitarsa ​​ya kai kuma duk mahalarta sun sarrafa su. Wannan dabarar ba ta bi daga ka'idodin wasan ba kuma mafita ce ta sulhu a cikin tsarin gine-ginen da aka zaɓa.

Na gaba, bari mu yi magana game da daban-daban subtleties na mu mafita, compromises da sauran maki.

Duk saƙonni a cikin layi ɗaya

Duk aikace-aikacen da aka haɗa suna aiki tare da bas ɗin haɗin kai ɗaya, wanda aka gabatar a matsayin dillali na waje, BPMQueue ɗaya don saƙonni da kuma batu na BPMTopic guda ɗaya don sigina (al'amuran). Aiwatar da duk saƙonni ta cikin layi ɗaya a cikin kansa sulhu ne. A matakin dabaru na kasuwanci, yanzu zaku iya gabatar da sabbin nau'ikan saƙonni kamar yadda kuke so ba tare da yin canje-canje ga tsarin tsarin ba. Wannan sauƙaƙa ne mai mahimmanci, amma yana ɗaukar wasu haɗari, waɗanda, a cikin mahallin ayyukanmu na yau da kullun, kamar a gare mu ba su da mahimmanci.

Haɗin salon BPM

Koyaya, akwai dabara guda ɗaya a nan: kowane aikace-aikacen yana tace saƙonnin "sa" daga layin da ke ƙofar, da sunan yankinsa. Har ila yau, ana iya ƙayyade yankin a cikin sigina, idan kuna buƙatar iyakance "ikon" na siginar zuwa aikace-aikacen guda ɗaya. Wannan yakamata ya haɓaka bandwidth na bas, amma dabarun kasuwanci dole ne yanzu suyi aiki tare da sunayen yanki: wajibi don magance saƙonni, kyawawa don sigina.

Tabbatar da amincin bas ɗin haɗin gwiwa

Dogara ya ƙunshi abubuwa da yawa:

  • Zaɓaɓɓen dillalin saƙo muhimmin sashi ne na gine-ginen kuma batu guda na gazawa: dole ne ya kasance mai cikakken haƙuri. Ya kamata ku yi amfani da aiwatar da gwaje-gwajen lokaci kawai tare da kyakkyawan tallafi da babban al'umma;
  • ya zama dole don tabbatar da yawan samun dillalin saƙo, wanda dole ne a raba shi ta jiki daga aikace-aikacen da aka haɗa (samuwar yawan aikace-aikacen tare da dabarun kasuwanci da aka yi amfani da su ya fi wahala da tsada don samarwa);
  • Wajibi ne dillali ya samar da garantin isar da “aƙalla sau ɗaya”. Wannan wajibi ne don ingantaccen aiki na bas ɗin haɗin gwiwa. Babu buƙatar garantin matakin "daidai sau ɗaya": tsarin kasuwanci yawanci ba sa kula da maimaita zuwan saƙonni ko abubuwan da suka faru, kuma a cikin ayyuka na musamman inda wannan yake da mahimmanci, yana da sauƙi don ƙara ƙarin cak zuwa dabaru na kasuwanci fiye da amfani da kullun. maimakon "tsada"" garanti;
  • aika saƙonni da sigina dole ne su shiga cikin ma'amala na yau da kullun tare da canji a cikin yanayin hanyoyin kasuwanci da bayanan yanki. Zaɓin da aka fi so shine yin amfani da ƙirar Akwatin Kasuwanci, amma zai buƙaci ƙarin tebur a cikin ma'ajin bayanai da kuma relay. A cikin aikace-aikacen JEE, ana iya sauƙaƙa wannan ta amfani da mai sarrafa JTA na gida, amma haɗin zuwa dillali da aka zaɓa dole ne ya sami damar yin aiki a cikin yanayi. XA;
  • masu kula da sakonni masu shigowa da abubuwan da suka faru dole ne su yi aiki tare da ma'amala na canza yanayin tsarin kasuwanci: idan irin wannan ciniki ya koma baya, to dole ne a soke karɓar saƙon;
  • saƙonnin da ba a iya isarwa saboda kurakurai yakamata a adana su a cikin wani kantin daban Farashin DLQ (Dead Letter Queue). Don yin wannan, mun ƙirƙiri wani microservice na dandamali daban wanda ke adana irin waɗannan saƙon a cikin ma'ajiyarsa, mu nuna su ta halaye (don haɗawa cikin sauri da bincike), kuma mu fallasa API ɗin don dubawa, sake aikawa zuwa adireshin inda aka nufa, da share saƙonni. Masu gudanar da tsarin za su iya aiki tare da wannan sabis ɗin ta hanyar haɗin yanar gizon su;
  • a cikin saitunan dillali, kuna buƙatar daidaita adadin sake dawo da isarwa da jinkiri tsakanin isarwa don rage yuwuwar saƙon shiga cikin DLQ (yana da kusan ba zai yuwu a ƙididdige ma'auni mafi kyau ba, amma kuna iya yin aiki da ƙarfi da daidaita su a lokacin. aiki);
  • ya kamata a ci gaba da lura da kantin sayar da DLQ, kuma tsarin kulawa ya kamata ya sanar da masu gudanar da tsarin don su iya ba da amsa da sauri lokacin da saƙonnin da ba a kai ba. Wannan zai rage "yankin lalacewa" na gazawar ko kuskuren dabaru na kasuwanci;
  • bas ɗin haɗin kai dole ne ya kasance da rashin jin daɗi ga rashin aikace-aikacen wucin gadi: biyan kuɗi dole ne ya kasance mai ɗorewa, kuma sunan yankin na aikace-aikacen dole ne ya zama na musamman don kada wani ya yi ƙoƙarin aiwatar da saƙon sa daga jerin gwano yayin rashin aikace-aikacen.

Tabbatar da amincin zaren aminci na dabarun kasuwanci

Misali guda na tsarin kasuwanci na iya karɓar saƙonni da abubuwan da suka faru da yawa a lokaci ɗaya, wanda sarrafa su zai fara a layi daya. A lokaci guda, ga mai haɓaka aikace-aikacen, duk abin da ya kamata ya zama mai sauƙi da aminci.

Tsarin dabaru na kasuwanci yana aiwatar da kowane taron waje wanda ya shafi wannan tsarin kasuwanci daban-daban. Waɗannan abubuwan na iya zama:

  • ƙaddamar da misalin tsarin kasuwanci;
  • aikin mai amfani da ke da alaƙa da wani aiki a cikin tsarin kasuwanci;
  • karɓar saƙo ko sigina wanda aka yi rajistar tsarin kasuwanci;
  • ƙarewar lokacin da aka saita ta misalin tsarin kasuwanci;
  • aikin sarrafawa ta hanyar API (misali tsarin zubar da ciki).

Kowane irin wannan taron na iya canza yanayin tsarin kasuwanci misali: wasu ayyukan na iya ƙarewa wasu kuma suna farawa, ƙimar kaddarorin dindindin na iya canzawa. Rufe kowane aiki na iya haifar da kunna ɗaya ko fiye na ayyuka masu zuwa. Waɗanda, bi da bi, za su iya dakatar da jiran wasu abubuwan da suka faru, ko, idan ba su bukatar wani ƙarin bayanai, za su iya kammala a cikin wannan ma'amala. Kafin rufe ma'amala, an adana sabon yanayin tsarin kasuwanci a cikin bayanan, inda zai jira taron waje na gaba.

Dagewar bayanan tsarin kasuwanci da aka adana a cikin bayanan alaƙa wuri ne mai dacewa da aiki tare yayin amfani da SELECT DON UPDATE. Idan wata ciniki ta sami nasarar samun yanayin tsarin kasuwanci daga tushe don canza shi, to babu wata ciniki a layi daya da za ta iya samun irin wannan yanayin don wani canji, kuma bayan kammala ciniki na farko, na biyu shine. garantin karɓar halin da aka rigaya ya canza.

Yin amfani da makullai masu ƙima a gefen DBMS, muna cika duk buƙatun da ake bukata ACID, kuma kuma yana riƙe da ikon daidaita aikace-aikacen tare da dabaru na kasuwanci ta hanyar ƙara yawan lokuta masu gudana.

Koyaya, makullai masu ƙima suna tsoratar da mu da makullai, wanda ke nufin cewa ZABEN SAMUN KYAUTA yakamata a iyakance shi zuwa wasu madaidaitan lokaci idan akwai maɓalli akan wasu mugayen lamura a cikin dabarun kasuwanci.

Wata matsala ita ce daidaitawar farkon tsarin kasuwanci. Duk da yake babu misalin tsarin kasuwanci, babu wata jiha a cikin bayanan ko dai, don haka hanyar da aka bayyana ba za ta yi aiki ba. Idan kana son tabbatar da keɓantaccen misalin tsarin kasuwanci a cikin wani yanki na musamman, to kana buƙatar wani nau'in abu na aiki tare da ke da alaƙa da ajin tsari da madaidaicin ikonsa. Don magance wannan matsalar, muna amfani da tsarin kulle daban wanda ke ba mu damar ɗaukar maɓalli a kan hanya ta sabani da maɓalli ya kayyade ta hanyar URI ta hanyar sabis na waje.

A cikin misalan mu, tsarin kasuwancin InitialPlayer ya ƙunshi sanarwa

uniqueConstraint = UniqueConstraints.singleton

Don haka, log ɗin yana ƙunshe da saƙonni game da ɗauka da sakin makullin maɓalli mai dacewa. Babu irin waɗannan saƙon don sauran hanyoyin kasuwanci: na musamman ba a saita takura.

Matsalolin tsarin kasuwanci tare da yanayin dagewa

Wani lokaci samun yanayin dagewa ba kawai yana taimakawa ba, har ma da gaske yana hana ci gaba.
Matsaloli suna farawa lokacin da kuke buƙatar yin canje-canje ga dabaru na kasuwanci da / ko ƙirar tsarin kasuwanci. Ba a sami irin wannan canjin da ya dace da tsohuwar yanayin tafiyar da kasuwanci ba. Idan akwai lokuttan "rayuwa" da yawa a cikin bayanan, to, yin canje-canjen da ba su dace ba na iya haifar da matsala mai yawa, wanda sau da yawa muna fuskantar lokacin amfani da jBPM.

Dangane da zurfin canji, zaku iya aiki ta hanyoyi biyu:

  1. ƙirƙirar sabon nau'in tsarin kasuwanci don kar a yi canje-canje marasa jituwa ga tsohon, kuma amfani da shi maimakon tsohon lokacin fara sabbin lokuta. Tsoffin lokuta za su ci gaba da aiki "tsohuwar hanya";
  2. ƙaura yanayin dagewar tsarin kasuwanci lokacin sabunta dabaru na kasuwanci.

Hanya ta farko ta fi sauƙi, amma tana da iyaka da rashin amfaninta, misali:

  • kwafi na dabaru na kasuwanci a yawancin tsarin tsarin kasuwanci, karuwa a cikin adadin dabaru na kasuwanci;
  • sau da yawa ana buƙatar sauyawa nan take zuwa sabon dabarun kasuwanci (kusan koyaushe dangane da ayyukan haɗin kai);
  • mai haɓakawa bai sani ba a wane lokaci zai yiwu a share samfuran da ba a gama ba.

A aikace, muna amfani da hanyoyin biyu, amma mun yanke shawara da yawa don sauƙaƙa rayuwarmu:

  • a cikin ma'ajin bayanai, ana adana yanayin tsarin kasuwanci mai dorewa a cikin sauƙin karantawa da sauƙin sarrafawa: a cikin sigar tsarin JSON. Wannan yana ba ku damar yin ƙaura duka cikin aikace-aikacen da waje. A cikin matsanancin yanayi, zaka iya tweak da shi tare da hannaye (musamman masu amfani a ci gaba a lokacin lalatawa);
  • dabarun kasuwanci na haɗin kai ba ya amfani da sunayen hanyoyin kasuwanci, don haka a kowane lokaci yana yiwuwa a maye gurbin aiwatar da ɗaya daga cikin hanyoyin shiga tare da sabon suna (misali, "InitialPlayerV2"). Daurin yana faruwa ta hanyar sunayen saƙonni da sigina;
  • samfurin tsari yana da lambar sigar, wanda muke ƙarawa idan muka yi canje-canje marasa jituwa ga wannan ƙirar, kuma ana adana wannan lambar tare da yanayin tsarin misali;
  • Ana karanta yanayin dagewa na tsari daga tushe na farko zuwa samfurin abu mai dacewa wanda tsarin ƙaura zai iya aiki tare da idan lambar sigar ƙirar ta canza;
  • Ana sanya tsarin ƙaura kusa da dabarun kasuwanci kuma ana kiransa "lazy" ga kowane misali na tsarin kasuwanci a lokacin da aka dawo da shi daga bayanan;
  • idan kuna buƙatar ƙaura zuwa yanayin duk matakan aiwatarwa cikin sauri da aiki tare, ana amfani da ƙarin ƙa'idodin ƙaura na bayanai, amma dole ne kuyi aiki tare da JSON a can.

Ina bukatan wani tsari don hanyoyin kasuwanci?

Maganganun da aka bayyana a cikin labarin sun ba mu damar sauƙaƙe rayuwarmu sosai, fadada kewayon batutuwan da aka warware a matakin haɓaka aikace-aikacen, da sanya ra'ayin raba dabarun kasuwanci zuwa microservices mafi kyau. Don wannan, an yi aiki da yawa, an ƙirƙiri tsarin "mai nauyi" sosai don hanyoyin kasuwanci, da kuma sassan sabis don magance matsalolin da aka gano a cikin mahallin ayyuka masu yawa da aka yi amfani da su. Muna da sha'awar raba waɗannan sakamakon, don kawo haɓaka abubuwan gama gari zuwa buɗe damar shiga ƙarƙashin lasisin kyauta. Wannan zai buƙaci ɗan ƙoƙari da lokaci. Fahimtar buƙatun irin waɗannan hanyoyin zai iya zama ƙarin abin ƙarfafawa a gare mu. A cikin labarin da aka tsara, an ba da hankali sosai ga iyawar tsarin kanta, amma wasu daga cikinsu ana iya gani daga misalan da aka gabatar. Idan duk da haka muka buga tsarin mu, za a keɓance wani labarin dabam da shi. A halin yanzu, za mu yi godiya idan kun bar ra'ayi kadan ta hanyar amsa tambayar:

Masu amfani da rajista kawai za su iya shiga cikin binciken. Shigadon Allah.

Ina bukatan wani tsari don hanyoyin kasuwanci?

  • 18,8%Eh, na dade ina neman wani abu makamancin haka.

  • 12,5%yana da ban sha'awa don ƙarin koyo game da aiwatar da ku, yana iya zama da amfani2

  • 6,2%muna amfani da ɗaya daga cikin tsarin da ake da su, amma muna tunanin maye gurbin shi1

  • 18,8%muna amfani da ɗaya daga cikin tsarin da ake da su, duk abin da ya dace3

  • 18,8%jurewa ba tare da tsarin 3

  • 25,0%rubuta naka4

Masu amfani 16 sun kada kuri'a. Masu amfani 7 sun kaurace.

source: www.habr.com

Add a comment