Ukuphindaphinda kwezinga eliphezulu ku-Tarantool DBMS

Sawubona, ngidala izicelo ze-DBMS I-Tarantool iyinkundla eyakhiwe i-Mail.ru Group ehlanganisa i-DBMS esebenza kahle kakhulu kanye neseva yohlelo lokusebenza ngolimi lwesiLua. Isivinini esikhulu sezixazululo ezisekelwe ku-Tarantool sifinyelelwa, ikakhulukazi, ngenxa yokusekelwa kwemodi ye-in-memory ye-DBMS kanye nekhono lokusebenzisa i-logic yebhizinisi lesicelo endaweni eyodwa yekheli ngedatha. Ngesikhathi esifanayo, ukuphikelela kwedatha kuqinisekiswa kusetshenziswa ukuthengiselana kwe-ACID (ilogi ye-WAL igcinwa kudiski). I-Tarantool inosekelo olwakhelwe ngaphakathi lokuphindaphinda nokuhlukanisa. Kusukela kunguqulo 2.1, imibuzo ngolimi lwe-SQL iyasekelwa. I-Tarantool ingumthombo ovulekile futhi inelayisensi ngaphansi kwelayisensi ye-BSD eyenziwe Lula. Kukhona nenguqulo yebhizinisi lebhizinisi.

Ukuphindaphinda kwezinga eliphezulu ku-Tarantool DBMS
Zizwe amandla! (…aka jabulela ukusebenza)

Konke lokhu okungenhla kwenza i-Tarantool ibe inkundla ekhangayo yokudala izinhlelo zokusebenza ezinomthwalo omkhulu osebenza nesizindalwazi. Kuzinhlelo zokusebenza ezinjalo, kuvame ukuba nesidingo sokuphindaphinda idatha.

Njengoba kushiwo ngenhla, i-Tarantool inokuphindaphinda kwedatha eyakhelwe ngaphakathi. Umgomo wokusebenza kwayo ukwenza ngokulandelana kuzo zonke izifaniso eziqukethwe kulogi eyinhloko (WAL). Ngokuvamile ukuphindaphinda okunjalo (sizophinda sikubize izinga eliphansi) isetshenziselwa ukuqinisekisa ukubekezelela iphutha lohlelo lokusebenza kanye/noma ukusabalalisa umthwalo wokufunda phakathi kwama-cluster node.

Ukuphindaphinda kwezinga eliphezulu ku-Tarantool DBMS
Ilayisi. 1. Ukuphindaphinda ngaphakathi kweqoqo

Isibonelo sesinye isimo kungaba ukudlulisa idatha edalwe kusizindalwazi esisodwa kwenye isizindalwazi ukuze icutshungulwe/iqashwe. Esimweni sakamuva, isixazululo esilula kakhulu singase sibe ukusebenzisa izinga eliphezulu ukuphindaphinda - ukuphindaphinda kwedatha ezingeni lengqondo yebhizinisi lesicelo. Labo. Asisebenzisi isixazululo esenziwe ngomumo esakhelwe ku-DBMS, kodwa sisebenzisa ukuphindaphinda ngokwethu ngaphakathi kohlelo esilwenzayo. Le ndlela inakho kokubili okuhle nokubi. Ake sibhale izinzuzo.

1. Ukonga kwethrafikhi:

  • Awukwazi ukudlulisa yonke idatha, kodwa ingxenye yayo kuphela (isibonelo, ungadlulisela kuphela amathebula athile, amanye amakholomu awo noma amarekhodi ahlangabezana nesimiso esithile);
  • Ngokungafani nokuphindaphinda kwezinga eliphansi, okwenziwa ngokuqhubekayo nge-asynchronous (esetshenziswa enguqulweni yamanje ye-Tarantool - 1.10) noma evumelanayo (ezosetshenziswa ezinguqulweni ezilandelayo zemodi ye-Tarantool), ukuphindaphinda kwezinga eliphezulu kungenziwa ngezikhathi (okungukuthi, uhlelo lokusebenza luvumelanisa kuqala idatha - idatha yeseshini yokushintshisana, bese kuba khona ikhefu ekuphindaphindeni, emva kwalokho iseshini elandelayo yokushintshana ivela, njll.);
  • uma irekhodi selishintshile izikhathi ezimbalwa, ungadlulisela kuphela inguqulo yalo yakamuva (ngokungafani nokuphindaphinda kwezinga eliphansi, lapho zonke izinguquko ezenziwe ku-master zizodlalwa ngokulandelanayo kuma-replicas).

2. Abukho ubunzima ngokusebenzisa ukushintshaniswa kwe-HTTP, okukuvumela ukuthi uvumelanise imininingo egciniwe ekude.

Ukuphindaphinda kwezinga eliphezulu ku-Tarantool DBMS
Ilayisi. 2. Ukuphindaphinda nge-HTTP

3. Izakhiwo zedathabhethi lapho idatha idluliswa khona akufanele zifane (ngaphezu kwalokho, esimweni esijwayelekile, kungenzeka ukusebenzisa ama-DBMS ahlukene, izilimi zokuhlela, amapulatifomu, njll.).

Ukuphindaphinda kwezinga eliphezulu ku-Tarantool DBMS
Ilayisi. 3. Ukuphindaphinda ezinhlelweni ezihlukahlukene

Okubi ukuthi, ngokwesilinganiso, ukuhlela kunzima kakhulu/kubiza kakhulu kunokumisa, futhi esikhundleni sokwenza ngokwezifiso ukusebenza okwakhelwe ngaphakathi, kuzodingeka ukuthi usebenzise owakho.

Uma esimweni sakho izinzuzo ezingenhla zibalulekile (noma ziyisimo esidingekayo), khona-ke kunengqondo ukusebenzisa ukuphindaphinda kwezinga eliphezulu. Ake sibheke izindlela ezimbalwa zokuqalisa ukuphindaphinda kwedatha yezinga eliphezulu ku-Tarantool DBMS.

Ukunciphisa ithrafikhi

Ngakho-ke, enye yezinzuzo zokuphindaphinda kwezinga eliphezulu ukonga kwethrafikhi. Ukuze le nzuzo ibonakale ngokugcwele, kuyadingeka ukunciphisa inani ledatha edluliswayo phakathi neseshini ngayinye yokushintshisana. Yebo, akufanele sikhohlwe ukuthi ekupheleni kweseshini, umamukeli wedatha kufanele avunyelaniswe nomthombo (okungenani kuleyo ngxenye yedatha ehilelekile ekuphindaphindeni).

Indlela yokunciphisa inani ledatha edluliswayo ngesikhathi sokuphindaphinda kwezinga eliphezulu? Isixazululo esiqondile kungaba ukukhetha idatha ngosuku nesikhathi. Ukwenza lokhu, ungasebenzisa inkambu yesikhathi sosuku esivele ikhona kuthebula (uma ikhona). Isibonelo, idokhumenti "ye-oda" ingaba nenkambu "isikhathi esidingekayo sokwenza i-oda" - delivery_time. Inkinga ngalesi sixazululo ukuthi amanani kulo mkhakha akufanele abe ngokulandelana okuhambisana nokwakhiwa kwama-oda. Ngakho-ke asikwazi ukukhumbula inani eliphezulu lenkundla delivery_time, okudluliselwa phakathi neseshini yokushintshisana yangaphambilini, futhi phakathi neseshini yokushintshisana elandelayo khetha wonke amarekhodi anevelu yenkambu ephezulu delivery_time. Amarekhodi anenani eliphansi lenkambu kungenzeka engeziwe phakathi kwezikhathi zokushintshana delivery_time. Futhi, i-oda belingase libe nezinguquko, nokho ezingazange zithinte insimu delivery_time. Kuzo zombili izimo, izinguquko ngeke zidluliselwe ukusuka kumthombo ziye endaweni. Ukuze sixazulule lezi zinkinga, sizodinga ukudlulisa idatha "edlulanayo". Labo. kuseshini ngayinye yokushintshisana sizodlulisela yonke idatha enenani lenkundla delivery_time, okwedlula isikhathi esithile esidlule (isibonelo, amahora angu-N kusukela esikhathini samanje). Kodwa-ke, kusobala ukuthi kumasistimu amakhulu le ndlela ayisebenzi kakhulu futhi inganciphisa ukonga kwethrafikhi esikulwela kube ize. Ngaphezu kwalokho, ithebula elidluliswayo lingase lingabi nayo inkambu ehlotshaniswa nesikhathi sosuku.

Esinye isisombululo, esiyinkimbinkimbi kakhulu mayelana nokuqaliswa, ukuvuma ukwamukelwa kwedatha. Kulokhu, phakathi neseshini ngayinye yokushintshisana, yonke idatha idluliswa, ukutholwa kwayo okungazange kuqinisekiswe umamukeli. Ukuze wenze lokhu, uzodinga ukwengeza ikholomu ye-Boolean kuthebula lomthombo (isibonelo, is_transferred). Uma umamukeli evuma ukuthi ulitholile irekhodi, inkambu ehambisanayo ithatha inani true, ngemva kwalokho ukungena akusabandakanyeki ekuhwebeni. Le nketho yokusebenzisa inobubi obulandelayo. Okokuqala, ngerekhodi ngalinye elidlulisiwe, ukuvuma kufanele kwenziwe futhi kuthunyelwe. Uma sikhuluma nje, lokhu kungase kuqhathaniswe nokuphinda kabili inani ledatha edluliswayo futhi kuholele ekuphindaphindeni inani lokubuya nokubuya. Okwesibili, awekho amathuba okuthumela irekhodi elifanayo kwabemukeli abambalwa (umamukeli wokuqala ozowamukela uzoqinisekisa irisidi yakhe kanye nabo bonke abanye).

Indlela engenabo ububi obunikezwe ngenhla ukwengeza ikholomu kuthebula elidlulisiwe ukuze ulandelele izinguquko emigqeni yalo. Ikholomu enjalo ingaba yohlobo lwesikhathi sosuku futhi kufanele isethwe/ibuyekezwe uhlelo lokusebenza ibe isikhathi samanje njalo lapho amarekhodi engezwa/eshintshwa (ngokwe-athomu ngokungezwa/ushintsho). Njengesibonelo, ake sibize ikholomu update_time. Ngokulondoloza inani elikhulu lenkambu lale kholomu kumarekhodi adlulisiwe, singakwazi ukuqala iseshini yokushintshisana elandelayo ngaleli nani (khetha amarekhodi anenani lenkundla. update_time, okweqa inani eligcinwe ngaphambilini). Inkinga ngale ndlela yokugcina ukuthi izinguquko zedatha zingenzeka ngamaqoqo. Njengomphumela wamanani enkambu kukholamu update_time ingase ihluke. Ngakho, le kholomu ayikwazi ukusetshenziselwa okukhiphayo kwedatha okuhlukaniselwe (ikhasi nekhasi). Ukuze ubonise ikhasi ledatha ngekhasi, kuzodingeka usungule izindlela ezengeziwe okungenzeka zibe nokusebenza kahle okuphansi kakhulu (isibonelo, ukubuyisela kusizindalwazi wonke amarekhodi anenani. update_time ephakeme kunaleyo enikeziwe futhi ikhiqiza inombolo ethile yamarekhodi, kusukela ku-offset ethile kusukela ekuqaleni kwesampula).

Ungathuthukisa ukusebenza kahle kokudluliswa kwedatha ngokuthuthukisa kancane indlela yangaphambilini. Ukwenza lokhu, sizosebenzisa uhlobo lwenombolo (inamba ende) njengamavelu enkambu yekholomu ukuze silandelele izinguquko. Masiqambe ikholomu row_ver. Inani lenkambu yale kholomu kusafanele lisethwe/libuyekezwe njalo lapho irekhodi lidalwa/lilungiswa. Kodwa kulokhu, inkambu ngeke yabelwe isikhathi samanje sedethi, kodwa inani lekhawunta ethile, likhuphuke ngeyodwa. Ngenxa yalokho, ikholomu row_ver izoqukatha amanani ahlukile futhi ingasetshenziswa hhayi kuphela ukubonisa idatha "ye-delta" (idatha engeziwe/eshintshiwe kusukela ekupheleni kweseshini yokushintshisana yangaphambilini), kodwa futhi ukuze kalula nangempumelelo ihlukanise ibe amakhasi.

Indlela yokugcina ehlongozwayo yokunciphisa inani ledatha edluliswayo ngaphakathi kohlaka lokuphindaphinda kwezinga eliphezulu ibonakala kimi iyinhle kakhulu futhi iphelele. Ake sikubheke kabanzi.

Ukudlulisa Idatha Ngokusebenzisa Isibali Senguqulo Yomugqa

Ukuqaliswa kwengxenye yeseva/eyinhloko

Kuseva ye-MS SQL, kukhona uhlobo lwekholomu olukhethekile lokusebenzisa le ndlela - rowversion. Isizindalwazi ngasinye sinendawo yokubala ekhuphuka ngeyodwa isikhathi ngasinye lapho irekhodi lengezwa/lishintshwa kuthebula elinekholomu efana rowversion. Inani lalesi sibali linikezwa ngokuzenzakalelayo kunkambu yale kholomu kurekhodi elengeziwe/elishintshiwe. I-Tarantool DBMS ayinayo indlela eyakhelwe ngaphakathi efanayo. Noma kunjalo, ku-Tarantool akunzima ukuyisebenzisa ngesandla. Ake sibheke ukuthi lokhu kwenziwa kanjani.

Okokuqala, amagama amancane: amatafula eTarantool abizwa ngokuthi izikhala, futhi amarekhodi abizwa ngokuthi ama-tuples. Ku-Tarantool ungakha ukulandelana. Ukulandelana akuyona into engaphezu kwamajeneretha anamanani a-odiwe enombolo ephelele. Labo. yilokhu kanye esikudingayo ngezinjongo zethu. Ngezansi sizodala ukulandelana okunjalo.

Ngaphambi kokwenza noma yikuphi ukusebenza kwedatha ku-Tarantool, udinga ukusebenzisa umyalo olandelayo:

box.cfg{}

Ngenxa yalokho, i-Tarantool izoqala ukubhala izifinyezo zesizindalwazi kanye namalogi okwenziwayo kumkhombandlela wamanje.

Ake sakhe ukulandelana row_version:

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

Inketho if_not_exists ivumela iskripthi sokudala ukuthi sisetshenziswe izikhathi eziningi: uma into ikhona, i-Tarantool ngeke izame ukuyidala futhi. Le nketho izosetshenziswa kuyo yonke imiyalo ye-DDL elandelayo.

Ake sakhe isikhala njengesibonelo.

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

Lapha sibeka igama lesikhala (goods), amagama enkundla nezinhlobo zawo.

Izinkambu zokwandisa ngokuzenzakalela ku-Tarantool nazo zidalwe kusetshenziswa ukulandelana. Masidale ukhiye oyinhloko ozikhulisayo ngokuzenzakalelayo ngenkambu 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
})

I-Tarantool isekela izinhlobo eziningana zezinkomba. Izinkomba ezisetshenziswa kakhulu yizinhlobo ze-TREE ne-HASH, ezisekelwe ezakhiweni ezihambisana negama. ISITHILE wuhlobo lwenkomba oluguquguquka kakhulu. Ikuvumela ukuthi ubuyise idatha ngendlela ehlelekile. Kodwa ekukhethweni kokulingana, i-HASH ifaneleka kakhulu. Ngokufanelekile, kuhle ukusebenzisa i-HASH kukhiye oyinhloko (okuyilokho esikwenzile).

Ukusebenzisa ikholomu row_ver ukuze udlulise idatha eshintshile, udinga ukuhlanganisa amanani okulandelana ezinkambini zale kholomu row_ver. Kodwa ngokungafani nokhiye oyinhloko, inani lenkambu yekholomu row_ver kufanele ikhule ngeyodwa hhayi kuphela lapho wengeza amarekhodi amasha, kodwa nalapho ushintsha akhona. Ungasebenzisa izibangeli zalokhu. I-Tarantool inezinhlobo ezimbili zezibangeli zesikhala: before_replace ΠΈ on_replace. Izibangeli ziyaxoshwa noma nini lapho idatha esikhaleni ishintsha (ku-tuple ngayinye ethintwa izinguquko, kwethulwa umsebenzi wokucupha). Ngokungafani on_replace, before_replace-ama-triggers akuvumela ukuthi uguqule idatha ye-tuple lapho i-trigger ibulawelwa khona. Ngokuvumelana nalokho, uhlobo lokugcina lwezibangeli luyasifanela.

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

I-trigger elandelayo ingena esikhundleni senani lenkundla row_ver i-tuple egciniwe enanini elilandelayo lokulandelana row_version.

Ukuze ukwazi ukukhipha idatha esikhaleni goods ngekholomu row_ver, masidale inkomba:

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

Uhlobo lwenkomba - isihlahla (TREE), ngoba sizodinga ukukhipha idatha ngokulandelana okukhuphukayo kwamanani kukholamu row_ver.

Ake sengeze idatha esikhaleni:

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}

Ngoba Inkambu yokuqala iyikhawunta yokwandisa ngokuzenzakalela; esikhundleni salokho sidlula nil. I-Tarantool izoshintsha ngokuzenzakalelayo inani elilandelayo. Ngokufanayo, njengenani lezinkambu zekholomu row_ver ungadlula u-nil - noma ungacacisi inani nhlobo, ngoba le kholomu ithatha indawo yokugcina esikhaleni.

Ake sihlole umphumela wokufaka:

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

Njengoba ubona, izinkambu zokuqala nezokugcina zigcwaliswa ngokuzenzakalelayo. Manje kuzoba lula ukubhala umsebenzi wokulayishwa kwekhasi nekhasi kwezinguquko zesikhala 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

Umsebenzi uthatha njengepharamitha inani row_ver, kusukela lapho kudingeka khona ukukhulula izinguquko, futhi ibuyisela ingxenye yedatha eshintshiwe.

Ukusampula kwedatha ku-Tarantool kwenziwa ngezinkomba. Umsebenzi get_goods isebenzisa i-iterator ngenkomba row_ver ukuthola idatha eshintshile. Uhlobo lwe-Iterator yi-GT (Inkulu Kunokuthi, inkulu kune). Lokhu kusho ukuthi i-iterator izokweqa ngokulandelana amanani enkomba kusukela kukhiye odlulisiwe (inani lenkundla row_ver).

I-iterator ibuyisela ama-tuples. Ukuze kamuva ukwazi ukudlulisa idatha nge-HTTP, kuyadingeka ukuguqula ama-tuples abe isakhiwo esilungele ukwenziwa kwe-serialization okulandelayo. Isibonelo sisebenzisa umsebenzi ojwayelekile walokhu tomap. Esikhundleni sokusebenzisa tomap ungabhala umsebenzi wakho. Isibonelo, singase sifune ukuqamba kabusha inkambu name, ungadluli ensimini code bese wengeza inkambu 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

Usayizi wekhasi wedatha yokuphumayo (inani lamarekhodi engxenyeni eyodwa) kunqunywa ukuguquguquka page_size. Esibonelweni inani page_size ngu-5. Kuhlelo lwangempela, usayizi wekhasi ngokuvamile ubaluleke kakhulu. Kuya ngesilinganiso sosayizi we-tuple yesikhala. Usayizi wekhasi olungile unganqunywa ngokunamandla ngokulinganisa isikhathi sokudlulisa idatha. Uma usayizi wekhasi mkhulu, iba ncane inombolo yokuya nokubuya phakathi kwezinhlangothi zokuthumela nokwamukela. Ngale ndlela unganciphisa sonke isikhathi sokulanda izinguquko. Nokho, uma usayizi wekhasi mkhulu kakhulu, sizochitha isikhathi eside kuseva sihlanganisa isampula. Ngenxa yalokho, kungase kube nokubambezeleka ekucubunguleni ezinye izicelo eziza kuseva. Ipharamitha page_size ingalayishwa kusukela kufayela lokumisa. Ngesikhala ngasinye esidlulisiwe, ungasetha inani laso. Nokho, ezikhaleni eziningi inani elimisiwe (isibonelo, u-100) lingase lifaneleke.

Ake sikhiphe umsebenzi 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
...

Ake sithathe inani lenkundla row_ver kusuka kulayini wokugcina bese ushayela umsebenzi futhi:

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

Kwaphinda lokho:

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

Njengoba ubona, uma isetshenziswa ngale ndlela, umsebenzi ubuyisela wonke amarekhodi esikhala ikhasi nekhasi goods. Ikhasi lokugcina lilandelwa ukukhetha okungenalutho.

Masenze izinguquko esikhaleni:

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

Sishintshe inani lenkambu name kokungena okukodwa futhi wengeza okufakiwe okusha okubili.

Masiphinde ucingo lokugcina lomsebenzi:

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

Umsebenzi ubuyisele amarekhodi ashintshiwe nangeziwe. Ngakho umsebenzi get_goods ikuvumela ukuthi uthole idatha eshintshile kusukela ocingweni lwayo lokugcina, okuyisisekelo sendlela yokuphindaphinda ecatshangelwayo.

Sizoshiya ukukhishwa kwemiphumela nge-HTTP ngendlela ye-JSON ngaphandle kobubanzi balesi sihloko. Ungafunda ngalokhu lapha: https://habr.com/ru/company/mailru/blog/272141/

Ukuqaliswa kwengxenye yeklayenti/isigqila

Ake sibheke ukuthi ukuqaliswa kohlangothi olutholayo kubukeka kanjani. Masidale isikhala ohlangothini lokwamukela ukuze sigcine idatha elandiwe:

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

Isakhiwo sesikhala sifana nesakhiwo sesikhala emthonjeni. Kodwa njengoba ngeke sidlulise idatha etholiwe kwenye indawo, ikholomu row_ver ayikho esikhaleni somamukeli. Ensimini id izihlonzi zomthombo zizorekhodwa. Ngakho-ke, ohlangothini lomamukeli asikho isidingo sokuyenza i-auto-incrementing.

Ngaphezu kwalokho, sidinga isikhala ukuze silondoloze amanani 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
})

Ngesikhala ngasinye esilayishiwe (inkambu space_name) sizolondoloza inani lokugcina elilayishiwe lapha row_ver (insimu value). Ikholomu isebenza njengokhiye oyinhloko space_name.

Masidale umsebenzi wokulayisha idatha yesikhala goods nge-HTTP. Ukuze senze lokhu, sidinga ilabhulali esebenzisa iklayenti le-HTTP. Umugqa olandelayo ulayisha umtapo wolwazi futhi uqinisekisa iklayenti le-HTTP:

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

Sidinga futhi umtapo wolwazi we-json deserialization:

local json = require('json')

Lokhu kwanele ukudala umsebenzi wokulayisha idatha:

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

Umsebenzi wenza isicelo se-HTTP ekhelini le-url futhi ulithumele row_ver njengepharamitha futhi ibuyisela umphumela osusiwe wesicelo.

Umsebenzi wokulondoloza idatha etholiwe ubukeka kanje:

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

Umjikelezo wokulondoloza idatha esikhaleni goods ibekwe ekuthengiseni (umsebenzi usetshenziselwa lokhu box.atomic) ukunciphisa inani lemisebenzi yediski.

Ekugcineni, umsebenzi wokuvumelanisa isikhala sendawo goods ngomthombo ungawusebenzisa kanje:

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

Okokuqala sifunda inani elilondolozwe ngaphambilini row_ver okwesikhala goods. Uma ilahlekile (iseshini yokuqala yokushintshanisa), khona-ke siyithatha njenge row_ver uziro. Okulandelayo emjikelezweni senza ukulanda kwekhasi nekhasi kwedatha eshintshiwe kusukela kumthombo ku-url eshiwo. Ekuphindaphindweni ngakunye, silondoloza idatha etholiwe endaweni efanele yendawo futhi sibuyekeze inani row_ver (emkhathini row_ver nakuguquguqukayo row_ver) - thatha inani row_ver kusukela kulayini wokugcina wedatha elayishiwe.

Ukuvikela ekujikeni ngephutha (uma kwenzeka iphutha kuhlelo), iluphu while ingathathelwa indawo for:

for _ = 1, max_req do ...

Njengomphumela wokwenza umsebenzi sync_goods isikhala goods umamukeli uzoqukatha izinguqulo zakamuva zawo wonke amarekhodi esikhala goods emthonjeni.

Ngokusobala, ukususwa kwedatha akukwazi ukusakazwa ngale ndlela. Uma kunesidingo esinjalo, ungasebenzisa uphawu lokususa. Engeza esikhaleni goods inkambu ye-boolean is_deleted futhi esikhundleni sokususa irekhodi ngokoqobo, sisebenzisa ukususa okunengqondo - sibeka inani lenkambu is_deleted ibe yincazelo true. Ngezinye izikhathi esikhundleni senkambu ye-boolean is_deleted kulula kakhulu ukusebenzisa insimu deleted, egcina isikhathi sosuku sokususwa okunengqondo kwerekhodi. Ngemva kokwenza ukususa okunengqondo, irekhodi elimakelwe ukususwa lizodluliswa lisuka emthonjeni liye endaweni okuyiwa kuyo (ngokuvumelana nomqondo okukhulunywe ngawo ngenhla).

Ukulandelana row_ver ingasetshenziswa ukudlulisa idatha kusuka kwezinye izikhala: asikho isidingo sokudala ukulandelana okuhlukile kwendawo ngayinye edlulisiwe.

Sibheke indlela esebenzayo yokuphindaphinda idatha yezinga eliphezulu ezinhlelweni ezisebenzisa i-Tarantool DBMS.

okutholakele

  1. I-Tarantool DBMS ingumkhiqizo okhangayo, othembisayo wokudala izinhlelo zokusebenza ezinomthwalo omkhulu.
  2. Ukuphindaphinda kwedatha kwezinga eliphezulu kunezinzuzo eziningi kunokuphindaphinda kwezinga eliphansi.
  3. Indlela yezinga eliphezulu yokuphindaphinda okuxoxwe ngayo esihlokweni ikuvumela ukuthi unciphise inani ledatha edlulisiwe ngokudlulisela kuphela lawo marekhodi ashintshile kusukela esikhathini sokushintshana sokugcina.

Source: www.habr.com

Engeza amazwana