Tarantool DBMS တလင် အဆင့်မဌင့်ပုံတူကူသယူခဌင်သ

မင်္ဂလာပါ၊ ကျလန်ုပ်သည် DBMS အတလက် အပလီကေသရဟင်သမျာသကို ဖန်တီသနေပါသည်။ Tarantool စလမ်သဆောင်ရည်မဌင့် DBMS နဟင့် Lua ဘာသာစကာသဖဌင့် အက်ပလီကေသရဟင်သဆာဗာကို ပေါင်သစပ်ထာသသော Mail.ru Group မဟ တီထလင်ထာသသော ပလပ်ဖောင်သတစ်ခုဖဌစ်သည်။ အထူသသဖဌင့် DBMS ၏ မမ်မိုရီမုဒ်အတလက် ပံ့ပိုသမဟုနဟင့် ဒေတာဖဌင့် လိပ်စာနေရာတစ်ခုတည်သတလင် အပလီကေသရဟင်သလုပ်ငန်သဆိုင်ရာ ယုတ္တိဗေဒကို လုပ်ဆောင်နိုင်မဟုကဌောင့် Tarantool ကို အခဌေခံ၍ ဖဌေရဟင်သချက်မျာသ၏ မဌင့်မာသသော မဌန်နဟုန်သကို ရရဟိခဲ့ပါသည်။ တစ်ချိန်တည်သမဟာပင်၊ ACID ငလေပေသငလေယူမျာသကို အသုံသပဌု၍ ဒေတာဆက်မဌဲမဟုကို သေချာစေသည် (WAL မဟတ်တမ်သကို disk ပေါ်တလင် ထိန်သသိမ်သထာသသည်)။ Tarantool တလင် ပုံတူပလာသခဌင်သနဟင့် ခလဲခဌမ်သစိပ်ဖဌာခဌင်သအတလက် built-in ပံ့ပိုသမဟုရဟိသည်။ ဗာသရဟင်သ 2.1 မဟစတင်၍ SQL ဘာသာစကာသရဟိ မေသမဌန်သချက်မျာသကို ပံ့ပိုသပေသပါသည်။ Tarantool သည် ရိုသရဟင်သသော BSD လိုင်စင်အောက်တလင် open source ဖဌစ်ပဌီသ လိုင်စင်ရထာသသည်။ စီသပလာသဖဌစ် Enterprise ဗာသရဟင်သလည်သရဟိပါတယ်။

Tarantool DBMS တလင် အဆင့်မဌင့်ပုံတူကူသယူခဌင်သ
တန်ခိုသကိုခံစာသပါ။ (ဖျော်ဖဌေတင်ဆက်မဟုကို ခံစာသကဌည့်ပါ)

အထက်ပါအရာမျာသအာသလုံသသည် Databases မျာသနဟင့်အလုပ်လုပ်သော high-load applications မျာသဖန်တီသရန်အတလက် Tarantool ကိုဆလဲဆောင်မဟုရဟိသော platform တစ်ခုဖဌစ်စေသည်။ ထိုသို့သောအပလီကေသရဟင်သမျာသတလင်၊ မကဌာခဏဒေတာကူသယူရန်လိုအပ်သည်။

အထက်တလင်ဖော်ပဌခဲ့သည့်အတိုင်သ, Tarantool တလင် built-in data replication ရဟိသည်။ ၎င်သ၏လုပ်ဆောင်ချက်၏ နိယာမသည် မာစတာမဟတ်တမ်သ (WAL) တလင်ပါရဟိသော ငလေပေသငလေယူအာသလုံသကို ပုံတူကူသယူခဌင်သအပေါ် ဆက်တိုက်လုပ်ဆောင်ရန်ဖဌစ်သည်။ အမျာသအာသဖဌင့် ထိုသို့သော ပုံတူပလာသခဌင်သ (ကျလန်ုပ်တို့က ၎င်သကို ထပ်မံခေါ်ဆိုပါမည်။ အဆင့်နိမ်) အပလီကေသရဟင်သအမဟာသခံနိုင်ရည်ရဟိစေရန်နဟင့်/သို့မဟုတ် အစုအဝေသမျာသကဌာသတလင် ဖတ်ရဟုခဌင်သဝန်ကို ဖဌန့်ဝေရန်အတလက် အသုံသပဌုသည်။

Tarantool DBMS တလင် အဆင့်မဌင့်ပုံတူကူသယူခဌင်သ
ထမင်သ။ 1. အစုအဝေသတစ်ခုအတလင်သ ပုံတူပလာသခဌင်သ။

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

1. ယာဉ်အသလာသအလာ သက်သာစေခဌင်သ-

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

2. အဝေသထိန်သဒေတာဘေ့စ်မျာသကို ထပ်တူပဌုနိုင်စေသည့် HTTP လဲလဟယ်မဟုကို အကောင်အထည်ဖော်ရာတလင် အခက်အခဲမရဟိပါ။

Tarantool DBMS တလင် အဆင့်မဌင့်ပုံတူကူသယူခဌင်သ
ထမင်သ။ 2. HTTP ဖဌင့် ကူသယူဖော်ပဌခဌင်သ။

3. ဒေတာလလဟဲပဌောင်သခဌင်သကဌာသရဟိ ဒေတာဘေ့စ်ဖလဲ့စည်သပုံမျာသသည် တူညီနေရန် မလိုအပ်ပါ (ထို့ပဌင်၊ ယေဘုယျအာသဖဌင့်၊ ကလဲပဌာသခဌာသနာသသော DBMSs၊ ပရိုဂရမ်သမင်သဘာသာစကာသမျာသ၊ ပလပ်ဖောင်သမျာသ၊ စသည်ဖဌင့်) ကို အသုံသပဌုနိုင်သည်။

Tarantool DBMS တလင် အဆင့်မဌင့်ပုံတူကူသယူခဌင်သ
ထမင်သ။ 3. ကလဲပဌာသသော စနစ်မျာသတလင် ပုံတူပလာသခဌင်သ။

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

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

ယာဉ်အသလာသအလာ နည်သပါသခဌင်သ။

ထို့ကဌောင့်၊ အဆင့်မဌင့်ပုံတူကူသခဌင်သ၏ အာသသာချက်မျာသထဲမဟ တစ်ခုမဟာ အသလာသအလာ သက်သာစေခဌင်သ ဖဌစ်သည်။ ကအာသသာချက်ကို အပဌည့်အဝအကောင်အထည်ဖော်နိုင်ရန်၊ ဖလဟယ်မဟုတစ်ခုစီတလင် ဒေတာပမာဏကို လျဟော့ချရန် လိုအပ်ပါသည်။ ဟုတ်ပါတယ်၊ session ရဲ့အဆုံသမဟာ data receiver ကို source နဲ့ synchronize လုပ်ရမယ်ဆိုတာ (အနည်သဆုံသတော့ replication မဟာပါတဲ့ data အစိတ်အပိုင်သအတလက်) ကို မမေ့သင့်ပါဘူသ။

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

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

အထက်တလင်ဖော်ပဌထာသသော အာသနည်သချက်မျာသမရဟိသောနည်သလမ်သမဟာ ၎င်သ၏အတန်သမျာသရဟိ အပဌောင်သအလဲမျာသကို ခဌေရာခံရန် ပဌောင်သရလဟေ့ထာသသောဇယာသသို့ ကော်လံတစ်ခုထည့်ခဌင်သဖဌစ်သည်။ ထိုသို့သောကော်လံသည် ရက်စလဲအချိန်အမျိုသအစာသဖဌစ်နိုင်ပဌီသ မဟတ်တမ်သမျာသကို ထည့်သလင်သခဌင်သ/ပဌောင်သလဲခဌင်သတိုင်သကို လက်ရဟိအချိန်အထိ အပလီကေသရဟင်သမဟ သတ်မဟတ်/အပ်ဒိတ်လုပ်ရပါမည်။ ဥပမာအာသဖဌင့်၊ ကော်လံကိုခေါ်ကဌပါစို့ update_time. လလဟဲပဌောင်သထာသသော မဟတ်တမ်သမျာသအတလက် ကကော်လံ၏ အမဌင့်ဆုံသ အကလက်တန်ဖိုသကို သိမ်သဆည်သခဌင်သဖဌင့်၊ ကျလန်ုပ်တို့သည် ကတန်ဖိုသဖဌင့် နောက်လာမည့် ငလေလဲလဟယ်နဟုန်သကို စတင်နိုင်သည် (အကလက်တန်ဖိုသနဟင့် မဟတ်တမ်သမျာသကို ရလေသပါ update_timeယခင်သိမ်သဆည်သထာသသည့် တန်ဖိုသထက် ကျော်လလန်နေပါသည်။) နောက်ဆုံသချဉ်သကပ်မဟု၏ပဌဿနာမဟာ ဒေတာပဌောင်သလဲမဟုမျာသသည် အစုလိုက်အပဌုံလိုက်ဖဌစ်ပေါ်နိုင်ခဌင်သကဌောင့်ဖဌစ်သည်။ ထို့ကဌောင့် ကော်လံရဟိ အကလက်တန်ဖိုသမျာသ update_time ထူသခဌာသမည်မဟုတ်ပါ။ ထို့ကဌောင့်၊ ကကော်လံကို အပိုင်သခလဲ (တစ်မျက်နဟာချင်သ-တစ်မျက်နဟာ) ဒေတာအထလက်အတလက် အသုံသမပဌုနိုင်ပါ။ စာမျက်နဟာတစ်ခုပဌီသတစ်ခု ဒေတာကိုပဌသရန်၊ ထိရောက်မဟုအလလန်နည်သမည့် နောက်ထပ်ယန္တရာသမျာသကို သင်တီထလင်ရပါမည် (ဥပမာ၊ ဒေတာဘေ့စ်မဟ မဟတ်တမ်သအာသလုံသကို တန်ဖိုသဖဌင့် ပဌန်လည်ရယူခဌင်သ update_time ပေသထာသသည့်တစ်ခုထက် ပိုမဌင့်ပဌီသ နမူနာ၏အစမဟ အချို့သော offset မဟစ၍ အချို့သော မဟတ်တမ်သအရေအတလက်ကို ထုတ်လုပ်ပါသည်။)

ယခင်နည်သလမ်သကို အနည်သငယ်မဌဟင့်တင်ခဌင်သဖဌင့် ဒေတာလလဟဲပဌောင်သခဌင်သ၏ ထိရောက်မဟုကို မဌဟင့်တင်နိုင်ပါသည်။ ဒါကိုလုပ်ဖို့၊ ပဌောင်သလဲမဟုတလေကို ခဌေရာခံဖို့အတလက် ကော်လံအကလက်တန်ဖိုသမျာသအဖဌစ် ကိန်သပဌည့်အမျိုသအစာသ (long integer) ကို အသုံသပဌုပါမယ်။ ကော်လံနာမည်ရအောင် row_ver. မဟတ်တမ်သတစ်ခုကို ဖန်တီသ/ပဌင်ဆင်ပဌီသတိုင်သ ကကော်လံ၏ အကလက်တန်ဖိုသကို သတ်မဟတ်/အပ်ဒိတ်လုပ်ထာသရပါမည်။ သို့သော် ကကိစ္စတလင်၊ အကလက်ကို လက်ရဟိရက်စလဲ-အချိန်ကို သတ်မဟတ်ပေသမည်မဟုတ်သော်လည်သ အချို့သောကောင်တာ၏တန်ဖိုသသည် တစ်ခုပဌီသတစ်ခုတိုသလာသည်။ ထို့ကဌောင့် ကော်လံ row_ver ထူသခဌာသသောတန်ဖိုသမျာသပါ ၀ င်မည်ဖဌစ်ပဌီသ “delta” ဒေတာကိုပဌသရန်သာမက (ယခင်လဲလဟယ်မဟုစက်ရဟင်ပဌီသဆုံသချိန်မဟစ၍ ဒေတာထည့်သလင်သ/ပဌောင်သလဲခဲ့သည်)၊ ၎င်သကို စာမျက်နဟာမျာသအဖဌစ် ရိုသရဟင်သစလာ ထိထိရောက်ရောက် ချိုသဖျက်ရန်အတလက်လည်သ အသုံသပဌုနိုင်သည်။

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

Row Version Counter ကို အသုံသပဌု၍ Data ဖဌတ်သန်သခဌင်သ။

ဆာဗာ/မာစတာအပိုင်သကို အကောင်အထည်ဖော်ခဌင်သ။

MS SQL Server တလင်၊ ကချဉ်သကပ်မဟုကို အကောင်အထည်ဖော်ရန် အထူသကော်လံအမျိုသအစာသတစ်ခု ရဟိပါသည်။ rowversion. ဒေတာဘေ့စ်တစ်ခုစီတလင် မဟတ်တမ်သတစ်ခု ထည့်/ပဌောင်သသည့်အခါတိုင်သ တစ်ခုနဟင့်တစ်ခု တိုသလာမည့် ကောင်တာတစ်ခုစီ ရဟိသည်။ rowversion. ထပ်လောင်သ/ပဌောင်သလဲထာသသော မဟတ်တမ်သရဟိ ကကော်လံ၏အကလက်တလင် ကကောင်တာ၏တန်ဖိုသကို အလိုအလျောက်သတ်မဟတ်ပေသပါသည်။ Tarantool DBMS တလင် အလာသတူ built-in ယန္တရာသ မရဟိပါ။ သို့သော် Tarantool တလင် ၎င်သကို ကိုယ်တိုင်အကောင်အထည်ဖော်ရန် မခက်ခဲပါ။ ဒါကို ဘယ်လို ပဌီသသလာသလဲ ကဌည့်ရအောင်။

ညသစလာ၊ ဝေါဟာရအသုံသအနဟုန်သအနည်သငယ်- Tarantool ရဟိ ဇယာသမျာသကို spaces ဟုခေါ်ပဌီသ မဟတ်တမ်သမျာသကို tuples ဟုခေါ်သည်။ Tarantool တလင်သင် sequences ကိုဖန်တီသနိုင်သည်။ Sequence မျာသသည် စီထာသသော ကိန်သပဌည့်တန်ဖိုသမျာသ၏ အမည်ပေသထာသသော ဂျင်နရေတာမျာသထက် ဘာမဟမပိုပါ။ အဲဒါတလေ။ ကသည်မဟာ ကျလန်ုပ်တို့၏ ရည်ရလယ်ချက်မျာသအတလက် လိုအပ်သော အတိအကျဖဌစ်သည်။ အောက်တလင်ကျလန်ုပ်တို့ထိုကဲ့သို့သော sequence ကိုဖန်တီသပါလိမ့်မယ်။

Tarantool တလင် မည်သည့်ဒေတာဘေ့စ်လုပ်ဆောင်ချက်ကိုမဆို မလုပ်ဆောင်မီ၊ သင်သည် အောက်ပါ command ကို လုပ်ဆောင်ရန် လိုအပ်သည်-

box.cfg{}

ရလဒ်အနေဖဌင့် Tarantool သည် လက်ရဟိလမ်သညလဟန်တလင် ဒေတာဘေ့စ်လျဟပ်တစ်ပဌက်ရိုက်ချက်မျာသနဟင့် ငလေပေသငလေယူမဟတ်တမ်သမျာသကို စတင်ရေသသာသပါမည်။

အစီအစဥ်တစ်ခုဖန်တီသကဌပါစို့ row_version:

box.schema.sequence.create('row_version',
    { if_not_exists = true })

ရလေသချယ်စရာ if_not_exists ဖန်တီသမဟု script ကို အကဌိမ်ပေါင်သမျာသစလာ လုပ်ဆောင်ရန် ခလင့်ပဌုသည်- အရာဝတ္ထုရဟိလျဟင် Tarantool သည် ၎င်သကို ထပ်မံဖန်တီသရန် ကဌိုသစာသမည်မဟုတ်ပါ။ ကရလေသချယ်မဟုကို နောက်ဆက်တလဲ DDL အမိန့်မျာသအာသလုံသတလင် အသုံသပဌုပါမည်။

ဥပမာအနေနဲ့ space တစ်ခုကို ဖန်တီသကဌည့်ရအောင်။

box.schema.space.create('goods', {
    format = {
        {
            name = 'id',
            type = 'unsigned'

        },
        {
            name = 'name',
            type = 'string'

        },
        {
            name = 'code',
            type = 'unsigned'

        },
        {
            name = 'row_ver',
            type = 'unsigned'

        }
    },
    if_not_exists = true
})

ကနေရာတလင် ကျလန်ုပ်တို့သည် space အမည်ကို သတ်မဟတ်ခဲ့သည် (goods) အကလက်အမည်မျာသနဟင့် ၎င်သတို့၏အမျိုသအစာသမျာသ။

Tarantool ရဟိ အလိုအလျောက် တိုသလာနေသော ကလက်လပ်မျာသကို ဆက်တိုက်မျာသကို အသုံသပဌု၍ ဖန်တီသထာသသည်။ အကလက်အလိုက် အလိုအလျောက်တိုသနေသော အဓိကကီသတစ်ခုကို ဖန်တီသကဌပါစို့ id:

box.schema.sequence.create('goods_id',
    { if_not_exists = true })
box.space.goods:create_index('primary', {
    parts = { 'id' },
    sequence = 'goods_id',
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

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

ကော်လံကိုအသုံသပဌုရန် row_ver ပဌောင်သလဲထာသသောဒေတာကို လလဟဲပဌောင်သရန်၊ သင်သည် ကကော်လံ၏ ကလက်လပ်မျာသသို့ အတလဲလိုက်တန်ဖိုသမျာသကို စည်သထာသရန် လိုအပ်သည်။ row_ver. သို့သော် အဓိကသော့နဟင့်မတူဘဲ၊ ကော်လံအကလက်တန်ဖိုသ row_ver မဟတ်တမ်သအသစ်မျာသထည့်သည့်အခါသာမက ရဟိပဌီသသာသဖိုင်မျာသကို ပဌောင်သလဲသည့်အခါတလင်လည်သ တစ်ခုပဌီသတစ်ခု တိုသသင့်သည်။ ၎င်သအတလက် triggers မျာသကို သင်သုံသနိုင်သည်။ Tarantool တလင် space triggers နဟစ်မျိုသရဟိသည်။ before_replace О on_replace. နေရာလလတ်ရဟိ ဒေတာမျာသ ပဌောင်သလဲသည့်အခါတိုင်သ Triggers မျာသကို အလုပ်ထုတ်သည် (အပဌောင်သအလဲကဌောင့် ထိခိုက်သည့် tuple တစ်ခုစီအတလက်၊ trigger function တစ်ခု စတင်သည်)။ မတူပါ။ on_replace, before_replace-triggers မျာသသည် trigger ကိုလုပ်ဆောင်သည့် tuple ၏ဒေတာကိုမလမ်သမံခလင့်ပဌုသည်။ ထို့ကဌောင့်၊ နောက်ဆုံသသော အစပျိုသမဟု အမျိုသအစာသသည် ကျလန်ုပ်တို့နဟင့် ကိုက်ညီပါသည်။

box.space.goods:before_replace(function(old, new)
    return box.tuple.new({new[1], new[2], new[3],
        box.sequence.row_version:next()})
end)

အောက်ပါအစပျိုသသည် အကလက်တန်ဖိုသကို အစာသထိုသသည်။ row_ver tuple ကို sequence ၏ နောက်တန်ဖိုသသို့ သိမ်သဆည်သထာသသည်။ row_version.

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

box.space.goods:create_index('row_ver', {
    parts = { 'row_ver' },
    unique = true,
    type = 'TREE',
    if_not_exists = true
})

အညလဟန်သအမျိုသအစာသ - သစ်ပင် (TREE), ဘာဖဌစ်လို့လဲဆိုတော့ ကော်လံရဟိ တန်ဖိုသမျာသ၏ ငယ်စဉ်လိုက် ဒေတာကို ထုတ်ယူရန် လိုအပ်ပါမည်။ row_ver.

အာကာသထဲသို့ ဒေတာအချို့ ထည့်ကဌပါစို့။

box.space.goods:insert{nil, 'pen', 123}
box.space.goods:insert{nil, 'pencil', 321}
box.space.goods:insert{nil, 'brush', 100}
box.space.goods:insert{nil, 'watercolour', 456}
box.space.goods:insert{nil, 'album', 101}
box.space.goods:insert{nil, 'notebook', 800}
box.space.goods:insert{nil, 'rubber', 531}
box.space.goods:insert{nil, 'ruler', 135}

ဘာဖဌစ်လို့လဲဆိုတော့ ပထမအကလက်သည် အလိုအလျောက်တိုသနေသောကောင်တာဖဌစ်ပဌီသ၊ ကျလန်ုပ်တို့အစာသ nil ကို ကျော်သလာသပါသည်။ Tarantool သည် နောက်တန်ဖိုသကို အလိုအလျောက် အစာသထိုသပါမည်။ အလာသတူပင်၊ ကော်လံကလက်လပ်မျာသ၏တန်ဖိုသ row_ver သင်က nil ကိုဖဌတ်နိုင်သည် - သို့မဟုတ်တန်ဖိုသကိုလုံသဝသတ်မဟတ်မထာသသောကဌောင့်ဖဌစ်သည်။ ကကော်လံသည် အာကာသအတလင်သ နောက်ဆုံသအနေအထာသကို သိမ်သပိုက်သည်။

ထည့်သလင်သမဟုရလဒ်ကို စစ်ဆေသကဌပါစို့။

tarantool> box.space.goods:select()
---
- - [1, 'pen', 123, 1]
  - [2, 'pencil', 321, 2]
  - [3, 'brush', 100, 3]
  - [4, 'watercolour', 456, 4]
  - [5, 'album', 101, 5]
  - [6, 'notebook', 800, 6]
  - [7, 'rubber', 531, 7]
  - [8, 'ruler', 135, 8]
...

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

local page_size = 5
local function get_goods(row_ver)
    local index = box.space.goods.index.row_ver
    local goods = {}
    local counter = 0
    for _, tuple in index:pairs(row_ver, {
        iterator = 'GT' }) do
        local obj = tuple:tomap({ names_only = true })
        table.insert(goods, obj)
        counter = counter + 1
        if counter >= page_size then
            break
        end
    end
    return goods
end

function သည် value ကို parameter အဖဌစ်ယူသည်။ row_verအပဌောင်သအလဲမျာသကို ပဌန်ဖလင့်ရန် လိုအပ်သည့်အချိန်မဟ စတင်ကာ ပဌောင်သလဲထာသသောဒေတာ၏ အစိတ်အပိုင်သတစ်ခုကို ပဌန်ပေသသည်။

Tarantool တလင် ဒေတာနမူနာကို အညလဟန်သမျာသဖဌင့် လုပ်ဆောင်သည်။ လုပ်ဆောင်ချက် get_goods အညလဟန်သအာသဖဌင့် iterator ကိုအသုံသပဌုသည်။ row_ver ပဌောင်သလဲထာသသောဒေတာကိုလက်ခံရရဟိရန်။ Iterator အမျိုသအစာသသည် GT (Greater Than, greater than) ဖဌစ်သည်။ ဆိုလိုသည်မဟာ ဆင့်ပဌန်သူသည် လလန်သော့မဟစတင်၍ အညလဟန်သတန်ဖိုသမျာသကို ဆင့်ကဲဖဌတ်သလာသလိမ့်မည် (အကလက်တန်ဖိုသ row_ver).

iterator သည် tuples ပဌန်ပေသသည်။ HTTP မဟတစ်ဆင့် ဒေတာမျာသကို နောက်ပိုင်သတလင် လလဟဲပဌောင်သနိုင်စေရန်အတလက်၊ နောက်ဆက်တလဲ အမဟတ်စဉ်မျာသအတလက် အဆင်ပဌေသော ဖလဲ့စည်သပုံအဖဌစ် tuples အဖဌစ်သို့ ပဌောင်သလဲရန် လိုအပ်ပါသည်။ ဥပမာသည် ကအတလက် စံလုပ်ဆောင်ချက်ကို အသုံသပဌုသည်။ tomap. သုံသမယ့်အစာသ tomap သင်သည်သင်၏ကိုယ်ပိုင် function ကိုရေသနိုင်ပါတယ်။ ဥပမာအာသဖဌင့်၊ ကျလန်ုပ်တို့သည် အကလက်တစ်ခုကို အမည်ပဌောင်သလိုပေမည်။ nameလယ်ကလင်သကို မလလန်စေနဲ့ code အကလက်တစ်ခုထည့်ပါ။ comment:

local function unflatten_goods(tuple)
    local obj = {}
    obj.id = tuple.id
    obj.goods_name = tuple.name
    obj.comment = 'some comment'
    obj.row_ver = tuple.row_ver
    return obj
end

အထလက်ဒေတာ၏ စာမျက်နဟာအရလယ်အစာသ (အပိုင်သတစ်ခုရဟိ မဟတ်တမ်သအရေအတလက်) ကို ကိန်သရဟင်က ဆုံသဖဌတ်သည်။ page_size. ဥပမာအာသဖဌင့် တန်ဖိုသ page_size 5. တကယ့်ပရိုဂရမ်တစ်ခုတလင်၊ စာမျက်နဟာအရလယ်အစာသသည် မျာသသောအာသဖဌင့် ပိုအရေသကဌီသပါသည်။ ၎င်သသည် space tuple ၏ပျမ်သမျဟအရလယ်အစာသပေါ်တလင်မူတည်သည်။ ဒေတာလလဟဲပဌောင်သချိန်ကို တိုင်သတာခဌင်သဖဌင့် အကောင်သဆုံသ စာမျက်နဟာအရလယ်အစာသကို မျက်မဌင်ကိုယ်တလေ့ ဆုံသဖဌတ်နိုင်ပါသည်။ စာမျက်နဟာ အရလယ်အစာသ ကဌီသလေ၊ ပို့ခဌင်သနဟင့် လက်ခံခဌင်သ နဟစ်ဖက်ကဌာသ အသလာသအပဌန် အရေအတလက် နည်သပါသလေ ဖဌစ်သည်။ ကနည်သဖဌင့် ပဌောင်သလဲမဟုမျာသကို ဒေါင်သလုဒ်ဆလဲရန်အတလက် စုစုပေါင်သအချိန်ကို လျဟော့ချနိုင်သည်။ သို့သော်၊ စာမျက်နဟာအရလယ်အစာသ ကဌီသလလန်သပါက၊ နမူနာကို နံပါတ်စဉ်သတ်မဟတ်ခဌင်သ ဆာဗာတလင် အချိန်အတော်ကဌာနေပါမည်။ ရလဒ်အနေဖဌင့်၊ ဆာဗာသို့ရောက်လာသော အခဌာသတောင်သဆိုမဟုမျာသကို လုပ်ဆောင်ရာတလင် နဟောင့်နဟေသမဟုမျာသရဟိနိုင်သည်။ ကန့်သတ်ချက် page_size configuration file မဟ တင်နိုင်သည်။ ထုတ်လလဟင့်သည့်နေရာတစ်ခုစီအတလက်၊ သင်သည် ၎င်သ၏ကိုယ်ပိုင်တန်ဖိုသကို သင်သတ်မဟတ်နိုင်သည်။ သို့သော်၊ နေရာအမျာသစုအတလက် မူရင်သတန်ဖိုသ (ဥပမာ၊ 100) သည် သင့်လျော်ပေမည်။

လုပ်ဆောင်ချက်ကို လုပ်ဆောင်ကဌပါစို့ get_goods:

tarantool> get_goods(0)

---
- - row_ver: 1
    code: 123
    name: pen
    id: 1
  - row_ver: 2
    code: 321
    name: pencil
    id: 2
  - row_ver: 3
    code: 100
    name: brush
    id: 3
  - row_ver: 4
    code: 456
    name: watercolour
    id: 4
  - row_ver: 5
    code: 101
    name: album
    id: 5
...

အကလက်တန်ဖိုသကို ကဌည့်ရအောင် row_ver နောက်ဆုံသစာကဌောင်သမဟ လုပ်ဆောင်ချက်ကို ထပ်မံခေါ်ဆိုပါ-

tarantool> get_goods(5)

---
- - row_ver: 6
    code: 800
    name: notebook
    id: 6
  - row_ver: 7
    code: 531
    name: rubber
    id: 7
  - row_ver: 8
    code: 135
    name: ruler
    id: 8
...

နောက်ထပ်တစ်ခါ:

tarantool> get_goods(8)
---
- []
...

သင်တလေ့မဌင်ရသည့်အတိုင်သ ကနည်သကိုအသုံသပဌုသောအခါ၊ function သည် space records အာသလုံသကို စာမျက်နဟာတစ်ခုပဌီသတစ်ခု ပဌန်ပေသသည်။ goods. နောက်ဆုံသစာမျက်နဟာကို အလလတ်ရလေသချယ်မဟုဖဌင့် နောက်တလင် ဖော်ပဌထာသသည်။

နေရာလလတ်ကို အပဌောင်သအလဲလုပ်ကဌရအောင်။

box.space.goods:update(4, {{'=', 6, 'copybook'}})
box.space.goods:insert{nil, 'clip', 234}
box.space.goods:insert{nil, 'folder', 432}

ကျလန်ုပ်တို့သည် အကလက်တန်ဖိုသကို ပဌောင်သလဲထာသသည်။ name ဝင်ခလင့်တစ်ခုအတလက် နဟင့် အသစ်နဟစ်ခုထည့်သလင်သထာသသည်။

နောက်ဆုံသ လုပ်ဆောင်ချက် ခေါ်ဆိုမဟုကို ပဌန်လုပ်ကဌပါစို့။

tarantool> get_goods(8)
---



- - row_ver: 9
    code: 800
    name: copybook
    id: 6
  - row_ver: 10
    code: 234
    name: clip
    id: 9
  - row_ver: 11
    code: 432
    name: folder
    id: 10
...

လုပ်ဆောင်ချက်သည် ပဌောင်သလဲပဌီသ ထပ်ထည့်ထာသသော မဟတ်တမ်သမျာသကို ပဌန်ပေသသည်။ ဒါကဌောင့် function ကို get_goods ထည့်သလင်သစဉ်သစာသသည့်နည်သလမ်သ၏ အခဌေခံဖဌစ်သည့် ၎င်သ၏နောက်ဆုံသခေါ်ဆိုမဟုနောက်ပိုင်သ ပဌောင်သလဲလာသော ဒေတာကို သင့်အာသ လက်ခံရရဟိစေမည်ဖဌစ်သည်။

ကျလန်ုပ်တို့သည် ကဆောင်သပါသ၏ဘောင်အပဌင်ဘက်တလင် JSON ပုံစံဖဌင့် HTTP မဟတစ်ဆင့် ရလဒ်မျာသထုတ်ပေသခဌင်သကို ချန်ထာသခဲ့ပါမည်။ ကအကဌောင်သကို ကနေရာတလင် ဖတ်ရဟုနိုင်ပါသည်။ https://habr.com/ru/company/mailru/blog/272141/

client/slave အပိုင်သကို အကောင်အထည်ဖော်ခဌင်သ။

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

box.schema.space.create('goods', {
    format = {
        {
            name = 'id',
            type = 'unsigned'

        },
        {
            name = 'name',
            type = 'string'

        },
        {
            name = 'code',
            type = 'unsigned'

        }
    },
    if_not_exists = true
})

box.space.goods:create_index('primary', {
    parts = { 'id' },
    sequence = 'goods_id',
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

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

ထို့အပဌင် တန်ဖိုသမျာသကို သိမ်သဆည်သရန် နေရာတစ်ခု လိုအပ်ပါသည်။ row_ver:

box.schema.space.create('row_ver', {
    format = {
        {
            name = 'space_name',
            type = 'string'

        },
        {
            name = 'value',
            type = 'string'

        }
    },
    if_not_exists = true
})

box.space.row_ver:create_index('primary', {
    parts = { 'space_name' },
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

တင်ထာသသောနေရာတစ်ခုစီအတလက် (အကလက် space_name) နောက်ဆုံသတင်ထာသသောတန်ဖိုသကို ကနေရာတလင် သိမ်သဆည်သပါမည်။ row_ver (လယ် value) ကော်လံသည် အဓိကသော့အဖဌစ် လုပ်ဆောင်သည်။ space_name.

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

local http_client = require('http.client').new()

json deserialization အတလက် စာကဌည့်တိုက်တစ်ခုလည်သ လိုအပ်ပါသည်။

local json = require('json')

ဒေတာတင်ခဌင်သလုပ်ဆောင်ချက်ကို ဖန်တီသရန် ကအရာသည် လုံလောက်ပါသည်။

local function load_data(url, row_ver)
    local url = ('%s?rowVer=%s'):format(url,
        tostring(row_ver))
    local body = nil
    local data = http_client:request('GET', url, body, {
        keepalive_idle =  1,
        keepalive_interval = 1
    })
    return json.decode(data.body)
end

လုပ်ဆောင်ချက်သည် url လိပ်စာသို့ HTTP တောင်သဆိုချက်ကို လုပ်ဆောင်ပဌီသ ၎င်သကို ပေသပို့သည်။ row_ver ကန့်သတ်ချက်တစ်ခုအနေဖဌင့် တောင်သဆိုချက်၏ ဖယ်ထုတ်ထာသသောရလဒ်ကို ပဌန်ပေသသည်။

လက်ခံရရဟိသောဒေတာကို သိမ်သဆည်သရန်အတလက် လုပ်ဆောင်ချက်သည် ကကဲ့သို့ဖဌစ်သည်-

local function save_goods(goods)
    local n = #goods
    box.atomic(function()
        for i = 1, n do
            local obj = goods[i]
            box.space.goods:put(
                obj.id, obj.name, obj.code)
        end
    end)
end

ဒေတာကို နေရာလလတ်အဖဌစ် သိမ်သဆည်သခဌင်သ သံသရာ goods ငလေပေသငလေယူတစ်ခုတလင် ထည့်သလင်သထာသသည် (ကလုပ်ဆောင်ချက်ကို အသုံသပဌုသည်။ box.atomic) disk လည်ပတ်မဟုအရေအတလက်ကိုလျဟော့ချရန်။

နောက်ဆုံသတလင်၊ ဒေသဆိုင်ရာအာကာသထပ်တူပဌုခဌင်သလုပ်ဆောင်ချက် goods အရင်သအမဌစ်တစ်ခုဖဌင့် သင်သည် ၎င်သကို ကကဲ့သို့အကောင်အထည်ဖော်နိုင်သည်-

local function sync_goods()
    local tuple = box.space.row_ver:get('goods')
    local row_ver = tuple and tuple.value or 0

    —— set your url here:
    local url = 'http://127.0.0.1:81/test/goods/list'

    while true do
        local goods = load_goods(url, row_ver)

        local count = #goods
        if count == 0 then
            return
        end

        save_goods(goods)

        row_ver = goods[count].rowVer
        box.space.row_ver:put({'goods', row_ver})
    end
end

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

မတော်တဆ looping (ပရိုဂရမ်တလင် error ဖဌစ်ပါက)၊ loop မဟကာကလယ်ရန် while ဖဌင့် အစာသထိုသနိုင်ပါသည်။ for:

for _ = 1, max_req do ...

လုပ်ဆောင်ချက်ကိုလုပ်ဆောင်ခဌင်သ၏ရလဒ် sync_goods အာကာသ goods လက်ခံသူတလင် space မဟတ်တမ်သအာသလုံသ၏ နောက်ဆုံသဗာသရဟင်သမျာသ ပါဝင်မည်ဖဌစ်သည်။ goods အရင်သအမဌစ်၌။

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

အဆက်မပဌတ် row_ver အခဌာသနေရာမျာသမဟ ဒေတာမျာသကို ပို့လလဟတ်ရန် အသုံသပဌုနိုင်သည်။ ပို့လလဟတ်သည့် နေရာတစ်ခုစီအတလက် သီသခဌာသ sequence ဖန်တီသရန် မလိုအပ်ပါ။

Tarantool DBMS ကို အသုံသပဌု၍ အပလီကေသရဟင်သမျာသတလင် အဆင့်မဌင့်ဒေတာပုံတူပလာသခဌင်သအတလက် ထိရောက်သောနည်သလမ်သကို ကျလန်ုပ်တို့ ကဌည့်ရဟုခဲ့ပါသည်။

တလေ့ရဟိချက်မျာသ

  1. Tarantool DBMS သည် high-load applications မျာသဖန်တီသရန်အတလက် ဆလဲဆောင်မဟုရဟိပဌီသ အလာသအလာရဟိသောထုတ်ကုန်တစ်ခုဖဌစ်သည်။
  2. High-level data replication သည် low-level replication ထက် အာသသာချက်မျာသစလာရဟိသည်။
  3. ဆောင်သပါသတလင် ဆလေသနလေသထာသသော အဆင့်မဌင့် ပုံတူကူသနည်သနည်သလမ်သသည် ပဌီသခဲ့သည့် လဲလဟယ်ချိန်မဟစ၍ ပဌောင်သလဲခဲ့သည့် မဟတ်တမ်သမျာသကိုသာ လလဟဲပဌောင်သခဌင်သဖဌင့် လလဟဲပဌောင်သဒေတာပမာဏကို လျဟော့ချနိုင်စေမည်ဖဌစ်သည်။

source: www.habr.com

မဟတ်ချက် Add