Ku celcelinta heerka sare ee Tarantool DBMS

Hello, waxaan u abuurayaa codsiyada DBMS Tarantool waa madal ay samaysay Kooxda Mail.ru oo isku daraysa DBMS wax qabad sare leh iyo adeegaha codsiyada luqadda Lua. Xawaaraha sare ee xalalka ku salaysan Tarantool ayaa la gaaraa, gaar ahaan, sababtoo ah taageerada habka xusuusta ee DBMS iyo awoodda lagu fulinayo macquulka ganacsiga codsiga ee meel ciwaan ah oo leh xog. Isla mar ahaantaana, joogteynta xogta ayaa la hubiyaa iyadoo la isticmaalayo macaamilka ACID (log WAL ayaa lagu hayaa saxanka). Tarantool waxay leedahay taageero ku dhisan ku-noqoshada iyo jeexid. Laga bilaabo nooca 2.1, weydiimaha luqadda SQL waa la taageerayaa. Tarantool waa il furan oo shati ku leh shatiga BSD la fududeeyay. Waxa kale oo jira nooca Enterprise ganacsi.

Ku celcelinta heerka sare ee Tarantool DBMS
Dareen awoodda! (...ka raaxayso bandhigga)

Dhammaan kuwan kor ku xusan waxay Tarantool ka dhigayaan goob soo jiidasho leh oo loogu talagalay abuurista codsiyo culus oo la shaqeeya xog-ururinta. Codsiyada noocaan ah, inta badan waxaa jira baahi loo qabo ku celcelinta xogta.

Sida kor ku xusan, Tarantool waxay leedahay ku-celinta xogta. Mabda'a hawl-galkeedu waa in ay si isdaba joog ah u fuliso nuqul ka mid ah dhammaan wax kala iibsiga ka kooban Master log (WAL). Caadiyan ku celcelinta noocan oo kale ah (waxaanu sii wici doonaa heer hoose) waxa loo isticmaalaa si loo hubiyo dulqaadka qaladka codsiga iyo/ama in lagu qaybiyo culayska wax akhriska inta u dhaxaysa qanjirada kutlada

Ku celcelinta heerka sare ee Tarantool DBMS
Bariis 1. Ku celcelinta kutlada dhexdeeda

Tusaalaha dhacdo kale ayaa ah wareejinta xogta lagu abuuray kaydka kaydka xogta xogta kale ee habaynta/kormeerka. Xaaladda dambe, xal ku habboon ayaa laga yaabaa in la isticmaalo heer sare ku celcelinta - ku celcelinta xogta ee heerka macquulka ganacsiga codsiga. Kuwaas. Ma isticmaalno xal diyaarsan oo lagu dhex dhisay DBMS, laakiin waxaan ku dhaqan galinaa ku celcelinta anaga oo ku jira codsiga aanu horumarinayno. Habkani wuxuu leeyahay faa'iidooyin iyo faa'iido darro labadaba. Aynu taxno faa'iidooyinka.

1. Kaydinta gaadiidka:

  • Ma wareejin kartid dhammaan xogta, laakiin kaliya qayb ka mid ah (tusaale, waxaad ku wareejin kartaa miisaska qaarkood, qaar ka mid ah tiirarkooda ama diiwaanka buuxinaya shuruudo gaar ah);
  • Si ka duwan ku celcelinta heerka hoose, kaas oo si joogto ah loogu sameeyo asynchronous (oo lagu fuliyay nooca hadda ee Tarantool - 1.10) ama synchronous (in lagu hirgeliyo noocyada soo socda ee Tarantool), ku celcelinta heerka sare waxaa lagu samayn karaa fadhiyada (ie, Codsigu wuxuu marka hore isku dhejiyaa xogta - xogta fadhiga sarrifka, ka dibna waxaa jira hakad ku celcelinta, ka dib fadhiga xiga ee sarrifka ayaa dhacaya, iwm.);
  • haddii diiwaanku dhowr jeer isbeddelay, waxaad wareejin kartaa oo keliya noockiisii ​​ugu dambeeyay (oo ka duwan ku celcelinta heerka hoose, taas oo dhammaan isbeddellada lagu sameeyay sayidku ay si isdaba joog ah dib ugu ciyaari doonaan nuqullada).

2. Ma jiraan wax dhib ah oo ku saabsan hirgelinta HTTP beddelka, taas oo kuu ogolaanaysa inaad isku dhejiso xogta fog.

Ku celcelinta heerka sare ee Tarantool DBMS
Bariis 2. Ku celcelinta HTTP

3. Qaab dhismeedka xogta ee u dhexeeya xogta la wareejiyo maaha inay isku mid noqdaan (sidoo kale, kiiska guud, xitaa waa suurtogal in la isticmaalo DBMS-yada kala duwan, luqadaha barnaamijyada, aaladaha, iwm.).

Ku celcelinta heerka sare ee Tarantool DBMS
Bariis 3. Ku-noqoshada hababka kala duwan

Hoos-u-dhacu waa in, celcelis ahaan, barnaamijyadu aad uga dhib badan yihiin / ka qaalisan yihiin qaabeynta, iyo halkii aad ka beddeli lahayd shaqeynta la dhisay, waa inaad adigu hirgelisaa.

Haddii xaaladdaada faa'iidooyinka kor ku xusan ay yihiin kuwo muhiim ah (ama ay yihiin xaalad lagama maarmaan ah), markaa waxaa macno leh in la isticmaalo ku celcelin heer sare ah. Aynu eegno dhowr siyaabood oo lagu hirgeliyo ku-celinta xogta heerka sare ee Tarantool DBMS.

Yaraynta gaadiidka

Markaa, mid ka mid ah faa'iidooyinka ku-noqoshada heerka sare waa kaydinta taraafikada. Si faa'iidadan si buuxda loo xaqiijiyo, waxaa lagama maarmaan ah in la yareeyo tirada xogta la wareejiyay inta lagu jiro kalfadhi kasta oo sarrifka ah. Dabcan, waa in aynaan iloobin in dhamaadka fadhiga, xogta qaataha ay tahay in la waafajiyo isha (ugu yaraan qaybtaas xogta ku lug leh soo-celinta).

Sidee loo yareeyaa cadadka xogta la wareejiyay inta lagu jiro ku celcelinta heerka sare? Xalka tooska ah wuxuu noqon karaa in lagu xusho xogta taariikhda iyo waqtiga. Si tan loo sameeyo, waxaad isticmaali kartaa goobta taariikhda-waqtiga ee horeba ugu jirtay shaxda (haddii ay jirto). Tusaale ahaan, dukumeentiga "dalabka" waxaa laga yaabaa inuu lahaado goob "waqtiga fulinta amarka loo baahan yahay" - delivery_time. Dhibaatada xalkan ayaa ah in qiyamka goobtan aysan ahayn inay noqdaan kuwo isku xiga oo u dhigma abuurista amarrada. Markaa ma xasuusan karno qiimaha ugu badan ee goobta delivery_time, la kala qaado inta lagu guda jiro kalfadhigii hore ee sarrifka, iyo inta lagu jiro kalfadhiga sarrifka ee xiga dooro dhammaan diiwaanada leh qiimaha sare ee goobta delivery_time. Diiwaanada leh qiimaha hoose ee goobta ayaa laga yaabaa in lagu daray inta u dhaxaysa kalfadhiyada sarrifka delivery_time. Sidoo kale, amarka ayaa laga yaabaa inuu isbedelo, taas oo si kastaba ha ahaatee aan saameyn ku yeelan garoonka delivery_time. Labada xaaladoodba, isbeddellada lagama wareejin doono meesha loo socdo. Si loo xalliyo dhibaatooyinkan, waxaan u baahan doonaa inaan wareejino xogta "isku-darka". Kuwaas. Kulan kasta oo sarrifka ah waxaan ku wareejin doonaa dhammaan xogta qiimaha goobta delivery_time, dhaaftay waqti hore (tusaale, N saacadood laga bilaabo wakhtigan xaadirka ah). Si kastaba ha ahaatee, way caddahay in nidaamyada waaweyn habkani uu yahay mid aad u dhib badan oo yarayn kara kaydka gaadiidka ee aan ku dadaaleyno inaan waxba jirin. Intaa waxa dheer, miiska la wareejinayaa waxa laga yaabaa in aanu lahayn goob la xidhiidha taariikh-wakhti.

Xalka kale, oo aad uga adag xagga fulinta, waa in la qiro helitaanka xogta. Xaaladdan oo kale, inta lagu jiro kalfadhi kasta oo sarrifka, dhammaan xogta waa la gudbiyaa, rasiidka kaas oo aan la xaqiijinin qaataha. Si taas loo hirgeliyo, waxaad u baahan doontaa inaad ku darto tiir Boolean miiska isha (tusaale ahaan, is_transferred). Haddii qaataha uu qirto risiidhka diiwaanka, goobta u dhiganta ayaa qaadanaysa qiimaha true, ka dib markaa soo galitaanku kuma sii jiro wax beddelka. Doorashadan hirgelinta waxay leedahay faa'iido darrada soo socota. Marka hore, diiwaan kasta oo la wareejiyo, qirasho waa in la sameeyaa oo la diraa. Qiyaastii marka la hadlo, tani waxay la mid noqon kartaa labanlaabinta tirada xogta la wareejiyay oo horseedaysa labanlaab tirada wareegyada. Marka labaad, ma jirto wax suurtagal ah in loo diro rikoor isku mid ah dhowr qof oo qaata (qaataha ugu horreeya ee helaya wuxuu xaqiijin doonaa rasiidka laftiisa iyo dhammaan kuwa kale).

Habka aan lahayn faa'iido darrada kor lagu sheegay waa in lagu daro tiir miiska la kala qaado si loola socdo isbeddellada safkiisa. Tiirka noocaan oo kale ah wuxuu noqon karaa nooca-waqtiga-taariikhda waana in lagu dajiyaa/cusbooneysiiyaa arjiga ilaa waqtigan xaadirka ah mar kasta oo diiwaanada lagu daro/labadalo (atomically iyadoo la kordhinayo/isbeddelka). Tusaale ahaan, aynu wac tiirka update_time. Anoo kaydinaya qiimaha goobta ugu badan ee tiirkan ee diiwaanada la wareejiyay, waxaan ku bilaabi karnaa fadhiga xiga ee sarrifka qiimahan (dooro diiwaanada leh qiimaha goobta update_time, dhaaftay qiimihii hore loo kaydiyay). Dhibaatada habka dambe ayaa ah in isbeddelada xogta ay ku dhici karaan dufcadaha. Natiijada qiyamka goobta ee tiirka update_time ma noqon karto mid gaar ah. Haddaba, tiirkan looma isticmaali karo wax-soo-saarka xogta (bog-bog-bog). Si aad u muujiso bogga xogta, waa inaad abuurto habab dheeraad ah oo ay u badan tahay inay lahaan karaan waxtarkoodu aad u hooseeyo (tusaale ahaan, ka soo saarida xogta dhammaan diiwaannada qiimaha leh update_time ka sarreeya mid la bixiyay oo soo saaraya tiro cayiman oo diiwaanno ah, laga bilaabo qayb ka mid ah bilowga muunadda).

Waxaad hagaajin kartaa waxtarka wareejinta xogta adiga oo waxoogaa hagaajinaya habkii hore. Si tan loo sameeyo, waxaan u isticmaali doonaa nooca isugeynta (integer-ka dheer) sida qiyamka goobta tiirka ee isbeddelada la socodka. Aan magacaw tiirka row_ver. Qiimaha goobta tiirkan waa in wali la dejiyaa/la cusboonaysiiyaa mar kasta oo diiwaan la sameeyo/wax laga beddelo. Laakiin kiiskan, goobta laguma meelayn doono taariikhda-waqtiga hadda, laakiin qiimaha qaar ka mid ah counter, ayaa kordhay mid. Natiijo ahaan, tiirka row_ver waxay ka koobnaan doontaa qiyam gaar ah waxaana loo isticmaali karaa ma aha oo kaliya in lagu muujiyo xogta "delta" (xogta lagu daray / la beddelay tan iyo dhammaadkii kalfadhigii hore ee sarrifka), laakiin sidoo kale si fudud oo wax ku ool ah u jajabiso boggaga.

Habka ugu dambeeya ee la soo jeediyay ee lagu yareynayo qadarka xogta lagu wareejiyay qaab dhismeedka ku celcelinta heerka sare waxay iila muuqataa midda ugu wanagsan oo caalami ah. Aynu si faahfaahsan u eegno.

Gudbinta Xogta Adiga oo Adeegsanaya Xisaabiyaha Nooca Safka ah

Hirgelinta qaybta server-ka/mastaradka

Gudaha MS SQL Server, waxaa jira nooc tiir gaar ah oo lagu hirgelinayo habkan - rowversion. Xog-ururin kastaa waxa ay leedahay xisaabiye kor u kaca mar kasta oo rikoodh lagu daro/la beddelo shax leh tiir sida rowversion. Qiimaha counter-kan waxaa si toos ah loogu meeleeyaa goobta tiirkan ee diiwaanka lagu daray/la beddelay. Tarantool DBMS ma laha qaab la mid ah oo la dhisay. Si kastaba ha ahaatee, Tarantool ma adka in si gacan ah loogu fuliyo. Aan eegno sida tan loo sameeyo.

Marka hore, ereybixin yar: miisaska Tarantool waxaa loo yaqaan meelo bannaan, diiwaannadana waxaa loo yaqaannaa tuples. Tarantool waxaad ku abuuri kartaa taxane. Taxanuhu waa wax aan ka badnayn koronto-dhaliyeyaasha la magacaabay ee qiyamka isugeynta la dalbaday. Kuwaas. Tani waa dhab ahaan waxa aan ugu baahanahay ujeedooyinkeena. Hoos waxaan abuuri doonaa isku xigxiga sida.

Kahor intaadan samaynin wax hawlgal ah oo kayd ah ee Tarantool, waxaad u baahan tahay inaad socodsiiso amarkan soo socda:

box.cfg{}

Natiijadu waxay tahay, Tarantool waxay bilaabi doontaa qorista xogta sawir-qaadista iyo diiwaannada wax kala iibsiga ee hagaha hadda.

Aynu abuurno taxane row_version:

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

Ikhtiyaar if_not_exists Waxay u ogolaataa qoraalka abuurista in la fuliyo dhowr jeer: haddii shaygu jiro, Tarantool iskuma dayi doono inuu mar kale sameeyo. Doorashadan waxaa loo isticmaali doonaa dhammaan amarrada DDL ee xiga.

Aan abuurno meel bannaan tusaale ahaan.

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

Halkan waxaan dejinay magaca booska (goods), Magacyada goobta iyo noocyadooda.

Goobaha otomaatiga ah ee kor u kaca ee Tarantool ayaa sidoo kale la abuuray iyadoo la adeegsanayo taxane. Aynu abuurno furaha aasaasiga ah oo si toos ah u kordhiya goob ahaan 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 waxay taageertaa dhowr nooc oo tusiyaal ah. Tusmooyinka inta badan la isticmaalo waa TREE iyo noocyada HASH, kuwaas oo ku salaysan qaab-dhismeedyo u dhigma magaca. GEEDKA waa nooca tusmada ugu kala duwan. Waxay kuu ogolaanaysaa inaad soo ceshato xogta si habaysan. Laakiin xulashada sinnaanta, HASH ayaa aad ugu habboon. Sidaa darteed, waxaa habboon in loo isticmaalo HASH furaha aasaasiga ah (taas oo ah waxa aan sameynay).

Si aad u isticmaasho tiirka row_ver Si aad u wareejiso xogta la beddelay, waxaad u baahan tahay inaad ku xidho qiyamka isku xigxiga ee qaybaha tiirkan row_ver. Laakiin si ka duwan furaha aasaasiga ah, qiimaha goobta tiirka row_ver waa in la kordhiyaa hal ma aha oo kaliya marka lagu daro diiwaanada cusub, laakiin sidoo kale marka la beddelo kuwa hadda jira. Tan waxaad u isticmaali kartaa kiciyeyaasha. Tarantool waxay leedahay laba nooc oo kiciya meel bannaan: before_replace ΠΈ on_replace. Kiciyeyaasha waa la eryaa mar kasta oo xogta boosku is beddesho (tuple kasta oo ay saameeyeen isbeddeladu, hawl kiciye ayaa la bilaabay). Si ka duwan on_replace, before_replace-kiciyeyaasha waxay kuu oggolaanayaan inaad wax ka beddesho xogta tuple kaas oo kicinta lagu fuliyo. Sidaas awgeed, nooca ugu dambeeya ee kiciya ayaa nagu habboon.

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

Kiciyeyaasha soo socda ayaa beddelaya qiimaha goobta row_ver Tuple kaydsan ilaa qiimaha xiga ee isku xigxiga row_version.

Si loo awoodo in xogta laga soo saaro meel bannaan goods tiirka row_ver, aynu samayno tusmo:

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

Nooca tusmada - geedTREE), sababtoo ah waxaan u baahan doonaa inaan xogta u soo saarno siday u kala horeeyaan ee qiyamka tiirka row_ver.

Aan ku darno xog meel bannaan:

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}

Sababtoo ah Beerta ugu horreysa waa counter-iskordhinta otomaatig ah; waanu dhaafnay halkii. Tarantool waxay si toos ah u bedeli doontaa qiimaha xiga. Sidoo kale, sida qiimaha beeraha column row_ver waad dhaafi kartaa nil - ama ha qeexin qiimaha gabi ahaanba, sababtoo ah tiirkani waxa uu ku yaalaa booska ugu dambeeya ee booska.

Aan hubino natiijada galinta:

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]
...

Sida aad arki karto, meelaha ugu horreeya iyo kuwa ugu dambeeya si toos ah ayaa loo buuxiyaa. Hadda way sahlanaan doontaa in shaqo loo qoro bogga-bog-bog ee isbeddelada booska 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

Shaqadu waxay u qaadataa halbeeg ahaan qiimaha row_ver, laga bilaabo taas oo ay lagama maarmaan tahay in la dejiyo isbeddelada, oo soo celisa qayb ka mid ah xogta la beddelay.

Muunaynta xogta ee Tarantool waxa lagu sameeyaa tusmooyinka. Shaqada get_goods wuxuu isticmaalaa dib-u-eegis by index row_ver si aad u hesho xog is beddeshay. Nooca Iterator waa GT (Ka weyn, ka weyn). Tani waxay ka dhigan tahay in dib-u-eeguhu uu si isdaba-joog ah u mari doono qiyamka tusaha oo ka bilaabmaya furaha la gudbiyay (qiimaha goobta row_ver).

Dib-u-habeyntu waxay soo celisaa tuples. Si markaas dabadeed loo awoodo in lagu wareejiyo xogta HTTP, waxaa lagama maarmaan ah in tuples loo beddelo qaab ku habboon taxanaha xiga. Tusaalaha ayaa tan u isticmaalaya shaqada caadiga ah tomap. Halkii la isticmaali lahaa tomap waxaad qori kartaa shaqadaada. Tusaale ahaan, waxaa laga yaabaa in aan rabno in aan bedelno goobta name, ha dhaafin garoonka code beerna ku darso 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

Baaxadda bogga xogta wax-soo-saarka (tirada diiwaannada ee hal qayb) waxaa go'aamiya doorsoomiyaha page_size. Tusaalaha qiimaha page_size waa 5. Barnaamijka dhabta ah, cabbirka bogga inta badan waa arrimo badan. Waxay kuxirantahay celceliska cabbirka tuple bannaanka. Cabbirka bogga ugu fiican waxaa lagu go'aamin karaa si macquul ah iyadoo la cabbirayo wakhtiga wareejinta xogta. Baaxadda cabbirka bogga, waa ay yaraanaysaa tirada wareegyada wareegyada u dhexeeya dhinacyada dirida iyo qaabilaadda. Sidan waxaad ku dhimi kartaa wakhtiga guud ee isbeddelada soo dejinta. Si kastaba ha ahaatee, haddii cabbirka bogga uu aad u weyn yahay, waxaan ku qaadan doonaa waqti aad u dheer server-ka si taxane ah muunadda. Natiijo ahaan, waxaa laga yaabaa in dib u dhac ku yimaado socodsiinta codsiyada kale ee imanaya serverka. Halbeegga page_size waxaa laga soo rari karaa faylka qaabeynta. Meel kasta oo la gudbiyo, waxaad dejin kartaa qiimaheeda. Si kastaba ha ahaatee, meelaha badidooda qiimaha caadiga ah (tusaale, 100) ayaa laga yaabaa inuu ku habboon yahay.

Aynu fulino shaqada 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
...

Aynu soo qaadano qiimaha goobta row_ver laga bilaabo xariiqda ugu dambeysa oo mar labaad wac shaqada:

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
...

Mar labaad:

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

Sida aad arki karto, marka habkan loo isticmaalo, shaqadu waxay soo celisaa dhammaan diiwaanada boosaska bog bog goods. Bogga ugu dambeeya waxaa ku xiga doorasho madhan.

Aan wax ka bedel ku samayno booska:

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

Waxaan bedelnay qiimaha goobta name hal gelid oo lagu daray laba gelis cusub.

Aan ku celino wicitaankii shaqada ee ugu dambeeyay:

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
...

Shaqadu waxay soo celisay diiwaanadii la beddelay oo lagu daray. Markaa shaqada get_goods Waxay kuu ogolaanaysaa inaad hesho xog is beddeshay tan iyo wacitaankiisii ​​ugu dambeeyay, kaas oo ah saldhigga habka taranka ee la tixgelinayo.

Waxaan kaga tagi doonaa soo saarista natiijooyinka HTTP qaab JSON ka baxsan baaxadda maqaalkan. Waxaad ka akhriyi kartaa arrintan halkan: https://habr.com/ru/company/mailru/blog/272141/

Fulinta qaybta macmiilka/addoonka

Aynu eegno sida uu u eg yahay hirgelinta dhinaca wax-ku-oolka ah. Aan ka abuurno meel bannaan dhanka qaabilaadda si aan u kaydino xogta la soo dejiyay:

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

Qaab dhismeedka boosku wuxuu u eg yahay qaab dhismeedka booska isha. Laakiin maadaama aynaan u gudbin xogta la helay meel kale, tiirka row_ver kuma jiro booska qaataha. Gudaha garoonka id Isha aqoonsiga waa la duubi doonaa. Sidaa darteed, dhinaca qaataha looma baahna in la sameeyo si otomaatig ah.

Intaa waxaa dheer, waxaan u baahanahay meel bannaan si aan u badbaadino qiyamka 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
})

Meel kasta oo la raro (field space_name) waxaanu halkan ku badbaadin doonaa qiimaha ugu dambeeya ee la raro row_ver (beeraha value). Tiirka wuxuu u shaqeeyaa sida furaha koowaad space_name.

Aan abuurno shaqo lagu shubo xogta booska goods iyada oo loo marayo HTTP. Si tan loo sameeyo, waxaan u baahanahay maktabad fulinaysa macmiil HTTP ah. Xariiqda soo socota ayaa rartay maktabadda oo waxay dajinaysaa macmiilka HTTP:

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

Waxaan sidoo kale u baahannahay maktabad si aan json uga takhalusno:

local json = require('json')

Tani waa ku filan tahay in la abuuro shaqada soo dejinta xogta:

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

Shaqadu waxay fulisaa codsi HTTP ciwaanka url oo soo dirtaa row_ver Halbeeg ahaan oo soo celisa natiijada codsiga laga dhigay.

Shaqada kaydinta xogta la helay waxay u egtahay sidan:

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

Wareega kaydinta xogta meel bannaan goods lagu meeleeyay wax kala iibsi (shaqada waxaa loo isticmaalaa tan box.atomic) si loo yareeyo tirada hawlaha diskka.

Ugu dambeyntii, shaqada isku-dubbaridka meel bannaan ee deegaanka goods Ilaha waxaad ku fulin kartaa sidan:

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

Marka hore waxaan akhrinay qiimihii hore loo badbaadiyay row_ver meel bannaan goods. Haddii ay maqan tahay (kalfadhigii ugu horreeyay ee sarrifka), ka dibna waxaan u qaadannaa sidii row_ver eber. Marka xigta wareegga waxaan sameyneynaa soo dejin bog-bog ah xogta la beddelay ee isha url cayiman. Dib-u-eegis kasta, waxaan ku keydineynaa xogta la helay meel ku habboon degaanka oo aan cusbooneysiinno qiimaha row_ver (meel bannaan row_ver iyo doorsoomayaasha row_ver) - qaado qiimaha row_ver laga bilaabo xariiqda ugu dambeysa ee xogta la raray.

Si aad uga ilaaliso wareegtada shilalka ah (haddii ay dhacdo qalad barnaamijka), loop while waxaa lagu bedeli karaa for:

for _ = 1, max_req do ...

Natiijada fulinta shaqada sync_goods meel bannaan goods qaataha ayaa ka koobnaan doona noocyadii ugu dambeeyay ee dhammaan diiwaanada boosaska goods ee isha.

Sida cad, tirtirka xogta habkan looma baahin karo. Haddii baahi noocaas ahi jirto, waxaad isticmaali kartaa calaamadda tirtirka. Ku darso meel bannaan goods beerta boolian is_deleted iyo halkii jir ahaan laga tirtiri lahaa rikoorka, waxaan isticmaalnaa tirtirid macquul ah - waxaan dejineynaa qiimaha goobta is_deleted macno ahaan true. Mararka qaarkood halkii beer boolean ah is_deleted way ku habboon tahay in la isticmaalo goobta deleted, kaas oo kaydiya taariikhda-waqtiga ee tirtirka macquulka ah ee diiwaanka. Ka dib marka la sameeyo tirtirid macquul ah, diiwaanka loo calaamadeeyay in la tirtiro ayaa laga wareejin doonaa isha loona wareejinayo meesha loo socdo (sida ku cad macquulnimada kor ku xusan).

Isku xigxiga row_ver waxaa loo isticmaali karaa in lagu gudbiyo xogta meelaha kale: looma baahna in la abuuro taxane gooni ah meel kasta oo la kala qaado.

Waxaan eegnay hab wax ku ool ah oo xogta heerka sare ah ku cusboonaysiinta codsiyada iyadoo la adeegsanayo Tarantool DBMS.

natiijooyinka

  1. Tarantool DBMS waa badeecad soo jiidasho leh, rajo leh oo abuureysa codsiyo culus.
  2. Ku celcelinta xogta heerka sare waxay leedahay faa'iidooyin dhowr ah marka loo eego ku celcelinta heerka hoose.
  3. Habka dib-u-celinta heerka sare ee lagaga hadlay maqaalku wuxuu kuu ogolaanayaa inaad yareyso qadarka xogta la wareejiyay adigoo wareejinaya kaliya diiwaanada isbeddelay tan iyo kalfadhigii ugu dambeeyay ee sarrifka.

Source: www.habr.com

Add a comment