Kuti zitheke, timagwiritsa ntchito mawu oti "document" polankhulana ngati chidule cha seti ya data yolumikizidwa ndi kiyi wamba yomwe mayendedwe ena amatha "kulumikizidwa".
Koma bwanji za kuphatikiza logic? Kupatula apo, ntchito yophatikizira imapangidwa ndi mamangidwe a dongosolo, lomwe "lodulidwa" m'magawo OSATI pa pempho la kasitomala, koma mothandizidwa ndi zinthu zosiyanasiyana:
malinga ndi lamulo la Conway;
chifukwa chogwiritsanso ntchito ma subsystems omwe adapangidwa kale pazinthu zina;
pakufuna kwa mmisiri wa zomangamanga, kutengera zosowa zosagwira ntchito.
Pali chiyeso chachikulu cholekanitsa malingaliro ophatikizana ndi malingaliro abizinesi amayendedwe akulu, kuti musawononge malingaliro abizinesi ndi zophatikizira zophatikizika ndikupulumutsa wopanga mapulogalamu pakufunika kuti afufuze mbali za kamangidwe ka dongosolo. Njirayi ili ndi maubwino angapo, koma machitidwe akuwonetsa kusagwira ntchito kwake:
kuthetsa mavuto ophatikizana nthawi zambiri kumabwereranso ku njira zosavuta kwambiri monga mafoni a synchronous chifukwa cha zochepa zowonjezera zowonjezera pakukhazikitsidwa kwa kayendetsedwe ka ntchito yaikulu (zoipa za kusakanikirana kwa synchronous zikukambidwa pansipa);
Kuipa kwa mafoni a synchronous ngati njira yophatikizira
Kuphatikiza kwa synchronous kumatanthauza kuyimba kosavuta kwambiri. Dongosolo limodzi limakhala ngati mbali ya seva ndikuwulula API ndi njira yofunikira. Dongosolo lina limakhala ngati mbali ya kasitomala ndipo nthawi yoyenera imayimba ndikudikirira zotsatira. Kutengera ndi kamangidwe kakachitidwe, kasitomala ndi mbali za seva zitha kupezeka mwanjira yofanana ndi njira, kapena mosiyana. Mugawo lachiwiri, muyenera kugwiritsa ntchito kukhazikitsa kwa RPC ndikupereka kuwongolera magawo ndi zotsatira za kuyimba.
Njira yophatikizira iyi ili ndi zovuta zambiri, koma imagwiritsidwa ntchito kwambiri pochita chifukwa cha kuphweka kwake. Kuthamanga kwa kukhazikitsa kumakopa ndikukukakamizani kuti mugwiritse ntchito mobwerezabwereza pamaso pa nthawi yomaliza, ndikulemba yankho ngati ngongole yaukadaulo. Koma zimachitikanso kuti opanga osadziwa amagwiritsa ntchito mosadziwa, osazindikira zotsatira zake.
Kuphatikiza pa kuwonjezereka koonekeratu kwa kugwirizana kwa subsystem, palinso mavuto osadziwika bwino ndi "kukula" ndi "kutambasula" zochitika. Zowonadi, ngati malingaliro abizinesi apanga kusintha kwina, ndiye kuti kugulitsa sikungapewedwe, ndipo kugulitsako kumalepheretsa zida zina zomwe zimakhudzidwa ndi kusinthaku. Ndiye kuti, mpaka kagawo kakang'ono kakudikirira kuyankha kuchokera kwa winayo, sangathe kumaliza ntchitoyo ndikuchotsa zotsekera. Izi zimawonjezera kwambiri chiopsezo cha zotsatira zosiyanasiyana:
seva nthawi zambiri imasiya kuyankha zopempha za ogwiritsa ntchito chifukwa chakuchulukirachulukira kwa ulusi: ulusi wambiri umatsekedwa pazida zomwe zimagwiritsidwa ntchito;
Ma Deadlocks ayamba kuwonekera: kuthekera kwazomwe zikuchitika kumadalira nthawi yamalonda, kuchuluka kwa malingaliro abizinesi ndi maloko omwe akukhudzidwa;
zolakwa za nthawi yomaliza ya transaction zimawonekera;
seva "ikulephera" ndi OutOfMemory ngati ntchitoyo ikufuna kukonza ndikusintha deta yambiri, ndipo kukhalapo kwa ma synchronous integrations kumapangitsa kuti zikhale zovuta kwambiri kugawanitsa ntchito "zopepuka".
Kuchokera pamalingaliro omangamanga, kugwiritsa ntchito kutsekereza kuyimba panthawi yolumikizana kumabweretsa kulephera kuwongolera mtundu wamagulu ang'onoang'ono: ndizosatheka kuwonetsetsa kuti zidziwitso zamtundu wagawo limodzi mwapang'onopang'ono zimasiyanitsidwa ndi zizindikiro zamtundu wina. Ngati ma subsystems apangidwa ndi magulu osiyanasiyana, ili ndi vuto lalikulu.
Zinthu zimakhala zosangalatsa kwambiri ngati ma subsystems omwe akuphatikizidwa ali m'mapulogalamu osiyanasiyana ndipo muyenera kusintha ma synchronous mbali zonse ziwiri. Kodi mungatsimikizire bwanji kuti zosinthazi zachitika?
Ngati kusintha kumapangidwa muzochita zosiyana, ndiye kuti muyenera kupereka zodalirika zothandizira ndi kubweza, ndipo izi zimathetsa phindu lalikulu la kuphatikizika kwa synchronous - kuphweka.
Ndi kutchuka komwe kukukulirakulira kwa ma microservices, kufunikira kwa Chitsanzo cha Saga.
Chitsanzochi chimathetsa bwino mavuto omwe tawatchulawa a nthawi yayitali, komanso amakulitsa luso la kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe kake: njira ina yosinthira deta. Izi zimakupatsaninso mwayi kuti mupewe kubwereza njira zosinthira deta poyesa kubweretsa "zabwino" kumapeto.
Chochititsa chidwi n'chakuti m'machitidwe a monolithic ndondomekoyi imakhalanso yofunikira pokhudzana ndi kuphatikizika kwa ma subsystems osakanikirana ndi zotsatira zoipa zomwe zimachitika chifukwa cha nthawi yayitali komanso maloko ofananirako amawonedwa.
Mogwirizana ndi mabizinesi athu mumayendedwe a BPM, zimakhala zosavuta kukhazikitsa "Sagas": masitepe a "Saga" atha kufotokozedwa ngati zochitika mkati mwa bizinesi, komanso kulimbikira kwa bizinesi. zimatsimikizira zamkati mwa "Saga". Ndiko kuti, sitifuna njira ina yowonjezera yogwirizanitsa. Zomwe mukufunikira ndizomwe zimatsimikizira kuti "kamodzi" ngati zoyendera.
Zida zowonjezera zowunikira ndi kuyang'anira zidzafunika (ngakhale kuti izi ndizabwino: mtundu wa ntchito zadongosolo udzawonjezeka).
Kwa machitidwe a monolithic, kulungamitsidwa kwa kugwiritsa ntchito "Sag" sizowonekeratu. Kwa ma microservices ndi ma SOA ena, komwe kulipo kale broker, ndipo kusasinthika kwathunthu kumaperekedwa kumayambiriro kwa polojekiti, ubwino wogwiritsa ntchito chitsanzochi ukhoza kupitirira zovuta zake, makamaka ngati pali API yabwino pamalingaliro abizinesi. mlingo.
Kuyika malingaliro abizinesi mu ma microservices
Pamene tidayamba kuyesa ma microservices, funso lomveka lidawuka: komwe mungayike malingaliro abizinesi a domain pokhudzana ndi ntchito yomwe imatsimikizira kulimbikira kwa deta?
Mukayang'ana mamangidwe a ma BPMS osiyanasiyana, zitha kuwoneka zomveka kulekanitsa malingaliro abizinesi ndi kulimbikira: pangani nsanja ndi ma microservices odziyimira pawokha omwe amapanga chilengedwe ndi chidebe chochitira malingaliro abizinesi, ndikupanga kulimbikira kwa data ya domain monga gawo losiyana la ma microservices osavuta komanso opepuka. Njira zamabizinesi munkhaniyi zimapanga ma orchestration a ntchito zolimbikira.
Njirayi ili ndi mwayi waukulu kwambiri: mutha kukulitsa magwiridwe antchito a nsanja momwe mukufunira, ndipo gawo lokhalo lolingana la ma microservices apulogalamu lidzakhala "mafuta" kuchokera pa izi. Njira zamabizinesi kuchokera kudera lililonse zimatha kugwiritsa ntchito mawonekedwe atsopano papulatifomu ikangosinthidwa.
Kafukufuku wowonjezereka adawonetsa zovuta zazikulu za njirayi:
Pamapeto pake, tidayenera kubwereranso ku zoyambira: kuyika deta ya domain ndi malingaliro abizinesi amtundu mu microservice imodzi. Njirayi imathandizira kuzindikira kwa microservice ngati gawo lofunikira la dongosolo ndipo sizimayambitsa mavuto omwe ali pamwambapa. Izi sizikuperekedwanso kwaulere:
Kuyimitsidwa kwa API kumafunikira pakulumikizana ndi malingaliro abizinesi (makamaka, kupereka zochitika za ogwiritsa ntchito ngati gawo la bizinesi) ndi ntchito zamapulatifomu a API; imafuna chidwi chochulukirapo pakusintha kwa API, kuyenderana kutsogolo ndi kumbuyo;
Tiyeni tiyesetse kuthana ndi vuto lophatikizana lovuta kwambiri, lomwe linapangidwira nkhaniyi. Imeneyi idzakhala ntchito ya "masewera" yomwe ikuphatikizapo mapulogalamu atatu, pamene aliyense wa iwo amatanthauzira dzina lachidziwitso: "app1", "app2", "app3".
Mkati mwa pulogalamu iliyonse, njira zamabizinesi zimayambitsidwa zomwe zimayamba "kusewera mpira" kudzera mu basi yophatikiza. Mauthenga okhala ndi dzina "Mpira" adzakhala ngati mpira.
Malamulo a Masewera:
wosewera woyamba ndi woyambitsa. Amayitanira osewera ena ku masewerawo, amayamba masewerawa ndipo akhoza kuthetsa nthawi iliyonse;
osewera ena amalengeza kutenga nawo mbali mu masewerawa, "kudziwana" ndi wosewera woyamba;
atalandira mpirawo, wosewerayo amasankha wosewera wina ndikumupatsa mpirawo. Chiwerengero chonse cha ma transmission chimawerengedwa;
Wosewera aliyense ali ndi "mphamvu" zomwe zimachepa ndi pass iliyonse ya mpira ndi wosewerayo. Mphamvu ikatha, wosewera mpira amasiya masewerawo, akulengeza kuti wasiya;
Kuti tithane ndi vutoli, ndigwiritsa ntchito DSL yathu panjira zamabizinesi, zomwe zimatilola kufotokozera malingaliro a Kotlin molumikizana, ndi boilerplate yochepa.
Kachitidwe ka bizinesi ka wosewera woyamba (womwe amadziwika kuti ndiye woyambitsa masewerawa) azigwira ntchito mu app1:
kalasi 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}")
}
Kuphatikiza pakuchita malingaliro abizinesi, nambala yomwe ili pamwambapa imatha kupanga mtundu wazinthu zamabizinesi, zomwe zitha kuwoneka ngati chithunzi. Sitinagwiritse ntchito zowonera, chifukwa chake tidakhala nthawi yayitali ndikujambula (apa ndidapeputsa pang'ono mawu a BPMN okhudzana ndi kugwiritsa ntchito zipata kuti athandizire kusinthasintha kwachithunzichi ndi nambala yomwe ili pansipa):
app2 iphatikiza bizinesi ya wosewera winayo:
kalasi 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}")
}
Chithunzi:
Mu pulogalamu ya app3 tipanga wosewera yemwe ali ndi machitidwe osiyana pang'ono: m'malo mosankha wosewera wina mwachisawawa, azichita molingana ndi algorithm yozungulira-robin:
kalasi 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}")
}
Apo ayi, khalidwe la wosewera mpira silikusiyana ndi lapitalo, kotero kuti chithunzicho sichisintha.
Tsopano tikufunika kuyesa kuti tiyendetse zonsezi. Ndingopereka kachidindo kokha ka mayesowo, kuti ndisasokoneze nkhaniyo ndi boilerplate (m'malo mwake, ndidagwiritsa ntchito malo oyesera omwe adapangidwa kale kuyesa kuphatikiza njira zina zamabizinesi):
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;
}
Kuchokera pa izi titha kupeza mfundo zingapo zofunika:
ndi zida zofunikira, opanga mapulogalamu amatha kupanga kulumikizana kophatikizana pakati pa mapulogalamu popanda kusokoneza malingaliro abizinesi;
zovuta za ntchito yophatikizira yomwe imafuna luso laumisiri ikhoza kubisika mkati mwa chimango ngati izi zikuphatikizidwa poyambirira pamapangidwe a chimango. Kuvuta kwa vuto sikungathe kubisika, kotero yankho la vuto lovuta mu code lidzawoneka ngati ilo;
Popanga malingaliro ophatikizana, ndikofunikira kuganizira kusasinthika komaliza komanso kusowa kwa mzere wakusintha kwa onse omwe akutenga nawo mbali. Izi zimatikakamiza kusokoneza malingaliro athu kuti zisamve chidwi ndi dongosolo lomwe zochitika zakunja zimachitika. Mu chitsanzo chathu, wosewera mpira amakakamizika kutenga nawo mbali mu masewerawa atalengeza kuti watuluka mu masewerawo: osewera ena apitirizabe kumupatsa mpira mpaka chidziwitso chokhudza kutuluka kwake chifike ndikukonzedwa ndi onse omwe atenga nawo mbali. Lingaliro ili silimatsatira malamulo a masewerawa ndipo ndi njira yothetsera mgwirizano mkati mwa dongosolo la zomangamanga zosankhidwa.
Kenaka, tidzakambirana za zovuta zosiyanasiyana za yankho lathu, kusagwirizana ndi mfundo zina.
Mauthenga onse ali pamzere umodzi
Ntchito zonse zophatikizika zimagwira ntchito ndi basi imodzi yophatikizira, yomwe imaperekedwa ngati broker wakunja, BPMQueue imodzi ya mauthenga ndi mutu umodzi wa BPMTopic wa zizindikiro (zochitika). Kuyika mauthenga onse pamzere umodzi ndikokokera. Pamalingaliro abizinesi, mutha kuwonetsa mitundu yatsopano ya mauthenga momwe mungafunire osasintha dongosolo. Uku ndi kufewetsa kwakukulu, koma kumakhala ndi zoopsa zina, zomwe muzochitika za ntchito zathu zomwe sizinkawoneka zofunikira kwambiri kwa ife.
Komabe, pali chinyengo chimodzi apa: ntchito iliyonse imasefa "zake" mauthenga kuchokera pamzere wolowera pakhomo, ndi dzina la malo ake. Derali litha kufotokozedwanso muzizindikiro ngati mukufuna kuchepetsa "kuchuluka kwa mawonekedwe" a siginecha ku pulogalamu imodzi. Izi zikuyenera kuchulukitsa kuchuluka kwa mabasi, koma malingaliro abizinesi akuyenera kugwira ntchito ndi mayina a madambwe: poyankha mauthenga - ovomerezeka, pazizindikiro - zofunika.
Kuonetsetsa Kudalirika Kwa Basi Yophatikiza
Kudalirika kumakhala ndi mfundo zingapo:
Wothandizira uthenga wosankhidwa ndi gawo lofunika kwambiri la zomangamanga komanso vuto limodzi lolephera: liyenera kukhala lolekerera zolakwa mokwanira. Muyenera kugwiritsa ntchito zomwe zayesedwa nthawi, ndi chithandizo chabwino komanso gulu lalikulu;
ndikofunikira kuwonetsetsa kupezeka kwakukulu kwa broker wauthenga, womwe uyenera kupatulidwa mwakuthupi ndi mapulogalamu ophatikizika (kupezeka kwakukulu kwa mapulogalamu okhala ndi malingaliro abizinesi ogwiritsidwa ntchito ndikovuta kwambiri komanso okwera mtengo kuonetsetsa);
broker akuyenera kupereka zitsimikizo "kamodzi kamodzi". Ichi ndi chofunikira chofunikira pakugwira ntchito kodalirika kwa basi yophatikiza. Palibe chifukwa chotsimikizira mulingo wa "kamodzi kamodzi": njira zamabizinesi, monga lamulo, sizimakhudzidwa ndi kubwera kwa mauthenga kapena zochitika mobwerezabwereza, ndipo muntchito zapadera zomwe ndizofunikira, ndizosavuta kuwonjezera macheke owonjezera kubizinesi. logic kuposa kugwiritsa ntchito nthawi zonse "zokwera mtengo" " zitsimikizo;
kutumiza mauthenga ndi ma signature kuyenera kuphatikizidwa muzochitika zonse ndi kusintha kwa kayendetsedwe ka bizinesi ndi madomeni. Njira yabwino ndiyo kugwiritsa ntchito chitsanzo Transaction Outbox, koma idzafunika tebulo lowonjezera mu database ndi wobwereza. M'mapulogalamu a JEE, izi zitha kukhala zosavuta kugwiritsa ntchito manejala wa JTA wamba, koma kulumikizana ndi broker wosankhidwa kuyenera kugwira ntchito. XA;
mauthenga omwe sakanatha kuperekedwa chifukwa cha zolakwika ayenera kusungidwa mu malo osiyana Mtengo DLQ (Mzere Wakalata Wakufa). Pazifukwa izi, tidapanga nsanja yosiyana ya microservice yomwe imasunga mauthenga oterowo posungirako, kuwalozera molingana ndi zikhumbo zake (kuti agawane mwachangu ndikusaka), ndikuwulula API yowonera, kutumiza ku adilesi komwe akupita, ndikuchotsa mauthenga. Oyang'anira makina amatha kugwira ntchito ndi ntchitoyi kudzera pa intaneti;
pazikhazikiko za broker, muyenera kusintha kuchuluka kwa zoyeserera ndi kuchedwa pakati pa kutumiza kuti muchepetse mwayi wa mauthenga kulowa mu DLQ (ndizosatheka kuwerengera magawo oyenera, koma mutha kuchitapo kanthu mwachangu ndikuwongolera mukamagwira ntchito. );
Pogwiritsa ntchito maloko opanda chiyembekezo kumbali ya DBMS, timakwaniritsa zofunikira zonse ACID, ndikusunganso kuthekera kokulitsa ntchitoyo ndi malingaliro abizinesi powonjezera kuchuluka kwa zochitika zomwe zikuchitika.
Komabe, maloko opanda chiyembekezo amatiwopseza ndi ma deadlocks, zomwe zikutanthauza kuti SELECT FOR UPDATE iyenerabe kukhala ndi nthawi yokwanira yoti zisachitike pazochitika zina zazikulu zamabizinesi.
Vuto lina ndikugwirizanitsa chiyambi cha bizinesi. Ngakhale palibe chitsanzo cha ndondomeko ya bizinesi, palibe boma mu database, kotero njira yofotokozedwayo sigwira ntchito. Ngati mukufuna kuwonetsetsa kuti bizinesiyo ndi yapadera pazochitika zinazake, ndiye kuti mudzafunika mtundu wina wa chinthu cholumikizira cholumikizidwa ndi gulu la ndondomekoyi komanso kuchuluka kwake. Kuti tithane ndi vutoli, timagwiritsa ntchito njira yotsekera yosiyana yomwe imatilola kutseka pazida zomwe zafotokozedwa ndi kiyi yamtundu wa URI kudzera muntchito yakunja.
M'zitsanzo zathu, ndondomeko ya bizinesi ya InitialPlayer ili ndi chilengezo
uniqueConstraint = UniqueConstraints.singleton
Chifukwa chake, chipikacho chili ndi mauthenga okhudza kutenga ndi kumasula loko ya kiyi yofananira. Palibe mauthenga otere pamabizinesi ena: uniqueConstraint sinakhazikitsidwe.
Kuphatikizika kwamabizinesi sikugwiritsa ntchito mayina abizinesi, kotero kuti nthawi iliyonse ndikotheka kusinthira kukhazikitsidwa kwa imodzi mwazinthu zomwe zikutenga nawo gawo ndi yatsopano yokhala ndi dzina latsopano (mwachitsanzo, "InitialPlayerV2"). Kumangiriza kumachitika kudzera muuthenga ndi mayina azizindikiro;
ndondomekoyi ili ndi nambala yomasulira, yomwe timawonjezera ngati tisintha zosagwirizana ndi chitsanzo ichi, ndipo chiwerengerochi chimasungidwa pamodzi ndi chikhalidwe cha ndondomekoyi;
mkhalidwe wolimbikira wa ndondomekoyi umawerengedwa kuchokera ku database choyamba kukhala chitsanzo chosavuta cha chinthu, chomwe njira yosamukira ingagwire ntchito ngati nambala yachitsanzo yasintha;
njira yosamuka imayikidwa pafupi ndi ndondomeko ya bizinesi ndipo imatchedwa "waulesi" pazochitika zilizonse za bizinesi panthawi yobwezeretsa kuchokera ku database;
ngati mukufuna kusamutsa zochitika zonse mwachangu komanso molumikizana, njira zosinthira zakale zimagwiritsidwa ntchito, koma muyenera kugwira ntchito ndi JSON.
Kodi mukufuna chimango china chanjira zamabizinesi?
Mayankho omwe afotokozedwa m'nkhaniyi adatipatsa mwayi wofewetsa moyo wathu, kukulitsa zovuta zomwe zathetsedwa pakukula kwa ntchito, ndikupanga lingaliro lolekanitsa malingaliro abizinesi kukhala ma microservices okongola kwambiri. Kuti akwaniritse izi, ntchito zambiri zidachitidwa, ndondomeko "yopepuka" kwambiri yoyendetsera bizinesi idapangidwa, komanso zigawo zautumiki kuti zithetse mavuto omwe akudziwika pazochitika za mavuto osiyanasiyana ogwiritsira ntchito. Tili ndi chikhumbo chogawana zotsatira izi ndikupanga chitukuko cha zigawo zofanana kuti zitsegulidwe pansi pa chilolezo chaulere. Izi zidzafuna khama ndi nthawi. Kumvetsetsa kufunikira kwa mayankho otere kungakhale chilimbikitso china kwa ife. M'nkhani yomwe ikufunsidwa, chidwi chochepa kwambiri chimaperekedwa ku mphamvu za chimango chokha, koma zina zimawoneka kuchokera ku zitsanzo zomwe zaperekedwa. Ngati tisindikiza ndondomeko yathu, nkhani ina idzaperekedwa kwa izo. Pakadali pano, tingakhale othokoza ngati mutasiya ndemanga pang'ono poyankha funso:
Ogwiritsa ntchito olembetsedwa okha ndi omwe angatenge nawo gawo pa kafukufukuyu. Lowani muakauntichonde.
Kodi mukufuna chimango china chanjira zamabizinesi?
18,8%Inde, ndakhala ndikuyang'ana chinthu chonga ichi kwa nthawi yaitali
12,5%Ndikufuna kudziwa zambiri za kukhazikitsa kwanu, zitha kukhala zothandiza2
6,2%Timagwiritsa ntchito imodzi mwazinthu zomwe zilipo, koma tikuganiza zosintha1