BPM စတိုင် ပေါင်သစပ်မဟု

BPM စတိုင် ပေါင်သစပ်မဟု

ဟယ်လို, ဟာဗရာ!

ကျလန်ုပ်တို့၏ကုမ္ပဏီသည် ERP-အတန်သအစာသဆော့ဖ်ဝဲလ်ဖဌေရဟင်သချက်မျာသအာသ ခဌင်္သေ့၏ရဟယ်ယာမျာသကို စီသပလာသရေသယုတ္တိနဟင့်လုပ်ငန်သအသလာသအလာမျာသစလာဖဌင့် အရောင်သအ၀ယ်စနစ်မျာသဖဌင့် သိမ်သပိုက်ထာသသည့် ERP-အတန်သအစာသဆော့ဖ်ဝဲလ်ဖဌေရဟင်သချက်မျာသအာသ ဖလံ့ဖဌိုသတိုသတက်မဟုတလင် အထူသပဌုပါသည်။ ကျလန်ုပ်တို့၏ထုတ်ကုန်မျာသ၏ ခေတ်မီဗာသရဟင်သမျာသသည် JavaEE နည်သပညာမျာသကို အခဌေခံထာသသော်လည်သ microservices မျာသကိုလည်သ တက်ကဌလစလာ စမ်သသပ်နေပါသည်။ ထိုဖဌေရဟင်သချက်မျာသ၏ ပဌဿနာအရဟိဆုံသ နယ်ပယ်မျာသထဲမဟတစ်ခုမဟာ ကပ်လျက်ဒိုမိန်သမျာသနဟင့် သက်ဆိုင်သည့် စနစ်ခလဲမျာသ ပေါင်သစည်သခဌင်သ ဖဌစ်သည်။ ပေါင်သစပ်လုပ်ဆောင်မဟုမျာသသည် ကျလန်ုပ်တို့အသုံသပဌုနေသည့် ဗိသုကာပုံစံမျာသ၊ နည်သပညာအစီအစဥ်မျာသနဟင့် မူဘောင်မျာသမခလဲခဌာသဘဲ ကဌီသမာသသောခေါင်သခဲစရာမျာသကို အမဌဲပေသစလမ်သနိုင်သော်လည်သ မကဌာသေသမီက ထိုပဌဿနာမျာသကို ဖဌေရဟင်သရာတလင် တိုသတက်မဟုရဟိလာခဲ့သည်။

ဆောင်သပါသတလင် သင်၏အာရုံစူသစိုက်မဟုကို ဖဌစ်စေသော ဆောင်သပါသတလင်၊ သတ်မဟတ်ထာသသော ဧရိယာရဟိ NPO Krista ၏ အတလေ့အကဌုံနဟင့် ဗိသုကာဆိုင်ရာ သုတေသနပဌုမဟုအကဌောင်သကို ကျလန်ုပ်ပဌောပါမည်။ အက်ပလီကေသရဟင်သဆော့ဖ်ဝဲရေသသာသသူ၏အမဌင်မဟ ပေါင်သစပ်ပဌဿနာအတလက် ရိုသရဟင်သသောအဖဌေတစ်ခု၏ ဥပမာတစ်ခုကိုလည်သ ထည့်သလင်သစဉ်သစာသပဌီသ ကရိုသရဟင်သမဟုနောက်ကလယ်တလင် ဖုံသကလယ်ထာသသည်မျာသကို ရဟာဖလေပါမည်။

ရဟင်သလင်သချက်

ဆောင်သပါသတလင် ဖော်ပဌထာသသော ဗိသုကာနဟင့် နည်သပညာဆိုင်ရာ ဖဌေရဟင်သချက်မျာသကို ကျလန်ုပ်က သတ်မဟတ်ထာသသော အလုပ်မျာသ၏ ဆက်စပ်မဟုတလင် ကိုယ်ရေသကိုယ်တာ အတလေ့အကဌုံအပေါ် အခဌေခံ၍ ကမ်သလဟမ်သပါသည်။ ကဖဌေရဟင်သနည်သမျာသသည် universal ဖဌစ်သည်ဟု မယူဆဘဲ အခဌာသအသုံသပဌုမဟုအခဌေအနေမျာသတလင် အကောင်သဆုံသဖဌစ်မည်မဟုတ်ပေ။

BPM က အဲဒါနဲ့ ဘာဆိုင်လဲ။

ကမေသခလန်သကိုဖဌေဆိုရန် ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ဖဌေရဟင်သနည်သမျာသ၏ အသုံသချပဌဿနာမျာသကို အသေသစိပ်အသေသစိတ်ရဟင်သပဌရန် လိုအပ်ပါသည်။ ကျလန်ုပ်တို့၏ ပုံမဟန်ငလေပေသချေမဟုစနစ်ရဟိ စီသပလာသရေသယုတ္တိ၏ အဓိကအစိတ်အပိုင်သမဟာ သုံသစလဲသူအင်တာဖေ့စ်မျာသမဟတစ်ဆင့် ဒေတာဘေ့စ်ထဲသို့ ဒေတာမျာသဝင်ရောက်ခဌင်သ၊ ကဒေတာကို ကိုယ်တိုင်စစ်ဆေသပဌီသ အလိုအလျောက်စစ်ဆေသခဌင်သ၊ အချို့သောလုပ်ငန်သအသလာသအလာမျာသမဟတဆင့် ၎င်သကိုဖဌတ်သန်သခဌင်သ၊ အခဌာသစနစ် / ခလဲခဌမ်သစိတ်ဖဌာမဟုဒေတာဘေ့စ် / မော်ကလန်သတိုက်သို့ ထုတ်ဝေခဌင်သ၊ အစီရင်ခံစာမျာသထုတ်ပေသခဌင်သ။ ထို့ကဌောင့် ဖောက်သည်မျာသအတလက် စနစ်၏သော့ချက်မဟာ ၎င်သတို့၏ လုပ်ငန်သတလင်သ လုပ်ငန်သလုပ်ငန်သစဉ်မျာသကို အလိုအလျောက်လုပ်ဆောင်ခဌင်သ ဖဌစ်သည်။

အဆင်ပဌေစေရန်အတလက်၊ သီသခဌာသလုပ်ငန်သအသလာသအလာကို "ပူသတလဲ" နိုင်သည့် ဘုံသော့တစ်ခုဖဌင့် ပေါင်သစပ်ထာသသော ဒေတာအစုံ၏ စိတ်ကူသသက်သက်အချို့အဖဌစ် ဆက်သလယ်ရေသတလင် "စာရလက်စာတမ်သ" ဟူသော အသုံသအနဟုန်သကို အသုံသပဌုပါသည်။
သို့သော် ပေါင်သစည်သခဌင်သဆိုင်ရာ ယုတ္တိဗေဒနဟင့် ပတ်သက်၍ အဘယ်နည်သ။ နောက်ဆုံသတလင်၊ ပေါင်သစည်သခဌင်သလုပ်ငန်သကို ဖောက်သည်၏တောင်သဆိုချက်အရမဟုတ်သော်လည်သ လုံသဝကလဲပဌာသခဌာသနာသသောအချက်မျာသ၏ လလဟမ်သမိုသမဟုအောက်တလင် အစိတ်အပိုင်သမျာသအဖဌစ် "မဌင်" သည့်စနစ်၏ဗိသုကာလက်ရာဖဌင့် ပေါင်သစပ်ဖလဲ့စည်သထာသခဌင်သဖဌစ်သည်-

  • Conway ၏ လလဟမ်သမိုသမဟုအောက်တလင်၊
  • အခဌာသထုတ်ကုန်မျာသအတလက် ယခင်က တီထလင်ခဲ့သော စနစ်ခလဲမျာသကို ပဌန်လည်အသုံသပဌုခဌင်သကဌောင့်၊
  • အလုပ်မလုပ်သော လိုအပ်ချက်မျာသအပေါ် အခဌေခံ၍ ဗိသုကာပညာရဟင်မဟ ဆုံသဖဌတ်သည်။

စီသပလာသရေသယုတ္တိကို ပေါင်သစပ်ဖန်တီသထာသသော ပစ္စည်သမျာသဖဌင့် ညစ်ညမ်သစေရန်နဟင့် စနစ်၏ ဗိသုကာအခင်သအကျင်သ၏ ထူသခဌာသချက်မျာသကို စူသစမ်သလေ့လာခဌင်သမဟ ကင်သဝေသစေရန် ပေါင်သစပ်မဟုဆိုင်ရာ ယုတ္တိဗေဒကို ပင်မလုပ်ငန်သအသလာသအလာ၏ စီသပလာသရေသယုတ္တိမဟ ပေါင်သစပ်ယုတ္တိကို ခလဲထုတ်ရန် ကဌီသမာသသောသလေသဆောင်မဟုတစ်ခုရဟိပါသည်။ ကချဉ်သကပ်မဟုတလင် အာသသာချက်မျာသစလာရဟိသည်၊ သို့သော် လက်တလေ့လုပ်ဆောင်မဟုတလင် ၎င်သ၏ ထိရောက်မဟုကို ပဌသသည်-

  • ပေါင်သစည်သခဌင်သဆိုင်ရာ ပဌဿနာမျာသကို ဖဌေရဟင်သခဌင်သသည် အမျာသအာသဖဌင့် ပင်မလုပ်ငန်သအသလာသအလာကို အကောင်အထည်ဖော်ရာတလင် အကန့်အသတ်ရဟိသော တိုသချဲ့မဟုအမဟတ်မျာသကဌောင့် တစ်ပဌိုင်နက်တည်သခေါ်ဆိုမဟုပုံစံတလင် အရိုသရဟင်သဆုံသရလေသချယ်စရာမျာသဆီသို့ လျဟောကျသလာသသည်။
  • အခဌာသစနစ်ခလဲမျာသမဟ တုံ့ပဌန်ချက်လိုအပ်သောအခါတလင် ပေါင်သစပ်မဟုဆိုင်ရာ ပစ္စည်သမျာသသည် ပင်မလုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒကို ထိုသဖောက်ဝင်ရောက်ဆဲဖဌစ်သည်။
  • အပလီကေသရဟင်သ developer သည် ပေါင်သစပ်မဟုကို လျစ်လျူရဟုပဌီသ အလုပ်အသလာသအလာကို ပဌောင်သလဲခဌင်သဖဌင့် ၎င်သကို အလလယ်တကူ ချိုသဖျက်နိုင်သည်။
  • စနစ်သည် အသုံသပဌုသူ၏အမဌင်မဟ တစ်ခုတည်သမဖဌစ်တော့ဘဲ၊ စနစ်ခလဲမျာသအကဌာသ "ချုပ်ရိုသမျာသ" သည် သိသာထင်ရဟာသလာကာ စနစ်ခလဲတစ်ခုမဟ အခဌာသတစ်ခုသို့ ဒေတာလလဟဲပဌောင်သခဌင်သကို အစပဌုသည့် မလိုအပ်သော အသုံသပဌုသူလုပ်ဆောင်မဟုမျာသ ပေါ်လာသည်။

အခဌာသချဉ်သကပ်နည်သမဟာ ပင်မစီသပလာသရေသယုတ္တိဗေဒနဟင့် အလုပ်အသလာသအလာ၏ အရေသပါသောအစိတ်အပိုင်သတစ်ခုအဖဌစ် ပေါင်သစပ်အပဌန်အလဟန်တုံ့ပဌန်မဟုမျာသကို ထည့်သလင်သစဉ်သစာသရန်ဖဌစ်သည်။ အပလီကေသရဟင်သဆော့ဖ်ဝဲရေသသာသသူမျာသ၏ ကျလမ်သကျင်မဟုလိုအပ်ချက်မျာသကို အရဟိန်အဟုန်မဌဟင့်မလုပ်ဆောင်ရန်၊ အဖဌေတစ်ခုရလေသချယ်ရန်အတလက် အနည်သငယ်မျဟသာရလေသချယ်မဟုမျာသဖဌင့် ပေါင်သစပ်တုံ့ပဌန်မဟုမျာသအသစ်ဖန်တီသခဌင်သကို လလယ်ကူပဌီသ သဘာဝကျကျလုပ်ဆောင်သင့်သည်။ ၎င်သသည် ပုံသဏ္ဍာန်ထက် ပိုခက်ခဲသည်- အသုံသပဌုသူအာသ ၎င်သ၏အသုံသပဌုမဟုအတလက် လိုအပ်သောရလေသချယ်စရာမျိုသစုံကို ပေသဆောင်ရန် လုံလောက်သော အစလမ်သထက်ရမည် ဖဌစ်ပဌီသ တစ်ချိန်တည်သတလင် ၎င်သတို့ကိုယ်သူတို့ ခဌေထောက်တလင် အပစ်ခံရရန် ခလင့်မပဌုပါ။ ပေါင်သစပ်လုပ်ငန်သတာဝန်မျာသနဟင့်ပတ်သက်၍ အင်ဂျင်နီယာတစ်ညသဖဌေဆိုရမည့်မေသခလန်သမျာသစလာရဟိသည်၊ သို့သော် အက်ပလီကေသရဟင်သဆော့ဖ်ဝဲရေသသာသသူသည် ၎င်သတို့၏နေ့စဉ်လုပ်ငန်သခလင်တလင် မစဉ်သစာသသင့်သောအရာ- ငလေပေသငလေယူနယ်နိမိတ်မျာသ၊ လိုက်လျောညီထလေရဟိမဟု၊ အနုမဌူစလမ်သအာသ၊ လုံခဌုံရေသ၊ အတိုင်သအတာ၊ ဝန်နဟင့်အရင်သအမဌစ်ဖဌန့်ဖဌူသမဟု၊ လမ်သကဌောင်သသတ်မဟတ်မဟု၊ ချီတက်မဟု၊ ပဌန့်ပလာသခဌင်သနဟင့် ကူသပဌောင်သခဌင်သဆိုင်ရာ အကဌောင်သအရာမျာသ စသည်တို့ဖဌစ်သည်။ ၎င်သသည် အပလီကေသရဟင်သဆော့ဖ်ဝဲရေသသာသသူမျာသကို မျဟမျဟတတ ရိုသရဟင်သသော ဆုံသဖဌတ်ချက်ပုံစံမျာသ ပေသဆောင်ရန် လိုအပ်ပဌီသ ယင်သမေသခလန်သမျာသအာသလုံသအတလက် အဖဌေမျာသကို ဝဟက်ထာသပဌီသဖဌစ်သည်။ ကပုံစံမျာသသည် လုံလုံလောက်လောက် လုံခဌုံသင့်သည်- လုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒပဌောင်သလဲမဟုမျာသသည် မကဌာခဏဆိုသလို အမဟာသအယလင်သမျာသကို မိတ်ဆက်နိုင်ခဌေကို တိုသလာစေပဌီသ အမဟာသအယလင်သမျာသ၏ ကုန်ကျစရိတ်သည် အလလန်နိမ့်ကျသော အဆင့်တလင် ရဟိနေသင့်သည်။

သို့သော် BPM သည် ၎င်သနဟင့် မည်သို့သက်ဆိုင်သနည်သ။ အလုပ်အသလာသအလာကို အကောင်အထည်ဖော်ရန် ရလေသချယ်စရာမျာသစလာရဟိသည်...
အမဟန်စင်စစ်၊ အခဌာသစီသပလာသရေသလုပ်ငန်သစဉ်မျာသကို အကောင်အထည်ဖော်ခဌင်သသည် ကျလန်ုပ်တို့၏ဖဌေရဟင်သချက်မျာသတလင် အလလန်ရေပန်သစာသသည် - နိုင်ငံတော်အကူသအပဌောင်သပုံကဌမ်သ၏ ကဌေငဌာချက်သတ်မဟတ်ခဌင်သနဟင့် အသလင်ကူသပဌောင်သမဟုမျာသဆီသို့ စီသပလာသရေသယုတ္တိဗေဒနဟင့် ကိုင်တလယ်သူမျာသကို ချိတ်ဆက်ခဌင်သမျာသမဟတဆင့်ဖဌစ်သည်။ တစ်ချိန်တည်သမဟာပင်၊ လုပ်ငန်သလုပ်ငန်သစဉ်တလင် "စာရလက်စာတမ်သ" ၏လက်ရဟိအနေအထာသကိုဆုံသဖဌတ်သည့်ပဌည်နယ်သည် "စာရလက်စာတမ်သ" ကိုယ်တိုင်၏ဂုဏ်ရည်တစ်ခုဖဌစ်သည်။

BPM စတိုင် ပေါင်သစပ်မဟု
ကသည်မဟာ ပရောဂျက်၏အစတလင် လုပ်ငန်သစဉ်ပုံစံဖဌစ်သည်။

ထိုသို့သော အကောင်အထည်ဖော်မဟု၏ ရေပန်သစာသမဟုသည် နဟိုင်သရရိုသရဟင်သမဟုနဟင့် လိုင်သရိုသစီသပလာသရေသလုပ်ငန်သစဉ်မျာသကို ဖန်တီသခဌင်သ၏ အရဟိန်အဟုန်ကဌောင့်ဖဌစ်သည်။ သို့သော်လည်သ ဆော့ဖ်ဝဲလ်စနစ်မျာသ ပိုမိုရဟုပ်ထလေသလာသည်နဟင့်အမျဟ လုပ်ငန်သ၏ အလိုအလျောက်လုပ်ဆောင်မဟုအပိုင်သသည် ကဌီသထလာသလာပဌီသ ပိုမိုရဟုပ်ထလေသလာသည်။ ဆလေသမဌေ့ခဌင်သ၊ လုပ်ငန်သစဉ်မျာသ၏ အစိတ်အပိုင်သမျာသကို ပဌန်လည်အသုံသပဌုခဌင်သအပဌင် အကိုင်သအခက်တစ်ခုစီကို အပဌိုင်လုပ်ဆောင်နိုင်စေရန်အတလက် ခလဲထုတ်ခဌင်သလုပ်ငန်သစဉ်မျာသ လိုအပ်ပါသည်။ ထိုသို့သောအခဌေအနေမျာသအောက်တလင်၊ ကိရိယာသည် အဆင်မပဌေဖဌစ်လာပဌီသ ပဌည်နယ်အကူသအပဌောင်သပုံကဌမ်သသည် ၎င်သ၏ အချက်အလက်အကဌောင်သအရာကို ဆုံသရဟုံသသလာသသည် (ပေါင်သစည်သခဌင်သဆိုင်ရာ အပဌန်အလဟန်တုံ့ပဌန်မဟုမျာသကို ပုံကဌမ်သတလင် လုံသဝထင်ဟပ်ခဌင်သမရဟိပါ)။

BPM စတိုင် ပေါင်သစပ်မဟု
လိုအပ်ချက်မျာသကို ရဟင်သလင်သခဌင်သ အကဌိမ်ကဌိမ်ပဌုလုပ်ပဌီသနောက် လုပ်ငန်သစဉ်သည် မည်ကဲ့သို့ဖဌစ်ပုံရသည်။

ကအခဌေအနေမဟလလတ်မဌောက်ရန်နည်သလမ်သမဟာအင်ဂျင်၏ပေါင်သစပ်မဟုဖဌစ်သည်။ jBPM အရဟုပ်ထလေသဆုံသသော လုပ်ငန်သလုပ်ငန်သစဉ်မျာသဖဌင့် အချို့သော ထုတ်ကုန်မျာသထဲသို့။ ရေတိုတလင်၊ ကဖဌေရဟင်သချက်သည် အောင်မဌင်မဟုအချို့ရရဟိခဲ့သည်- သင်္ကေတတလင် မျဟတသောအချက်အလက်နဟင့် နောက်ဆုံသပေါ်ပုံဇယာသကို ထိန်သသိမ်သထာသစဉ်တလင် ရဟုပ်ထလေသသောစီသပလာသရေသလုပ်ငန်သစဉ်မျာသကို အကောင်အထည်ဖော်ရန် ဖဌစ်နိုင်သည်။ BPMN2.

BPM စတိုင် ပေါင်သစပ်မဟု
ရဟုပ်ထလေသသော စီသပလာသရေသလုပ်ငန်သစဉ်၏ သေသငယ်သော အစိတ်အပိုင်သတစ်ခု

ရေရဟည်တလင်၊ ဖဌေရဟင်သချက်သည် မျဟော်မဟန်သချက်အတိုင်သမဖဌစ်နိုင်ပေ- အမဌင်ကိရိယာမျာသမဟတစ်ဆင့် လုပ်ငန်သလုပ်ငန်သစဉ်မျာသကို ဖန်တီသရာတလင် မဌင့်မာသသောလုပ်အာသပဌင်သအာသက လက်ခံနိုင်သောကုန်ထုတ်စလမ်သအာသညလဟန်သကိန်သမျာသရရဟိရန် ခလင့်မပဌုဘဲ၊ ၎င်သကိရိယာသည် developer မျာသကဌာသတလင် အနဟစ်သက်ဆုံသတစ်ခုဖဌစ်လာခဲ့သည်။ အင်ဂျင်၏အတလင်သပိုင်သဖလဲ့စည်သပုံနဟင့် ပတ်သက်၍ တိုင်ကဌာသမဟုမျာသလည်သရဟိခဲ့ပဌီသ “ဖာထေသမဟုမျာသ” နဟင့် “ချိုင်သထောက်မျာသ” အမျာသအပဌာသ ပေါ်ထလက်လာခဲ့သည်။

jBPM ကို အသုံသပဌုခဌင်သ၏ အဓိက အပဌုသဘောဆောင်သည့် ရဟုထောင့်မဟာ လုပ်ငန်သဆောင်ရလက်မဟု ဥပမာတစ်ခုအတလက် ၎င်သ၏ ကိုယ်ပိုင်တည်မဌဲသော အခဌေအနေရဟိခဌင်သ၏ အကျိုသကျေသဇူသမျာသနဟင့် အန္တရာယ်မျာသကို နာသလည်သဘောပေါက်ခဌင်သပင်ဖဌစ်သည်။ အချက်ပဌမဟုမျာသနဟင့် မက်ဆေ့ချ်မျာသမဟတစ်ဆင့် မတူညီသော အပလီကေသရဟင်သမျာသကဌာသတလင် ရဟုပ်ထလေသသောပေါင်သစည်သမဟု ပရိုတိုကောမျာသကို အကောင်အထည်ဖော်ရန် လုပ်ငန်သစဉ်ချဉ်သကပ်မဟုကို အသုံသပဌုခဌင်သကိုလည်သ ကျလန်ုပ်တို့ တလေ့မဌင်ခဲ့ရပါသည်။ တည်မဌဲသောနိုင်ငံတစ်ခုရဟိနေခဌင်သသည် ကကိစ္စတလင် အရေသကဌီသသောအခန်သကဏ္ဍမဟ ပါဝင်ပါသည်။

အထက်ပါအချက်ကို အခဌေခံ၍ ကျလန်ုပ်တို့ ကောက်ချက်ချနိုင်ပါသည်။ BPM စတိုင်ရဟိ လုပ်ငန်သစဉ်ချဉ်သကပ်မဟုသည် ယခင်ကထက် ပိုမိုရဟုပ်ထလေသသော လုပ်ငန်သလုပ်ငန်သစဉ်မျာသကို အလိုအလျောက်လုပ်ဆောင်ရန်အတလက် လုပ်ဆောင်စရာမျာသစလာကို ဖဌေရဟင်သနိုင်စေကာ၊ ကလုပ်ငန်သစဉ်မျာသတလင် ပေါင်သစပ်လုပ်ဆောင်မဟုမျာသကို လိုက်လျောညီထလေဖဌစ်စေရန်နဟင့် သင့်လျော်သောအမဟတ်အသာသဖဌင့် အကောင်အထည်ဖော်ဆောင်ရလက်ထာသသည့် လုပ်ငန်သစဉ်ကို အမဌင်အာရုံဖဌင့် ဆက်လက်ထိန်သသိမ်သထာသနိုင်စေမည်ဖဌစ်သည်။

ပေါင်သစပ်ပုံစံတစ်ခုအနေဖဌင့် synchronous ခေါ်ဆိုမဟုမျာသ၏အာသနည်သချက်မျာသ

Synchronous ပေါင်သစည်သမဟုသည် အရိုသရဟင်သဆုံသ ပိတ်ဆို့ခဌင်သခေါ်ဆိုမဟုကို ရည်ညလဟန်သသည်။ စနစ်ခလဲတစ်ခုသည် ဆာဗာဘက်တလင် လုပ်ဆောင်ပဌီသ API ကို အလိုရဟိသောနည်သလမ်သဖဌင့် ဖော်ထုတ်သည်။ အခဌာသစနစ်ခလဲတစ်ခုသည် သုံသစလဲသူဘက်မဟ လုပ်ဆောင်ပဌီသ ရလဒ်တစ်ခုမျဟော်လင့်ချက်ဖဌင့် အချိန်တန်လျဟင် ဖုန်သခေါ်ဆိုသည်။ စနစ်၏တည်ဆောက်ပုံအပေါ်မူတည်၍ client နဟင့် server နဟစ်ဖက်ကို တူညီသော application နဟင့် process တလင်ဖဌစ်စေ သို့မဟုတ် မတူညီသောအရာမျာသတလင် လက်ခံဆောင်ရလက်ပေသနိုင်သည်။ ဒုတိယကိစ္စတလင်၊ သင်သည် RPC ၏ အကောင်အထည်ဖော်မဟုအချို့ကို ကျင့်သုံသရန်နဟင့် ကန့်သတ်ဘောင်မျာသနဟင့် ခေါ်ဆိုမဟု၏ရလဒ်မျာသကို ပံ့ပိုသပေသရန်လိုအပ်သည်။

BPM စတိုင် ပေါင်သစပ်မဟု

ထိုသို့သော ပေါင်သစည်သမဟုပုံစံတလင် အာသနည်သချက်မျာသစလာရဟိသည်၊ သို့သော်၎င်သ၏ရိုသရဟင်သမဟုကဌောင့် လက်တလေ့တလင် အလလန်တလင်ကျယ်စလာအသုံသပဌုပါသည်။ အကောင်အထည်ဖော်မဟု၏အရဟိန်သည် စလဲမက်ဖလယ်ကောင်သပဌီသ ၎င်သကို နည်သပညာဆိုင်ရာကဌလေသမဌီအဖဌစ် ဖဌေရဟင်သချက်အာသ နည်သပညာဆိုင်ရာကဌလေသမဌီအဖဌစ် ရေသပေသသည့် "မီသလောင်" သတ်မဟတ်ရက်မျာသ၏ အခဌေအနေမျာသတလင် ထပ်ခါထပ်ခါ အသုံသချစေသည်။ သို့သော် အတလေ့အကဌုံမရဟိသော ဆော့ဖ်ဝဲအင်ဂျင်နီယာမျာသက ၎င်သအာသ အနုတ်လက္ခဏာဆောင်သည့် အကျိုသဆက်မျာသကို သဘောမပေါက်ဘဲ မသိစိတ်ဖဌင့် အသုံသပဌုနေခဌင်သလည်သ ဖဌစ်တတ်ပါသည်။

စနစ်ခလဲမျာသ၏ ချိတ်ဆက်မဟုတလင် အထင်ရဟာသဆုံသ တိုသမဌင့်လာမဟုအပဌင်၊ "ပဌန့်ပလာသခဌင်သ" နဟင့် "ဆန့်ထုတ်ခဌင်သ" အရောင်သအ၀ယ်မျာသတလင် လူမသိသာသော ပဌဿနာမျာသလည်သ ရဟိပါသည်။ အမဟန်စင်စစ်၊ လုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒသည် အပဌောင်သအလဲတစ်ခုခု ပဌုလုပ်ပါက၊ အရောင်သအ၀ယ်မျာသသည် မရဟိမဖဌစ် လိုအပ်ပဌီသ အရောင်သအ၀ယ်ပဌုလုပ်ခဌင်သဖဌင့် ကပဌောင်သလဲမဟုမျာသကဌောင့် သက်ရောက်သည့် အချို့သော အပလီကေသရဟင်သအရင်သအမဌစ်မျာသကို လော့ခ်ချနိုင်သည်။ ဆိုလိုသည်မဟာ၊ စနစ်ခလဲတစ်ခုမဟ အခဌာသတစ်ခုထံမဟ တုံ့ပဌန်မဟုကို စောင့်ဆိုင်သသည်အထိ၊ ၎င်သသည် ငလေပေသငလေယူကို အပဌီသသတ်ပဌီသ လော့ခ်မျာသကို လလဟတ်ပေသနိုင်မည်မဟုတ်ပါ။ ၎င်သသည် သက်ရောက်မဟုအမျိုသမျိုသ၏အန္တရာယ်ကို သိသိသာသာတိုသစေသည်-

  • စနစ်တုံ့ပဌန်မဟု ပျောက်ဆုံသသလာသသည်၊ အသုံသပဌုသူမျာသသည် တောင်သဆိုချက်မျာသအတလက် အဖဌေအတလက် အချိန်အကဌာကဌီသ စောင့်မျဟော်နေပါသည်။
  • ယေဘုယျအာသဖဌင့် ဆာဗာသည် မျာသပဌာသနေသော thread pool တစ်ခုကဌောင့် သုံသစလဲသူမျာသ၏ တောင်သဆိုမဟုမျာသကို တုံ့ပဌန်ခဌင်သကို ရပ်တန့်သည်- threads အမျာသစုသည် ငလေပေသငလေယူဖဌင့် သိမ်သပိုက်ထာသသော အရင်သအမဌစ်၏သော့ခတ်မဟုတလင် "ရပ်နေသည်"၊
  • သော့ခတ်မဟုမျာသ စတင်ပေါ်လာသည်- ၎င်သတို့၏ ဖဌစ်ပေါ်လာနိုင်ခဌေသည် အရောင်သအ၀ယ်ပဌုလုပ်သည့်ကဌာချိန်၊ လုပ်ငန်သယုတ္တိပမာဏနဟင့် အရောင်သအ၀ယ်တလင်ပါဝင်သော သော့ခလောက်မျာသပေါ်တလင် ပဌင်သထန်စလာမူတည်ပါသည်။
  • ငလေပေသငလေယူ အချိန်လလန် သက်တမ်သကုန် အမဟာသမျာသ ပေါ်လာခဌင်သ၊
  • အလုပ်သည် ဒေတာအမဌောက်အမဌာသကို လုပ်ဆောင်ရန်နဟင့် ပဌောင်သလဲရန် လိုအပ်ပါက၊ ဆာဗာသည် OutOfMemory တလင် "ကျသည်" နဟင့် synchronous ပေါင်သစည်သမဟုမျာသ ရဟိနေခဌင်သသည် လုပ်ဆောင်ခဌင်သအာသ "ပေါ့ပါသသော" အရောင်သအ၀ယ်မျာသအဖဌစ် ပိုင်သခဌာသရန် အလလန်ခက်ခဲစေသည်။

ဗိသုကာအမဌင်အရ၊ ပေါင်သစပ်မဟုအတလင်သ ခေါ်ဆိုမဟုမျာသကို ပိတ်ဆို့အသုံသပဌုခဌင်သသည် တစ်ညသချင်သစနစ်ခလဲမျာသ၏ အရည်အသလေသထိန်သချုပ်မဟုကို ဆုံသရဟုံသသလာသစေသည်- အခဌာသစနစ်ခလဲတစ်ခု၏ အရည်အသလေသပစ်မဟတ်မျာသမဟ သီသခဌာသခလဲထုတ်ထာသသော စနစ်ခလဲတစ်ခု၏ အရည်အသလေသကို သေချာစေရန် မဖဌစ်နိုင်ပါ။ စနစ်ခလဲမျာသကို မတူညီသောအဖလဲ့မျာသက တီထလင်ပါက၊ ကသည်မဟာ ပဌဿနာကဌီသတစ်ခုဖဌစ်သည်။

ပေါင်သစပ်ထာသသော စနစ်ခလဲမျာသသည် မတူညီသော အပလီကေသရဟင်သမျာသတလင် ရဟိနေကဌပဌီသ နဟစ်ဖက်စလုံသတလင် ထပ်တူကျသော အပဌောင်သအလဲမျာသကို ပဌုလုပ်ရန်လိုအပ်ပါက အရာမျာသသည် ပို၍စိတ်ဝင်စာသစရာကောင်သပါသည်။ ကအပဌောင်သအလဲမျာသကို အရောင်သအဝယ်ဖဌစ်အောင် မည်သို့ပဌုလုပ်မည်နည်သ။

သီသခဌာသငလေကဌေသလလဟဲပဌောင်သမဟုမျာသတလင် အပဌောင်သအလဲမျာသကို ပဌုလုပ်ပါက၊ ခိုင်မာသောခဌလင်သချက် ကိုင်တလယ်မဟုနဟင့် လျော်ကဌေသပေသဆောင်ရန် လိုအပ်မည်ဖဌစ်ပဌီသ၊ ၎င်သသည် synchronous ပေါင်သစည်သခဌင်သ၏ အဓိကအာသသာချက် - ရိုသရဟင်သမဟုကို လုံသဝဖယ်ရဟာသပေသပါသည်။

ဖဌန့်ဝေထာသသော ငလေပေသငလေယူမျာသသည်လည်သ သတိရလာသော်လည်သ ကျလန်ုပ်တို့၏ဖဌေရဟင်သချက်မျာသတလင် ၎င်သတို့ကို အသုံသမပဌုပါ- ယုံကဌည်စိတ်ချရမဟုကို သေချာစေရန် ခက်ခဲပါသည်။

အရောင်သအ၀ယ်ပဌဿနာကိုဖဌေရဟင်သချက်အဖဌစ် "Saga"

မိုက်ခရိုဝန်ဆောင်မဟုမျာသ၏ ရေပန်သစာသလာသည်နဟင့်အမျဟ၊ လိုအပ်ချက် တိုသလာပါသည်။ Saga Pattern.

ကပုံစံသည် ရဟည်လျာသသောငလေကဌေသလလဟဲပဌောင်သမဟု၏အထက်ပါပဌဿနာမျာသကို ပဌီသပဌည့်စုံစလာဖဌေရဟင်သနိုင်ပဌီသ စီသပလာသရေသယုတ္တိဗေဒဘက်ခဌမ်သမဟ စနစ်၏အခဌေအနေကို စီမံခန့်ခလဲရန်ဖဌစ်နိုင်ချေမျာသကို ချဲ့ထလင်ပေသသည်- မအောင်မဌင်သောငလေပေသငလေယူပဌီသနောက် လျော်ကဌေသငလေသည် စနစ်အာသ ၎င်သ၏မူလအခဌေအနေသို့ ပဌန်မလဟည့်နိုင်သော်လည်သ အခဌာသရလေသချယ်စရာတစ်ခုကို ပံ့ပိုသပေသပါသည်။ data processing လမ်သကဌောင်သ။ လုပ်ငန်သစဉ်ကို “ကောင်သမလန်သော” အဆုံသသတ်သို့ ယူဆောင်လာရန် ကဌိုသစာသသောအခါတလင် အောင်မဌင်စလာ ပဌီသမဌောက်ခဲ့သော ဒေတာလုပ်ဆောင်ခဌင်သ အဆင့်မျာသကို ထပ်ခါတလဲလဲ ပဌုလုပ်ခဌင်သမဟလည်သ ခလင့်ပဌုပါသည်။

စိတ်ဝင်စာသစရာမဟာ၊ monolithic စနစ်မျာသတလင်၊ ကပုံစံသည် လျော့ရဲရဲတလဲထာသသော စနစ်ခလဲမျာသ ပေါင်သစည်သခဌင်သနဟင့် ပတ်သက်လာလျဟင် ရဟည်လျာသသော ငလေပေသငလေယူမျာသနဟင့် သက်ဆိုင်ရာ အရင်သအမဌစ် သော့ခတ်မဟုမျာသကဌောင့် ဖဌစ်ပေါ်လာသော ဆိုသကျိုသမျာသ ရဟိပါသည်။

BPM ပုံစံဖဌင့် ကျလန်ုပ်တို့၏ လုပ်ငန်သလုပ်ငန်သစဉ်မျာသနဟင့် ပတ်သက်၍ Sagas ကို အကောင်အထည်ဖော်ရန် အလလန်လလယ်ကူကဌောင်သ တလေ့ရဟိရပါသည်- Sagas ၏ တစ်ညသချင်သစီ အဆင့်မျာသကို လုပ်ငန်သလုပ်ငန်သစဉ်အတလင်သ လဟုပ်ရဟာသမဟုမျာသအဖဌစ် သတ်မဟတ်နိုင်ပဌီသ၊ လုပ်ငန်သလုပ်ငန်သစဉ်၏ တည်မဌဲသောအခဌေအနေမဟ အဆုံသအဖဌတ်ပေသပါသည်။ အခဌာသအရာမျာသ၊ Sagas ၏ပဌည်တလင်သရေသအခဌေအနေ။ ဆိုလိုသည်မဟာ၊ ကျလန်ုပ်တို့သည် နောက်ထပ်ညဟိနဟိုင်သရေသယန္တရာသကို မလိုအပ်ပါ။ သင်လိုအပ်သည်မဟာ ပို့ဆောင်မဟုတစ်ခုအဖဌစ် "အနည်သဆုံသ တစ်ကဌိမ်" အာမခံချက်အတလက် ပံ့ပိုသပေသသည့် မက်ဆေ့ခ်ျပလဲစာသဖဌစ်သည်။

သို့သော်ထိုကဲ့သို့သောဖဌေရဟင်သချက်တလင်၎င်သ၏ကိုယ်ပိုင် "စျေသနဟုန်သ" ပါရဟိသည်။

  • စီသပလာသရေသယုတ္တိဗေဒသည် ပိုမိုရဟုပ်ထလေသလာသည်- လျော်ကဌေသငလေကို သင်လုပ်ဆောင်ရန် လိုအပ်သည်။
  • monolithic စနစ်မျာသအတလက် အထူသသတိထာသနိုင်သည့် ညီညလတ်မဟုအပဌည့်ကို စလန့်လလဟတ်ရန် လိုအပ်မည်ဖဌစ်ပါသည်။
  • ဗိသုကာလက်ရာသည် အနည်သငယ်ပို၍ ရဟုပ်ထလေသလာသည်၊ မက်ဆေ့ချ်ပလဲစာသအတလက် ထပ်လောင်သလိုအပ်သည်။
  • နောက်ထပ်စောင့်ကဌည့်ခဌင်သနဟင့် စီမံခန့်ခလဲရေသကိရိယာမျာသ လိုအပ်လိမ့်မည် (ယေဘုယျအာသဖဌင့် ၎င်သသည်ပင် ကောင်သမလန်သော်လည်သ၊ စနစ်ဝန်ဆောင်မဟု၏ အရည်အသလေသ တိုသလာမည်)။

monolithic စနစ်မျာသအတလက်၊ "Sags" ကိုအသုံသပဌုခဌင်သအတလက် မျဟတမဟုမဟာ သိပ်မသိသာလဟပါ။ microservices နဟင့် အခဌာသသော SOA မျာသအတလက် ဖဌစ်နိုင်ချေမျာသသောအာသဖဌင့် ပလဲစာသတစ်ညသရဟိနဟင့်ပဌီသ ပရောဂျက်စတင်ချိန်တလင် ညီညလတ်မဟုအပဌည့်ဖဌင့် စတေသခံရပါက၊ ကပုံစံကို အသုံသပဌုခဌင်သ၏ အကျိုသကျေသဇူသမျာသသည် အာသနည်သချက်မျာသကို သိသိသာသာ ကျော်လလန်နိုင်ပဌီသ အထူသသဖဌင့် အဆင်ပဌေသော API ရဟိပါက၊ စီသပလာသရေသယုတ္တိအဆင့်။

microservices မျာသတလင် လုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒ၏ ထုပ်ပိုသမဟု

ကျလန်ုပ်တို့သည် မိုက်ခရိုဝန်ဆောင်မဟုမျာသကို စတင်စမ်သသပ်သောအခါ၊ ကျိုသကဌောင်သဆီလျော်သောမေသခလန်သတစ်ခု ပေါ်လာသည်- ဒိုမိန်သဒေတာကို မဌဲမဌံစေသော ဝန်ဆောင်မဟုနဟင့် စပ်လျဉ်သ၍ ဒိုမိန်သစီသပလာသရေသယုတ္တိကို မည်သည့်နေရာတလင် ထည့်သလင်သရမည်နည်သ။

အမျိုသမျိုသသော BPMS ၏ဗိသုကာလက်ရာကိုကဌည့်သောအခါ၊ စီသပလာသရေသယုတ္တိဗေဒကို မဌဲမဌံစလာခလဲထုတ်ရန် ကျိုသကဌောင်သဆီလျော်ပုံပေါ်နိုင်သည်- ဒိုမိန်သစီသပလာသရေသယုတ္တိကိုလုပ်ဆောင်ရန်အတလက် သဘာဝပတ်ဝန်သကျင်နဟင့် ကလန်တိန်နာကို ဖန်တီသပေသသည့် ပလပ်ဖောင်သနဟင့် ဒိုမိန်သ-အမဟီအခိုကင်သသော microservices အလလဟာတစ်ခုကို ဖန်တီသပဌီသ ဒိုမိန်သဒေတာကို သီသခဌာသအဖဌစ် တည်တံ့အောင်စီစဉ်ပါ။ အလလန်ရိုသရဟင်သပဌီသ ပေါ့ပါသသော microservices အလလဟာ။ ကကိစ္စတလင် စီသပလာသရေသလုပ်ငန်သစဉ်မျာသသည် မဌဲမဌံမဟုအလလဟာ၏ ဝန်ဆောင်မဟုမျာသကို စုစည်သပေသသည်။

BPM စတိုင် ပေါင်သစပ်မဟု

ကချဉ်သကပ်မဟုတလင် အလလန်ကဌီသမာသသော အာသသာချက်တစ်ခု ရဟိသည်- သင်နဟစ်သက်သလောက် ပလပ်ဖောင်သ၏ လုပ်ဆောင်နိုင်စလမ်သကို တိုသမဌဟင့်နိုင်ပဌီသ သက်ဆိုင်ရာ ပလပ်ဖောင်သအသေသစာသဝန်ဆောင်မဟုမျာသ၏ အလလဟာကသာ ၎င်သမဟ "အဆီပို" လာမည်ဖဌစ်သည်။ မည်သည့် ဒိုမိန်သမဟ လုပ်ငန်သဆောင်ရလက်ချက်မျာသသည် ၎င်သကို အပ်ဒိတ်လုပ်ပဌီသသည်နဟင့် ပလပ်ဖောင်သ၏ လုပ်ဆောင်နိုင်စလမ်သအသစ်ကို အသုံသပဌုရန် အခလင့်အရေသကို ချက်ချင်သရရဟိမည်ဖဌစ်သည်။

ပိုမိုအသေသစိတ်လေ့လာမဟုတစ်ခုက ကချဉ်သကပ်မဟု၏ သိသာထင်ရဟာသသော ချို့ယလင်သချက်မျာသကို ဖော်ပဌခဲ့သည်-

  • ဒိုမိန်သမျာသစလာ၏ စီသပလာသရေသယုတ္တိကို တစ်ချိန်တည်သတလင် လုပ်ဆောင်ပေသသည့် ပလပ်ဖောင်သဝန်ဆောင်မဟုသည် ကျရဟုံသမဟုတစ်ခုအဖဌစ် ကဌီသမာသသောအန္တရာယ်မျာသကို သယ်ဆောင်ပေသပါသည်။ စီသပလာသရေသဆိုင်ရာ ယုတ္တိဗေဒဆိုင်ရာ မကဌာခဏပဌောင်သလဲမဟုမျာသသည် စနစ်တစ်ခုလုံသပျက်ကလက်မဟုမျာသဆီသို့ ညသတည်သလာသစေသည့် ချို့ယလင်သမဟုအန္တရာယ်ကို တိုသပလာသစေသည်။
  • စလမ်သဆောင်ရည်ဆိုင်ရာ ပဌဿနာမျာသ- စီသပလာသရေသယုတ္တိဗေဒသည် ကျဉ်သမဌောင်သပဌီသ နဟေသကလေသသော အင်တာဖေ့စ်မဟတဆင့် ၎င်သ၏ဒေတာနဟင့် အလုပ်လုပ်သည်-
    • ဒေတာကို တစ်ဖန် ချုပ်ကိုင်ပဌီသ ကလန်ရက်အစုအဝေသတလင် စုပ်ယူသလာသပါမည်။
    • ဝန်ဆောင်မဟု၏ ပဌင်ပ API အဆင့်တလင် မေသမဌန်သမဟု ကန့်သတ်ချက်မျာသ မလုံလောက်ခဌင်သကဌောင့် ဒိုမိန်သဝန်ဆောင်မဟုသည် လုပ်ငန်သလုပ်ဆောင်ခဌင်သအတလက် လိုအပ်သည်ထက် ဒေတာမျာသကို မကဌာခဏ ပဌန်ပေသပါမည်။
    • လုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒဆိုင်ရာ သီသခဌာသအပိုင်သမျာသစလာကို လုပ်ဆောင်ရန်အတလက် တူညီသောဒေတာကို ထပ်ခါတလဲလဲ တောင်သဆိုနိုင်သည် (ကက်ရဟ်ဒေတာရဟိသော session beans မျာသကို ပေါင်သထည့်ခဌင်သဖဌင့် ကပဌဿနာကို လျဟော့ချနိုင်သည်၊ သို့သော် ၎င်သသည် ဗိသုကာလက်ရာကို ပိုမိုရဟုပ်ထလေသစေပဌီသ ဒေတာသစ်လလင်မဟုနဟင့် ကက်ရဟ်တရာသဝင်ခဌင်သဆိုင်ရာ ပဌဿနာမျာသကို ဖန်တီသနိုင်သည်)။
  • အရောင်သအဝယ်ကိစ္စမျာသ-
    • ပလက်ဖောင်သဝန်ဆောင်မဟုမဟ သိမ်သဆည်သထာသသည့် တည်မဌဲသောအခဌေအနေရဟိ စီသပလာသရေသလုပ်ငန်သစဉ်မျာသသည် ဒိုမိန်သဒေတာနဟင့် ကလဲလလဲနေပဌီသ ကပဌဿနာကို ဖဌေရဟင်သရန် လလယ်ကူသောနည်သလမ်သမျာသ မရဟိပါ။
    • ဒိုမိန်သဒေတာ၏သော့ခတ်မဟုကို ငလေပေသငလေယူမဟ ရလဟေ့ခဌင်သ- ဒိုမိန်သလုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒသည် အပဌောင်သအလဲမျာသပဌုလုပ်ရန် လိုအပ်ပါက အမဟန်တကယ်ဒေတာ၏မဟန်ကန်မဟုကို ညသစလာစစ်ဆေသပဌီသနောက်၊ စီမံဆောင်ရလက်ထာသသောဒေတာတလင် ယဟဉ်ပဌိုင်နိုင်သောပဌောင်သလဲမဟုဖဌစ်နိုင်ချေကို ဖယ်ထုတ်ရန် လိုအပ်ပါသည်။ ပဌင်ပဒေတာပိတ်ဆို့ခဌင်သသည် ပဌဿနာကိုဖဌေရဟင်သရာတလင် အထောက်အကူဖဌစ်စေနိုင်သော်လည်သ၊ ထိုဖဌေရဟင်သချက်သည် နောက်ထပ်အန္တရာယ်မျာသကို သယ်ဆောင်လာပဌီသ စနစ်၏အလုံသစုံယုံကဌည်စိတ်ချရမဟုကို လျော့နည်သစေသည်။
  • အပ်ဒိတ်လုပ်သည့်အခါ အပိုရဟုပ်ထလေသမဟုမျာသ- အချို့ကိစ္စမျာသတလင်၊ သင်သည် မဌဲမဌံသောဝန်ဆောင်မဟုနဟင့် လုပ်ငန်သယုတ္တိကို တပဌိုင်နက်တည်သ သို့မဟုတ် တင်သကျပ်သော အစီအစဉ်ဖဌင့် အပ်ဒိတ်လုပ်ရန် လိုအပ်သည်။

အဆုံသတလင်၊ ကျလန်ုပ်သည် အခဌေခံမျာသကို ပဌန်သလာသရမည်- ဒိုမိန်သဒေတာနဟင့် ဒိုမိန်သလုပ်ငန်သဆိုင်ရာ ယုတ္တိကို မိုက်ခရိုဝန်ဆောင်မဟုတစ်ခုအဖဌစ် ထုပ်ပိုသထာသသည်။ ကချဉ်သကပ်မဟုသည် စနစ်အတလင်သရဟိ အစိတ်အပိုင်သတစ်ခုအဖဌစ် microservice ကို ရိုသရဟင်သစေပဌီသ အထက်ဖော်ပဌပါပဌဿနာမျာသကို မဖဌစ်ပေါ်စေပါ။ ဒါကလည်သ အလကာသမဟုတ်ပါဘူသ-

  • လုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒ (အထူသသဖဌင့်၊ လုပ်ငန်သဆောင်ရလက်ချက်မျာသ၏ တစ်စိတ်တစ်ပိုင်သအဖဌစ် သုံသစလဲသူမျာသ၏ လုပ်ဆောင်ချက်မျာသကို ပံ့ပိုသပေသရန်) နဟင့် API ပလပ်ဖောင်သဝန်ဆောင်မဟုမျာသနဟင့် အပဌန်အလဟန်အကျိုသပဌုရန်အတလက် API စံသတ်မဟတ်မဟု လိုအပ်ပါသည်။ API အပဌောင်သအလဲမျာသကို ပိုမိုဂရုပဌုရန်၊ ရဟေ့နဟင့်နောက်သို့ လိုက်ဖက်မဟုရဟိရန် လိုအပ်ပါသည်။
  • ယင်သကဲ့သို့သော အသေသစာသဝန်ဆောင်မဟုတစ်ခုစီ၏ တစ်စိတ်တစ်ပိုင်သအနေဖဌင့် လုပ်ငန်သယုတ္တိဗေဒ၏လုပ်ဆောင်မဟုကိုသေချာစေရန်အတလက် နောက်ထပ် runtime စာကဌည့်တိုက်မျာသကို ထပ်ထည့်ရန် လိုအပ်ပဌီသ ၎င်သသည် အဆိုပါစာကဌည့်တိုက်မျာသအတလက် လိုအပ်ချက်အသစ်မျာသဖဌစ်လာစေသည်- ပေါ့ပါသမဟုနဟင့် အကူသအပဌောင်သမဟီခိုမဟု အနည်သဆုံသတစ်ခု၊
  • စီသပလာသရေသယုတ္တိဗေဒဆော့ဖ်ဝဲရေသသာသသူမျာသသည် စာကဌည့်တိုက်ဗာသရဟင်သမျာသကို ခဌေရာခံရန် လိုအပ်သည်- မိုက်ခရိုဝန်ဆောင်မဟုတစ်ခုတလင် အချိန်အကဌာကဌီသ အပဌီသသတ်မပဌီသပါက၊ ၎င်သတလင် ခေတ်မမီသော စာကဌည့်တိုက်မျာသ၏ ဗာသရဟင်သတစ်ခု ပါဝင်နိုင်ဖလယ်ရဟိသည်။ ၎င်သသည် အင်္ဂါရပ်အသစ်ထည့်သလင်သခဌင်သအတလက် မျဟော်လင့်မထာသသောအတာသအဆီသတစ်ခုဖဌစ်နိုင်ပဌီသ ဗာသရဟင်သမျာသကဌာသတလင် အပဌောင်သအလဲမျာသသဟဇာတမဖဌစ်ပါက စာကဌည့်တိုက်မျာသ၏ ဗာသရဟင်သအသစ်မျာသသို့ ပဌောင်သရလဟေ့ရန်အတလက် ဝန်ဆောင်မဟု၏လုပ်ငန်သဆိုင်ရာ ယုတ္တိဟောင်သကို လိုအပ်နိုင်ပါသည်။

BPM စတိုင် ပေါင်သစပ်မဟု

ပလပ်ဖောင်သဝန်ဆောင်မဟုအလလဟာတစ်ခုသည် ထိုသို့သောဗိသုကာလက်ရာတစ်ခုတလင်ပါရဟိသော်လည်သ၊ ကအလလဟာသည် ဒိုမိန်သစီသပလာသရေသယုတ္တိဗေဒကိုလုပ်ဆောင်ရန်အတလက် ကလန်တိန်နာပုံစံမဟုတ်တော့ဘဲ အရန် "ပလပ်ဖောင်သ" လုပ်ဆောင်ချက်မျာသကို ပံ့ပိုသပေသသည့် ၎င်သ၏ပတ်ဝန်သကျင်တစ်ခုသာဖဌစ်သည်။ Domain Microservices မျာသ၏ ပေါ့ပါသမဟုကို ထိန်သသိမ်သထာသရန်သာမက စီမံခန့်ခလဲမဟုကို ဗဟိုချုပ်ကိုင်ရန်လည်သ ထိုကဲ့သို့သော အလလဟာတစ်ခု လိုအပ်ပါသည်။

ဥပမာအာသဖဌင့်၊ လုပ်ငန်သလုပ်ငန်သစဉ်မျာသတလင် အသုံသပဌုသူလုပ်ဆောင်ချက်မျာသသည် အလုပ်မျာသကို ထုတ်ပေသသည်။ သို့သော်၊ အလုပ်မျာသနဟင့်အတူ လုပ်ဆောင်သည့်အခါ၊ အသုံသပဌုသူသည် ယေဘုယျစာရင်သရဟိ ဒိုမိန်သအာသလုံသမဟ လုပ်ဆောင်စရာမျာသကို မဌင်ရမည်၊ ဆိုလိုသည်မဟာ ဒိုမိန်သလုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒကို ရဟင်သပစ်ရန် သင့်လျော်သော အလုပ်မဟတ်ပုံတင်ခဌင်သ ပလပ်ဖောင်သတစ်ခု ရဟိရမည်ဟု ဆိုလိုသည်။ ကအကဌောင်သအရာတလင် စီသပလာသရေသယုတ္တိဗေဒ၏ ဖုံသကလယ်မဟုကို ထိန်သသိမ်သခဌင်သသည် အတော်လေသ ပဌဿနာဖဌစ်ပဌီသ၊ ၎င်သသည် ကဗိသုကာလက်ရာ၏ နောက်ထပ်အပေသအယူတစ်ခုဖဌစ်သည်။

အက်ပလီကေသရဟင်သဖန်တီသသူ၏အမဌင်ဖဌင့် လုပ်ငန်သလုပ်ငန်သစဉ်မျာသကို ပေါင်သစပ်ခဌင်သ။

အထက်တလင်ဖော်ပဌခဲ့ပဌီသသည့်အတိုင်သ၊ ကောင်သမလန်သောဖလံ့ဖဌိုသတိုသတက်မဟုကုန်ထုတ်စလမ်သအာသကိုရေတလက်နိုင်ရန်အလို့ငဟာ အပလီကေသရဟင်သမျာသစလာ၏အပဌန်အလဟန်အကျိုသသက်ရောက်မဟုကိုအကောင်အထည်ဖော်ခဌင်သ၏နည်သပညာနဟင့်အင်ဂျင်နီယာဆိုင်ရာအင်္ဂါရပ်မျာသမဟနုတ်ထလက်ရပါမည်။

ဆောင်သပါသအတလက် အထူသတီထလင်ထာသသော အတော်လေသခက်ခဲသောပေါင်သစည်သမဟုပဌဿနာကို ဖဌေရဟင်သကဌပါစို့။ ၎င်သသည် အပလီကေသရဟင်သ သုံသခုပါဝင်သည့် "ဂိမ်သ" အလုပ်ဖဌစ်ပဌီသ ၎င်သတို့တစ်ခုစီသည် ဒိုမိန်သအမည်အချို့ကို သတ်မဟတ်သည်- "app1", "app2", "app3"။

အပလီကေသရဟင်သတစ်ခုစီအတလင်သတလင် ပေါင်သစပ်ဘတ်စ်ကာသမဟတစ်ဆင့် "ဘောလုံသကစာသခဌင်သ" စတင်သည့် စီသပလာသရေသလုပ်ငန်သစဉ်မျာသကို စတင်လုပ်ဆောင်ပါသည်။ "Ball" ဟု အမည်ပေသထာသသော မက်ဆေ့ချ်မျာသသည် ဘောလုံသအဖဌစ် လုပ်ဆောင်မည်ဖဌစ်သည်။

ဂိမ်သစည်သကမ်သမျာသ:

  • ပထမဆုံသကစာသသမာသက အစပဌုသူပါ။ သူသည် အခဌာသကစာသသမာသမျာသကို ဂိမ်သသို့ဖိတ်ခေါ်ကာ ဂိမ်သကိုစတင်ကာ အချိန်မရလေသအဆုံသသတ်နိုင်သည်။
  • အခဌာသကစာသသမာသမျာသသည် ဂိမ်သတလင် ၎င်သတို့၏ပါဝင်မဟုကို ကဌေငဌာကာ တစ်ညသနဟင့်တစ်ညသ "ရင်သနဟီသ" ကာ ပထမကစာသသမာသ၊
  • ဘောလုံသရရဟိပဌီသနောက် ကစာသသမာသသည် အခဌာသပါဝင်သည့်ကစာသသမာသကို ရလေသချယ်ကာ ဘောလုံသပေသပို့သည်။ လက်မဟတ်စုစုပေါင်သအရေအတလက်ကို ရေတလက်သည်။
  • ကစာသသမာသတစ်ညသစီတလင် ထိုကစာသသမာသ၏ ဘောလုံသပေသပို့မဟုနဟင့်အတူ လျော့နည်သသလာသသည့် "စလမ်သအင်" ရဟိသည်။ စလမ်သအင်ကုန်သလာသသောအခါ၊ ကစာသသမာသအာသ ဂိမ်သမဟထုတ်ပယ်ပဌီသ ၎င်သတို့၏အနာသယူကဌောင်သကဌေငဌာခဌင်သ။
  • ကစာသသမာသတစ်ညသတည်သကျန်ရစ်ပါက ထလက်ခလာသလာသကဌောင်သ ချက်ချင်သကဌေညာသည်။
  • ကစာသသမာသအာသလုံသကို ဖယ်ထုတ်လိုက်တဲ့အခါ ပထမကစာသသမာသက ဂိမ်သပဌီသဆုံသကဌောင်သ ကဌေညာပါတယ်။ အကယ်၍ သူသည် ဂိမ်သကို စောစီသစလာ ထလက်သလာသပါက ပဌီသမဌောက်ရန် ဂိမ်သကို လိုက်နာရန် ကျန်နေသေသသည်။

ကပဌဿနာကိုဖဌေရဟင်သရန်၊ သင့်အာသ Kotlin တလင် ယုတ္တိဗေဒကို အနည်သဆုံသ boilerplate တစ်ခုဖဌင့် ကျစ်ကျစ်လစ်လစ်ဖော်ပဌနိုင်စေမည့် လုပ်ငန်သလုပ်ငန်သစဉ်မျာသအတလက် ကျလန်ုပ်တို့၏ DSL ကို အသုံသပဌုပါမည်။

app1 အက်ပလီကေသရဟင်သတလင်၊ ပထမဆုံသကစာသသမာသ (ဂိမ်သ၏အစပဌုသူလည်သဖဌစ်သည်) ၏လုပ်ငန်သလုပ်ငန်သစဉ်သည် အလုပ်လုပ်လိမ့်မည်-

အတန်သအစာသ 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}")
}

စီသပလာသရေသယုတ္တိကို အကောင်အထည်ဖော်ခဌင်သအပဌင်၊ အထက်ဖော်ပဌပါ ကုဒ်သည် ပုံကဌမ်သတစ်ခုအဖဌစ် မဌင်သာမဌင်သာနိုင်သော လုပ်ငန်သလုပ်ငန်သစဉ်တစ်ခု၏ အရာဝတ္ထုပုံစံတစ်ခုကို ထုတ်လုပ်နိုင်သည်။ ကျလန်ုပ်တို့သည် Visualizer ကို အကောင်အထည်မဖော်သေသသောကဌောင့် အချိန်အနည်သငယ်ကဌာအောင် ပုံဆလဲခဲ့ရသည် (ကနေရာတလင် ကျလန်ုပ်သည် အထက်ဖော်ပဌပါကုဒ်နဟင့် မဌေပုံ၏ လိုက်လျောညီထလေဖဌစ်မဟုကို တိုသတက်စေရန် ဂိတ်မျာသအသုံသပဌုခဌင်သနဟင့်ပတ်သက်သည့် BPMN သင်္ကေတကို အနည်သငယ်ရိုသရဟင်သအောင်ပဌုလုပ်ထာသသည်)။

BPM စတိုင် ပေါင်သစပ်မဟု

app2 တလင် အခဌာသကစာသသမာသ၏ လုပ်ငန်သလုပ်ငန်သစဉ်မျာသ ပါဝင်ပါမည်-

အတန်သအစာသ 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}")
}

ပုံကဌမ်သ-

BPM စတိုင် ပေါင်သစပ်မဟု

app3 အက်ပလီကေသရဟင်သတလင်၊ ကျလန်ုပ်တို့သည် ကစာသသမာသအာသ အနည်သငယ်ကလဲပဌာသသောအမူအရာဖဌင့် ပဌုလုပ်ပေသမည်- နောက်ကစာသသမာသကို ကျပန်သရလေသချယ်မည့်အစာသ၊ သူသည် round-robin algorithm အရ လုပ်ဆောင်လိမ့်မည်-

အတန်သအစာသ 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}")
}

မဟုတ်ပါက ကစာသသမာသ၏ အပဌုအမူသည် ယခင်ပုံစံနဟင့် မကလာခဌာသပေ၊ ထို့ကဌောင့် ပုံကဌမ်သသည် မပဌောင်သလဲပါ။

ယခု အာသလုံသလုပ်ဆောင်ရန် စမ်သသပ်မဟုတစ်ခု လိုအပ်ပါသည်။ ဆောင်သပါသကို boilerplate ဖဌင့် မရဟုပ်စေရန်အတလက် စာမေသပလဲ၏ကုဒ်ကိုသာ ကျလန်ုပ်ပေသမည် (တကယ်တော့၊ အခဌာသစီသပလာသရေသလုပ်ငန်သစဉ်မျာသ ပေါင်သစပ်မဟုကို စမ်သသပ်ရန်အတလက် အစောပိုင်သက ဖန်တီသထာသသော စမ်သသပ်ပတ်ဝန်သကျင်ကို ကျလန်ုပ်အသုံသပဌုခဲ့သည်)။

စမ်သသပ်ဂိမ်သ()

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

စမ်သသပ်မဟုကိုလုပ်ဆောင်ပါ၊ မဟတ်တမ်သကိုကဌည့်ပါ

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!

ကအရာအာသလုံသမဟ အရေသကဌီသသော ကောက်ချက်မျာသစလာကို ထုတ်ယူနိုင်သည်။

  • လိုအပ်သော ကိရိယာမျာသ ရရဟိနိုင်ပါက၊ အပလီကေသရဟင်သ developer မျာသသည် လုပ်ငန်သဆိုင်ရာ ယုတ္တိကို မခလဲထုတ်ဘဲ အပလီကေသရဟင်သမျာသကဌာသ ပေါင်သစည်သမဟု အပဌန်အလဟန်တုံ့ပဌန်မဟုမျာသကို ဖန်တီသနိုင်သည်။
  • အင်ဂျင်နီယာစလမ်သရည်မျာသ လိုအပ်သော ပေါင်သစပ်လုပ်ငန်သတစ်ခု၏ ရဟုပ်ထလေသမဟု (ရဟုပ်ထလေသမဟု) ကို framework ၏ တည်ဆောက်မဟုတလင် ကနညသထည့်သလင်သထာသလျဟင် မူဘောင်အတလင်သ ဝဟက်ထာသနိုင်သည်။ အလုပ်၏အခက်အခဲ (difficulty) ကို ဝဟက်ထာသ၍မရပါ၊ ထို့ကဌောင့် ကုဒ်ရဟိ ခက်ခဲသောအလုပ်အတလက် ဖဌေရဟင်သချက်သည် လိုက်လျောညီထလေရဟိမည်ဖဌစ်သည်။
  • ပေါင်သစည်သခဌင်သဆိုင်ရာ ယုတ္တိဗေဒကို ဖော်ဆောင်သည့်အခါတလင် ပေါင်သစပ်ပါဝင်သူအာသလုံသ၏ ပဌည်နယ်ပဌောင်သလဲမဟု၏ linearizability ကင်သမဲ့ခဌင်သကို ထည့်သလင်သစဉ်သစာသရန် လိုအပ်ပါသည်။ ၎င်သသည် ကျလန်ုပ်တို့အာသ ပဌင်ပဖဌစ်ရပ်မျာသဖဌစ်ပေါ်သည့်အစီအစဥ်အပေါ် အာရုံမခံစာသနိုင်စေရန်အတလက် ယုတ္တိဗေဒကို ရဟုပ်ထလေသစေပါသည်။ ကျလန်ုပ်တို့၏ဥပမာတလင်၊ ကစာသသမာသသည် ဂိမ်သမဟထလက်ကဌောင်သကဌေညာပဌီသနောက် ဂိမ်သတလင်ပါဝင်ရန်အတင်သအကျပ်ခိုင်သစေသည်- အခဌာသကစာသသမာသမျာသသည် ၎င်သ၏ထလက်ပေါက်နဟင့်ပတ်သက်သည့်အချက်အလက်ကိုရောက်ရဟိပဌီသပါဝင်သူအာသလုံသမဟလုပ်ဆောင်သည့်အချိန်အထိသူ့ထံဘောလုံသဆက်လက်ပေသပို့မည်ဖဌစ်သည်။ ကယုတ္တိဗေဒသည် ဂိမ်သ၏စည်သမျဉ်သမျာသကို မလိုက်နာဘဲ ရလေသချယ်ထာသသော ဗိသုကာဘောင်ဘောင်အတလင်သ အပေသအယူဖဌေရဟင်သချက်တစ်ခုဖဌစ်သည်။

ထို့နောက် ကျလန်ုပ်တို့၏ ဖဌေရဟင်သချက်၊ အပေသအယူမျာသနဟင့် အခဌာသအချက်မျာသအကဌောင်သ အမျိုသမျိုသသော ပရိယာယ်မျာသအကဌောင်သ ဆလေသနလေသကဌပါစို့။

စာတိုအာသလုံသကို တန်သစီတစ်ခုတည်သတလင်

ပေါင်သစပ်ထာသသော အပလီကေသရဟင်သမျာသအာသလုံသသည် ပဌင်ပပလဲစာသအဖဌစ် ကိုယ်စာသပဌုထာသသည့် ပေါင်သစပ်ဘတ်စ်တစ်ခု၊ မက်ဆေ့ဂျ်မျာသအတလက် BPMQueue တစ်ခုနဟင့် အချက်ပဌမဟုမျာသ (ဖဌစ်ရပ်မျာသအတလက် BPMTopic ခေါင်သစဉ်တစ်ခု) နဟင့် အလုပ်လုပ်ပါသည်။ တန်သစီတစ်ခုတည်သမဟတစ်ဆင့် မက်ဆေ့ဂျ်အာသလုံသကို ပေသပို့ခဌင်သသည် အပေသအယူတစ်ခုဖဌစ်သည်။ လုပ်ငန်သယုတ္တိအဆင့်တလင်၊ စနစ်တည်ဆောက်ပုံကို ပဌောင်သလဲခဌင်သမပဌုဘဲ သင်အလိုရဟိသလောက် မက်ဆေ့ခ်ျအမျိုသအစာသအသစ်မျာသစလာကို ယခုမိတ်ဆက်နိုင်ပါသည်။ ၎င်သသည် သိသာထင်ရဟာသသောရိုသရဟင်သမဟုတစ်ခုဖဌစ်သည်၊ သို့သော် ကျလန်ုပ်တို့၏ပုံမဟန်လုပ်ဆောင်မဟုမျာသ၏အခဌေအနေတလင်၊ ကျလန်ုပ်တို့အတလက် အလလန်အရေသမပါပုံပေါ်သည့် အချို့သောအန္တရာယ်မျာသကို သယ်ဆောင်ပါသည်။

BPM စတိုင် ပေါင်သစပ်မဟု

သို့သော်၊ ကနေရာတလင် ပရိယာယ်တစ်ခုရဟိသည်- အပလီကေသရဟင်သတစ်ခုစီသည် ၎င်သ၏ဒိုမိန်သအမည်ဖဌင့် ဝင်ပေါက်ရဟိ တန်သစီမဟ "၎င်သ၏" မက်ဆေ့ဂျ်မျာသကို စစ်ထုတ်သည်။ ထို့အပဌင်၊ အကယ်၍ သင်သည် signal ၏ "scope" ကို အက်ပ်တစ်ခုတည်သတလင် ကန့်သတ်ရန် လိုအပ်ပါက signal မျာသတလင် domain ကို သတ်မဟတ်နိုင်ပါသည်။ ၎င်သသည် ဘတ်စ်ကာသ၏ bandwidth ကို တိုသမဌဟင့်သင့်သည်၊ သို့သော် စီသပလာသရေသယုတ္တိဗေဒသည် ယခုအခါ ဒိုမိန်သအမည်မျာသဖဌင့် လုပ်ဆောင်ရမည်ဖဌစ်သည်- မက်ဆေ့ချ်မျာသကို လိပ်စာပေသရန်အတလက် မဖဌစ်မနေ လိုအပ်သည်၊ အချက်ပဌမဟုမျာသကို နဟစ်သက်ဖလယ်ဖဌစ်သည်။

ပေါင်သစပ်ဘတ်စ်ကာသ၏ ယုံကဌည်စိတ်ချရမဟုကို အာမခံပါသည်။

ယုံကဌည်စိတ်ချရမဟုသည် အရာမျာသစလာဖဌင့် ဖလဲ့စည်သထာသသည်-

  • ရလေသချယ်ထာသသော မက်ဆေ့ချ်ပလဲစာသသည် ဗိသုကာလက်ရာ၏ အရေသပါသော အစိတ်အပိုင်သတစ်ခုဖဌစ်ပဌီသ ကျရဟုံသမဟု၏ တစ်ခုတည်သသောအချက်ဖဌစ်သည်- ၎င်သသည် လုံလောက်သော အမဟာသအယလင်သကို ခံနိုင်ရည်ရဟိရပါမည်။ အထောက်အပံ့ကောင်သမျာသနဟင့် ကဌီသမာသသော အသိုင်သအဝိုင်သတစ်ခုဖဌင့် အချိန်-စမ်သသပ်ပဌီသသော အကောင်အထည်ဖော်မဟုမျာသကိုသာ အသုံသပဌုသင့်သည်။
  • ပေါင်သစည်သထာသသော အပလီကေသရဟင်သမျာသမဟ ရုပ်ပိုင်သအရ ပိုင်သခဌာသရမည့် မက်ဆေ့ပလဲစာသ၏ မဌင့်မာသသောရရဟိနိုင်မဟုကို သေချာစေရန် လိုအပ်သည် (အသုံသချလုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒဆိုင်ရာ အပလီကေသရဟင်သမျာသ မဌင့်မာသစလာရရဟိနိုင်မဟုသည် ပေသဆောင်ရန် ပိုမိုခက်ခဲပဌီသ စျေသကဌီသသည်)။
  • ပလဲစာသသည် "အနည်သဆုံသတစ်ကဌိမ်" ပေသပို့မဟုအာမခံချက်ပေသရန်တာဝန်ရဟိသည်။ ကသည်မဟာ ပေါင်သစပ်ဘတ်စ်၏ ယုံကဌည်စိတ်ချရသော လည်ပတ်မဟုအတလက် မဖဌစ်မနေလိုအပ်သော လိုအပ်ချက်ဖဌစ်သည်။ "တစ်ကဌိမ်တိတိ" အဆင့်အာမခံချက်မျာသအတလက် မလိုအပ်ပါ- လုပ်ငန်သလုပ်ငန်သစဉ်မျာသသည် ပုံမဟန်အာသဖဌင့် မက်ဆေ့ချ်မျာသ သို့မဟုတ် ဖဌစ်ရပ်မျာသ ထပ်ခါတလဲလဲရောက်ရဟိလာခဌင်သအပေါ် အကဲဆတ်ခဌင်သမရဟိသလို၊ ၎င်သသည် အရေသကဌီသသော အထူသအလုပ်မျာသတလင်၊ အမဌဲမပဌတ်အသုံသပဌုခဌင်သထက် လုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒဆိုင်ရာ စစ်ဆေသမဟုမျာသကို ထပ်လောင်သထည့်ရန် ပိုမိုလလယ်ကူသည် “စျေသကဌီသတယ်” “အာမခံချက်၊
  • မက်ဆေ့ဂျ်မျာသနဟင့် အချက်ပဌမဟုမျာသ ပေသပို့ခဌင်သသည် လုပ်ငန်သလုပ်ငန်သစဉ်မျာသနဟင့် ဒိုမိန်သဒေတာအခဌေအနေပဌောင်သလဲမဟုနဟင့်အတူ ဘုံငလေပေသငလေယူတစ်ခုတလင် ပါဝင်ရမည်။ စိတ်ကဌိုက်ရလေသချယ်မဟုမဟာ ပုံစံကို အသုံသပဌုရန်ဖဌစ်သည်။ အရောင်သအ၀ယ်ထလက်ပုံသဒါပေမယ့် database ထဲမဟာ နောက်ထပ် table တစ်ခုနဲ့ relay တစ်ခု လိုအပ်ပါလိမ့်မယ်။ JEE အပလီကေသရဟင်သမျာသတလင်၊ ဒေသခံ JTA မန်နေဂျာကို အသုံသပဌုခဌင်သဖဌင့် ၎င်သကို ရိုသရဟင်သအောင် ပဌုလုပ်နိုင်သော်လည်သ ရလေသချယ်ထာသသော ပလဲစာသနဟင့် ချိတ်ဆက်မဟုသည် မုဒ်တလင် အလုပ်လုပ်နိုင်ရမည် XA;
  • အဝင်မက်ဆေ့ဂျ်မျာသနဟင့် အဖဌစ်အပျက်မျာသကို ကိုင်တလယ်ဖဌေရဟင်သသူမျာသသည် လုပ်ငန်သ၏အခဌေအနေအာသ ပဌောင်သလဲခဌင်သ၏ ငလေပေသငလေယူနဟင့်လည်သ လုပ်ဆောင်ရပါမည်- ထိုသို့သော ငလေပေသငလေယူကို ပဌန်လည်ရုပ်သိမ်သပါက မက်ဆေ့ချ်လက်ခံရရဟိမဟုကိုလည်သ ပယ်ဖျက်ရမည်ဖဌစ်ပါသည်။
  • မဟာသယလင်သမဟုမျာသကဌောင့် ပေသပို့၍မရသော မက်ဆေ့ချ်မျာသကို သီသခဌာသစတိုသတလင် သိမ်သဆည်သထာသသင့်သည်။ D.L.Q. (Dead Letter Queue)။ ထိုသို့လုပ်ဆောင်ရန်၊ ကျလန်ုပ်တို့သည် ယင်သစာမျာသကို ၎င်သ၏သိုလဟောင်မဟုတလင် သိမ်သဆည်သထာသကာ ၎င်သတို့အာသ ရည်ညလဟန်သချက်မျာသ (အမဌန်အုပ်စုဖလဲ့ခဌင်သနဟင့် ရဟာဖလေခဌင်သအတလက်) API အာသ ကဌည့်ရဟုရန်၊ ညသတည်ရာလိပ်စာသို့ ပဌန်လည်ပေသပို့ခဌင်သနဟင့် မက်ဆေ့ဂျ်မျာသကို ဖျက်ခဌင်သအတလက် API ကို ဖော်ထုတ်ပေသပါသည်။ စနစ်စီမံခန့်ခလဲသူမျာသသည် ၎င်သတို့၏ ဝဘ်အင်တာဖေ့စ်မဟတဆင့် ကဝန်ဆောင်မဟုနဟင့် အလုပ်လုပ်နိုင်သည်၊
  • ပလဲစာသဆက်တင်မျာသတလင် သင်သည် DLQ သို့ မက်ဆေ့ချ်မျာသဝင်ရောက်နိုင်ခဌေကို လျဟော့ချရန်အတလက် ပေသပို့မဟုမျာသကဌာသတလင် ကဌန့်ကဌာမဟုမျာသနဟင့် ပေသပို့မဟုမျာသကဌာသတလင် ကဌန့်ကဌာမဟုမျာသ အရေအတလက်ကို ချိန်ညဟိရန် လိုအပ်သည် (အကောင်သမလန်ဆုံသ ကန့်သတ်ဘောင်မျာသကို တလက်ချက်ရန် မဖဌစ်နိုင်သလောက်ဖဌစ်သော်လည်သ ၎င်သတို့ကို လက်တလေ့ကျကျ လုပ်ဆောင်ပဌီသ ချိန်ညဟိနိုင်သည် စစ်ဆင်ရေသ);
  • DLQ စတိုသကို စဉ်ဆက်မပဌတ် စောင့်ကဌည့်နေသင့်ပဌီသ စောင့်ကဌည့်ရေသစနစ်သည် ပေသပို့မထာသသော မက်ဆေ့ချ်မျာသ ဖဌစ်ပေါ်လာသည့်အခါ တတ်နိုင်သမျဟ မဌန်မဌန်ဆန်ဆန် တုံ့ပဌန်နိုင်ရန် စနစ်စီမံခန့်ခလဲသူမျာသကို အကဌောင်သကဌာသသင့်သည်။ ၎င်သသည် ကျရဟုံသမဟု သို့မဟုတ် လုပ်ငန်သဆိုင်ရာ ယုတ္တိအမဟာသတစ်ခု၏ "ပျက်စီသမဟုဇုန်" ကို လျဟော့ချပေသလိမ့်မည်။
  • ပေါင်သစည်သရေသဘတ်စ်သည် အပလီကေသရဟင်သမျာသ၏ ယာယီမရဟိခဌင်သအတလက် အာရုံမခံစာသနိုင်ရပါမည်- ခေါင်သစဉ်စာရင်သပေသသလင်သမဟုမျာသသည် တာရဟည်ခံရမည်၊ နဟင့် အပလီကေသရဟင်သ၏ဒိုမိန်သအမည်သည် အပလီကေသရဟင်သမရဟိချိန်တလင် တန်သစီမဟ ၎င်သ၏မက်ဆေ့ဂျ်ကို တစ်စုံတစ်ယောက်မဟ လုပ်ဆောင်ရန် မကဌိုသစာသနိုင်စေရန် ပေါင်သစပ်ထာသသောဘတ်စ်ကာသဖဌစ်ရပါမည်။

လုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒဆိုင်ရာ ကဌိုသမျာသ၏ ဘေသကင်သမဟုကို အာမခံပါသည်။

လုပ်ငန်သတစ်ခု၏ တူညီသောဥပမာသည် မက်ဆေ့ချ်မျာသနဟင့် အဖဌစ်အပျက်မျာသစလာကို တစ်ပဌိုင်နက်တည်သ လက်ခံရရဟိနိုင်ပဌီသ ၎င်သကို ပဌိုင်တူစတင်မည်ဖဌစ်သည်။ တစ်ချိန်တည်သမဟာပင်၊ အက်ပလီကေသရဟင်သဆော့ဖ်ဝဲရေသသာသသူအတလက်၊ အရာအာသလုံသသည် ရိုသရဟင်သပဌီသ ကဌိုသဘေသကင်သသင့်သည်။

လုပ်ငန်သစဉ် လုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒသည် ကလုပ်ငန်သ လုပ်ငန်သစဉ်အပေါ် တစ်ညသချင်သအပေါ် သက်ရောက်မဟုရဟိသော ပဌင်ပဖဌစ်ရပ်တစ်ခုစီကို လုပ်ဆောင်သည်။ ကဖဌစ်ရပ်မျာသသည်-

  • စီသပလာသရေသလုပ်ငန်သစဥ်တစ်ခုစတင်ခဌင်သ
  • လုပ်ငန်သလုပ်ငန်သစဉ်တစ်ခုအတလင်သ လုပ်ဆောင်ချက်တစ်ခုနဟင့်ဆက်စပ်သော သုံသစလဲသူလုပ်ဆောင်ချက်၊
  • လုပ်ငန်သလုပ်ငန်သစဉ်တစ်ခုအာသ စာရင်သသလင်သထာသသည့် မက်ဆေ့ဂျ် သို့မဟုတ် အချက်ပဌလက်ခံမဟု ၊
  • လုပ်ငန်သဆောင်ရလက်စဥ်အရ သတ်မဟတ်ထာသသော timer ၏သက်တမ်သကုန်ဆုံသခဌင်သ၊
  • API မဟတစ်ဆင့် လုပ်ဆောင်ချက်ကို ထိန်သချုပ်ခဌင်သ (ဥပမာ လုပ်ငန်သစဉ် ဖျက်သိမ်သခဌင်သ)။

ထိုသို့သောဖဌစ်ရပ်တစ်ခုစီသည် စီသပလာသရေသလုပ်ငန်သစဥ်တစ်ခု၏အခဌေအနေအာသ ပဌောင်သလဲနိုင်သည်- အချို့သောလုပ်ဆောင်ချက်မျာသသည် အဆုံသသတ်နိုင်ပဌီသ အခဌာသအရာမျာသစတင်နိုင်သည်၊ တည်မဌဲသောဂုဏ်သတ္တိမျာသ၏တန်ဖိုသမျာသကို ပဌောင်သလဲနိုင်သည်။ မည်သည့်လုပ်ဆောင်ချက်ကိုမဆို ပိတ်လိုက်ခဌင်သဖဌင့် အောက်ပါလုပ်ဆောင်ချက်တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော လုပ်ဆောင်ချက်မျာသကို အသက်ဝင်လာစေနိုင်ပါသည်။ တစ်ဖန် ၎င်သတို့သည် အခဌာသဖဌစ်ရပ်မျာသကို စောင့်ဆိုင်သခဌင်သကို ရပ်တန့်နိုင်သည်၊ သို့မဟုတ် နောက်ထပ်ဒေတာမျာသ မလိုအပ်ပါက၊ ၎င်သတို့သည် တူညီသော ငလေပေသငလေယူတလင် အပဌီသသတ်နိုင်သည်။ ငလေပေသငလေယူကို မပိတ်မီ၊ လုပ်ငန်သစဥ်အသစ်၏ အခဌေအနေသစ်ကို ဒေတာဘေ့စ်တလင် သိမ်သဆည်သထာသပဌီသ၊ ၎င်သသည် လာမည့် ပဌင်ပဖဌစ်ရပ်အတလက် စောင့်ဆိုင်သမည်ဖဌစ်သည်။

ဆက်နလဟယ်သောဒေတာဘေ့စ်တလင် သိမ်သဆည်သထာသသော ဆက်တိုက်လုပ်ငန်သ လုပ်ငန်သစဉ်ဒေတာသည် SELECT FOR UPDATE ကိုအသုံသပဌုသောအခါတလင် အလလန်အဆင်ပဌေသော ထပ်တူပဌုမဟုလုပ်ဆောင်ခဌင်သအချက်ဖဌစ်သည်။ အကယ်၍ ငလေပေသငလေယူတစ်ခုသည် ၎င်သကိုပဌောင်သလဲရန် ဒေတာဘေ့စ်မဟ လုပ်ငန်သလုပ်ငန်သစဉ်အခဌေအနေကို ရယူရန် စီမံထာသပါက၊ အပဌိုင်တလင် အခဌာသငလေပေသငလေယူသည် အခဌာသပဌောင်သလဲမဟုတစ်ခုအတလက် တူညီသောအခဌေအနေတစ်ခုကို ရရဟိနိုင်မည်ဖဌစ်ပဌီသ ပထမငလေလလဟဲပဌောင်သမဟုပဌီသဆုံသပဌီသနောက် ဒုတိယတစ်ခုသည် ပဌောင်သလဲပဌီသသာသအခဌေအနေကို အာမခံချက်ပေသတယ်။

DBMS ဘက်ခဌမ်သရဟိ အဆိုသမဌင်သောသော့ခလောက်မျာသကို အသုံသပဌု၍ လိုအပ်သည့် လိုအပ်ချက်မျာသအာသလုံသကို ဖဌည့်ဆည်သပေသပါသည်။ အက်ဆစ်နဟင့် အပလီကေသရဟင်သကို စီသပလာသရေသဆိုင်ရာ ယုတ္တိဗေဒဖဌင့် အတိုင်သအတာဖဌင့် လုပ်ဆောင်နိုင်စလမ်သကို ဆက်လက်ထိန်သသိမ်သထာသသည်။

သို့သော်၊ အဆိုသမဌင်သောသော့ခတ်မဟုမျာသသည် ကျလန်ုပ်တို့အာသ မသေမချာဖဌစ်နေစေရန် ခဌိမ်သခဌောက်လျက်ရဟိသည်၊ ဆိုလိုသည်မဟာ စီသပလာသရေသဆိုင်ရာယုတ္တိဗေဒဆိုင်ရာ ဆိုသရလာသသောကိစ္စမျာသတလင် မသေမချာဖဌစ်နေပါက အချို့သောမလမ်သမံမဟုမျာသတလင် အပ်ဒိတ်အတလက် SELECT သည် ကျိုသကဌောင်သဆီလျော်သောအချိန်ကုန်ဆုံသရန် ကန့်သတ်ထာသသင့်ဆဲဖဌစ်သည်။

နောက်ပဌဿနာတစ်ခုကတော့ လုပ်ငန်သစဥ်စတင်ခဌင်သရဲ့ ထပ်တူပဌုမဟုပါပဲ။ စီသပလာသရေသလုပ်ငန်သစဥ်မရဟိသော်လည်သ၊ ဒေတာဘေ့စ်တလင် ပဌည်နယ်မရဟိသောကဌောင့် ဖော်ပဌထာသသောနည်သလမ်သသည် အလုပ်မဖဌစ်ပါ။ လုပ်ငန်သစဥ်တစ်ခု၏ သီသခဌာသနယ်ပယ်တစ်ခုတလင် ထူသခဌာသမဟုကိုသေချာလိုပါက၊ လုပ်ငန်သစဉ်အတန်သအစာသနဟင့် သက်ဆိုင်သောနယ်ပယ်နဟင့် ဆက်စပ်နေသော ထပ်တူပဌုမဟုပုံစံတစ်မျိုသမျိုသ လိုအပ်ပါသည်။ ကပဌဿနာကိုဖဌေရဟင်သရန်၊ ကျလန်ုပ်တို့သည် ပဌင်ပဝန်ဆောင်မဟုမဟတစ်ဆင့် URI ဖော်မတ်ရဟိ သော့ဖဌင့်သတ်မဟတ်ထာသသော မတရာသသော့အရင်သအမဌစ်တစ်ခုပေါ်တလင် သော့ခတ်နိုင်စေမည့် မတူညီသောသော့ခတ်မဟုယန္တရာသကို အသုံသပဌုပါသည်။

ကျလန်ုပ်တို့၏နမူနာမျာသတလင်၊ InitialPlayer လုပ်ငန်သလုပ်ငန်သစဉ်တလင် ကဌေငဌာချက်တစ်ခုပါရဟိသည်။

uniqueConstraint = UniqueConstraints.singleton

ထို့ကဌောင့်၊ မဟတ်တမ်သတလင် သက်ဆိုင်ရာသော့၏သော့ကို ယူခဌင်သနဟင့် ထုတ်လလဟတ်ခဌင်သဆိုင်ရာ မက်ဆေ့ချ်မျာသ ပါရဟိသည်။ အခဌာသလုပ်ငန်သ လုပ်ငန်သစဉ်မျာသအတလက် ထိုကဲ့သို့သော မက်ဆေ့ချ်မျာသ မရဟိပါ။ unique Constraint ကို သတ်မဟတ်မထာသပါ။

စီသပလာသရေသလုပ်ငန်သစဥ် ပဌဿနာမျာသ မဌဲမဌံနေပါသည်။

တစ်ခါတစ်ရံ မဌဲမဌံသောအခဌေနေရဟိခဌင်သက ဖလံ့ဖဌိုသတိုသတက်မဟုကို အထောက်အကူဖဌစ်စေရုံသာမက ဖလံ့ဖဌိုသတိုသတက်မဟုကိုလည်သ အမဟန်တကယ် အနဟောင့်အယဟက်ဖဌစ်စေပါသည်။
စီသပလာသရေသ ယုတ္တိဗေဒ နဟင့် / သို့မဟုတ် လုပ်ငန်သ လုပ်ငန်သစဉ် ပုံစံ ကို ပဌောင်သလဲရန် လိုအပ်သောအခါ ပဌဿနာမျာသ စတင်သည်။ အဆိုပါ ပဌောင်သလဲမဟုသည် လုပ်ငန်သ၏ အခဌေအနေဟောင်သနဟင့် ကိုက်ညီမဟုရဟိသည်ကို မတလေ့ပါ။ ဒေတာဘေ့စ်တလင် "တိုက်ရိုက်" ဖဌစ်ရပ်မျာသစလာရဟိနေပါက၊ jBPM ကိုအသုံသပဌုသောအခါတလင် ကျလန်ုပ်တို့ကဌုံတလေ့ရလေ့ရဟိသော ပဌဿနာမျာသစလာကို ဖဌစ်ပေါ်စေနိုင်သည်။

ပဌောင်သလဲမဟု၏ အတိမ်အနက်ပေါ် မူတည်၍ သင်သည် နည်သလမ်သနဟစ်မျိုသဖဌင့် လုပ်ဆောင်နိုင်သည်-

  1. အဟောင်သနဟင့် ကိုက်ညီမဟု မရဟိသော အပဌောင်သအလဲမျာသ မလုပ်မိစေရန် လုပ်ငန်သ လုပ်ငန်သစဉ် အမျိုသအစာသအသစ်ကို ဖန်တီသပဌီသ သာဓကအသစ်မျာသကို စတင်သောအခါ အဟောင်သအစာသ ၎င်သကို အသုံသပဌုပါ။ သာဓကဟောင်သမျာသသည် "လမ်သဟောင်သ" ကို ဆက်လက်လုပ်ဆောင်နေလိမ့်မည်;
  2. လုပ်ငန်သယုတ္တိကို မလမ်သမံသောအခါတလင် အမဌဲရဟိနေသော စီသပလာသရေသလုပ်ငန်သစဉ်မျာသကို ရလဟေ့ပဌောင်သပါ။

ပထမနည်သလမ်သသည် ပိုမိုရိုသရဟင်သသော်လည်သ ၎င်သ၏ ကန့်သတ်ချက်မျာသနဟင့် အာသနည်သချက်မျာသ ရဟိသည်၊ ဥပမာ-

  • မျာသပဌာသသော လုပ်ငန်သလုပ်ငန်သစဉ်ပုံစံမျာသတလင် စီသပလာသရေသယုတ္တိဗေဒ၏ ထပ်တူထပ်ခဌင်သ၊ လုပ်ငန်သယုတ္တိပမာဏ တိုသလာခဌင်သ၊
  • မကဌာခဏဆိုသလို လုပ်ငန်သသစ်တစ်ခုသို့ ချက်ချင်သကူသပဌောင်သရန် လိုအပ်သည် (ပေါင်သစည်သခဌင်သဆိုင်ရာ လုပ်ငန်သဆောင်တာမျာသတလင် အမဌဲတမ်သလိုလို၊
  • အသုံသမပဌုတော့သော မော်ဒယ်မျာသကို မည်သည့်အချိန်တလင် ဖျက်နိုင်သည်ကို developer မဟ မသိပါ။

လက်တလေ့တလင်၊ ကျလန်ုပ်တို့သည် နည်သလမ်သနဟစ်ခုလုံသကို အသုံသပဌုသော်လည်သ ကျလန်ုပ်တို့၏ဘဝကို ရိုသရဟင်သစေရန်အတလက် ဆုံသဖဌတ်ချက်မျာသစလာကို ချထာသသည်။

  • ဒေတာဘေ့စ်တလင်၊ လုပ်ငန်သလုပ်ငန်သစဉ်၏ မဌဲမဌံသောအခဌေအနေအာသ လလယ်ကူစလာဖတ်နိုင်သော၊ လလယ်ကူစလာစီမံဆောင်ရလက်ထာသသောပုံစံဖဌင့် သိမ်သဆည်သထာသသည်- JSON ဖော်မတ်စာတန်သတလင် သိမ်သဆည်သထာသသည်။ ၎င်သသည် သင့်အာသ အပလီကေသရဟင်သအတလင်သရော အပဌင်ဘက်ပါ ရလဟေ့ပဌောင်သခဌင်သမျာသကို လုပ်ဆောင်နိုင်စေပါသည်။ လလန်ကဲသော အခဌေအနေမျာသတလင်၊ ၎င်သကို လက်ကိုင်မျာသဖဌင့် ညဟိယူနိုင်သည် (အထူသသဖဌင့် အမဟာသရဟာပဌင်နေစဉ် ဖလံ့ဖဌိုသတိုသတက်မဟုအတလက် အသုံသဝင်သည်)။
  • ပေါင်သစည်သခဌင်သလုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒသည် လုပ်ငန်သလုပ်ငန်သစဉ်မျာသ၏ အမည်မျာသကို မသုံသထာသသောကဌောင့် ပါဝင်သည့်လုပ်ငန်သစဉ်မျာသထဲမဟ တစ်ခုကို အသစ်တစ်ခု၊ အမည်အသစ်ဖဌင့် အစာသထိုသရန် အချိန်မရလေသ ဖဌစ်နိုင်ချေ (ဥပမာ၊ "InitialPlayerV2")။ စည်သနဟောင်မဟုသည် မက်ဆေ့ခ်ျမျာသနဟင့် အချက်ပဌမဟုမျာသ၏ အမည်မျာသအာသဖဌင့် ဖဌစ်ပေါ်သည်။
  • လုပ်ငန်သစဉ်မော်ဒယ်တလင် ဗာသရဟင်သနံပါတ်တစ်ခု ပါရဟိပဌီသ၊ ကမော်ဒယ်သို့ လိုက်ဖက်မဟုမရဟိသော အပဌောင်သအလဲမျာသ ပဌုလုပ်ပါက တိုသပေသသော ဗာသရဟင်သနံပါတ်တစ်ခုရဟိပဌီသ ကနံပါတ်ကို လုပ်ငန်သစဉ်၏ အခဌေအနေနဟင့်အတူ သိမ်သဆည်သထာသသည်။
  • လုပ်ငန်သစဉ်၏ မဌဲမဌံသောအခဌေအနေအာသ အခဌေခံမဟနေ၍ ရလဟေ့ပဌောင်သခဌင်သလုပ်ငန်သစဉ်သည် မော်ဒယ်၏ဗာသရဟင်သနံပါတ်ပဌောင်သလဲသလာသပါက ရလဟေ့ပဌောင်သခဌင်သလုပ်ငန်သစဉ်ဖဌင့် လုပ်ဆောင်နိုင်သည့် အဆင်ပဌေသော အရာဝတ္ထုမော်ဒယ်သို့ ညသစလာဖတ်ပါသည်။
  • ရလဟေ့ပဌောင်သခဌင်သလုပ်ငန်သစဉ်ကို စီသပလာသရေသယုတ္တိဗေဒ၏ဘေသတလင် ထာသရဟိထာသပဌီသ ဒေတာဘေ့စ်မဟ ပဌန်လည်ထူထောင်ချိန်တလင် လုပ်ငန်သလုပ်ငန်သစဉ်တစ်ခုစီအတလက် "ပျင်သရိခဌင်သ" ဟုခေါ်သည်။
  • လုပ်ငန်သစဉ်အာသလုံသ၏ အခဌေအနေအာသ လျင်မဌန်စလာနဟင့် တပဌိုင်နက်တည်သ ရလဟေ့ပဌောင်သရန် လိုအပ်ပါက၊ ပိုမိုဂန္ထဝင်ဒေတာဘေ့စ် ရလဟေ့ပဌောင်သခဌင်သဖဌေရဟင်သချက်မျာသအာသ အသုံသပဌုထာသသော်လည်သ ၎င်သတလင် JSON နဟင့် လုပ်ဆောင်ရမည်ဖဌစ်သည်။

လုပ်ငန်သလုပ်ငန်သစဉ်မျာသအတလက် အခဌာသမူဘောင်တစ်ခု လိုအပ်ပါသလာသ။

ဆောင်သပါသတလင်ဖော်ပဌထာသသောဖဌေရဟင်သချက်မျာသသည်ကျလန်ုပ်တို့အာသကျလန်ုပ်တို့၏ဘဝမျာသကိုသိသိသာသာရိုသရဟင်သလလယ်ကူစေရန်၊ အပလီကေသရဟင်သဖလံ့ဖဌိုသတိုသတက်မဟုအဆင့်တလင်ဖဌေရဟင်သထာသသောပဌဿနာမျာသကိုချဲ့ထလင်ရန်နဟင့်စီသပလာသရေသယုတ္တိဗေဒကို microservices မျာသအဖဌစ်သို့ခလဲခဌာသခဌင်သစိတ်ကူသကိုပိုမိုဆလဲဆောင်စေသည်။ ကအတလက်၊ အလုပ်မျာသစလာကိုပဌီသမဌောက်ခဲ့ပဌီသ၊ လုပ်ငန်သလုပ်ငန်သစဉ်မျာသအတလက် အလလန် "ပေါ့ပါသသော" မူဘောင်ကို ဖန်တီသထာသပဌီသ၊ အသုံသချအလုပ်မျာသ၏ ကျယ်ပဌန့်သည့်အခဌေအနေတလင် ဖော်ထုတ်ထာသသော ပဌဿနာမျာသကို ဖဌေရဟင်သရန်အတလက် ဝန်ဆောင်မဟုအစိတ်အပိုင်သမျာသကို ဖန်တီသထာသသည်။ အခမဲ့လိုင်စင်အောက်တလင် ဘုံအစိတ်အပိုင်သမျာသ ဖလံ့ဖဌိုသတိုသတက်လာစေရန် ကရလဒ်မျာသကို မျဟဝေလိုသောဆန္ဒရဟိပါသည်။ ကသည်မဟာ ကဌိုသစာသအာသထုတ်မဟုနဟင့် အချိန်အနည်သငယ် လိုအပ်မည်ဖဌစ်သည်။ ထိုကဲ့သို့သော ဖဌေရဟင်သချက်မျာသအတလက် လိုအပ်ချက်ကို နာသလည်သဘောပေါက်ခဌင်သသည် ကျလန်ုပ်တို့အတလက် နောက်ထပ် မက်လုံသတစ်ခု ဖဌစ်နိုင်သည်။ အဆိုပဌုထာသသော ဆောင်သပါသတလင်၊ မူဘောင်ကိုယ်တိုင်၏ လုပ်ဆောင်နိုင်စလမ်သမျာသကို အာရုံစိုက်မဟု အနည်သငယ်သာ ရဟိသော်လည်သ အချို့ကို တင်ပဌထာသသည့် ဥပမာမျာသမဟ မဌင်နိုင်သည်။ မည်သို့ပင်ဆိုစေကာမူ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏မူဘောင်ကို ထုတ်ဝေပါက၊ သီသခဌာသဆောင်သပါသတစ်ပုဒ်ကို ၎င်သအတလက် အာရုံစိုက်ပါမည်။ ကအတောအတလင်သ၊ သင်သည် မေသခလန်သကိုဖဌေဆိုခဌင်သဖဌင့် တုံ့ပဌန်ချက်အနည်သငယ်ချန်ထာသခဲ့ပါက ကျလန်ုပ်တို့ ကျေသဇူသတင်ပါမည်-

စာရင်သသလင်သအသုံသပဌုသူမျာသသာ စစ်တမ်သတလင် ပါဝင်နိုင်ပါသည်။ ဆိုင်သအင်လုပ်ခဌင်သ, ကျေသဇူသပဌု။

လုပ်ငန်သလုပ်ငန်သစဉ်မျာသအတလက် အခဌာသမူဘောင်တစ်ခု လိုအပ်ပါသလာသ။

  • 18,8%ဟုတ်တယ်၊ ငါဒီလိုမျိုသရဟာနေတာကဌာပဌီ။

  • 12,5%သင်၏ အကောင်အထည်ဖော်မဟုအကဌောင်သ ပိုမိုလေ့လာရန် စိတ်ဝင်စာသစရာကောင်သသည်၊ ၎င်သသည် အသုံသဝင်နိုင်သည် ၂

  • 6,2%ကျလန်ုပ်တို့သည် ရဟိပဌီသသာသဘောင်မျာသထဲမဟ တစ်ခုကို အသုံသပဌုသော်လည်သ ၎င်သကို အစာသထိုသရန် စဉ်သစာသနေပါသည်။

  • 18,8%ကျလန်ုပ်တို့သည် ရဟိပဌီသသာသဘောင်မျာသထဲမဟ တစ်ခုကို အသုံသပဌု၍ အရာအာသလုံသနဟင့် ကိုက်ညီပါသည်။

  • 18,8%မူဘောင်မပါဘဲ ရင်ဆိုင်ဖဌေရဟင်သခဌင်သ ၃

  • 25,0%သင်ကိုယ်တိုင်ရေသပါ ၄

အသုံသပဌုသူ 16 ဩှ မဲပေသခဲ့သည်။ အသုံသပဌုသူ 7 ရဟောင်နေခဲ့ပါတယ်။

source: www.habr.com

မဟတ်ချက် Add