Kubwereza kwapamwamba mu Tarantool DBMS

Moni, ndikupanga mapulogalamu a DBMS Tarantool ndi nsanja yopangidwa ndi Mail.ru Group yomwe imaphatikiza DBMS yogwira ntchito kwambiri komanso seva yogwiritsira ntchito m'chinenero cha Lua. Kuthamanga kwambiri kwa mayankho ozikidwa pa Tarantool kumatheka, makamaka, chifukwa chothandizira njira yokumbukira ya DBMS komanso kuthekera kogwiritsa ntchito malingaliro abizinesi mumalo amodzi adilesi ndi data. Panthawi imodzimodziyo, kulimbikira kwa deta kumatsimikiziridwa pogwiritsa ntchito zochitika za ACID (logi ya WAL imasungidwa pa disk). Tarantool ili ndi chithandizo chokhazikika pakubwereza ndi kugawa. Kuyambira pa mtundu 2.1, mafunso muchilankhulo cha SQL amathandizidwa. Tarantool ndi gwero lotseguka ndipo ili ndi chilolezo pansi pa layisensi Yosavuta ya BSD. Palinso mtundu wa Enterprise Enterprise.

Kubwereza kwapamwamba mu Tarantool DBMS
Imvani mphamvu! (…aka enjoy the performance)

Zonse zomwe zili pamwambazi zimapangitsa Tarantool kukhala nsanja yokongola yopangira mapulogalamu olemetsa kwambiri omwe amagwira ntchito ndi nkhokwe. M'mapulogalamu otere, nthawi zambiri pamafunika kubwereza deta.

Monga tafotokozera pamwambapa, Tarantool ili ndi kubwereza kwa data. Mfundo ya ntchito yake ndikuchita motsatizana pazochitika zonse zomwe zili mu chipika chachikulu (WAL). Nthawi zambiri kubwereza kotere (tidzazitchanso otsika) imagwiritsidwa ntchito kuwonetsetsa kulolerana kwa zolakwika ndi/kapena kugawa zowerengera pakati pa ma cluster node.

Kubwereza kwapamwamba mu Tarantool DBMS
Mpunga. 1. Kufananiza mkati mwa tsango

Chitsanzo cha zochitika zina zingakhale kusamutsa deta yomwe idapangidwa mu database imodzi kupita ku nkhokwe ina kuti ikonzedwe/kuwunika. Pamapeto pake, njira yabwino kwambiri ingakhale yogwiritsira ntchito mkulu mlingo kubwereza - kubwereza kwa data pamlingo wamalingaliro abizinesi. Iwo. Sitigwiritsa ntchito njira yopangidwa kale yomangidwa mu DBMS, koma timagwiritsa ntchito kubwereza tokha mkati mwa pulogalamu yomwe tikupanga. Njira imeneyi ili ndi ubwino ndi kuipa kwake. Tiyeni titchule ubwino wake.

1. Kusunga ndalama zamagalimoto:

  • Simungathe kusamutsa deta yonse, koma gawo lokhalo (mwachitsanzo, mutha kusamutsa matebulo ena, mizati yawo kapena zolemba zomwe zimakwaniritsa muyeso wina);
  • Mosiyana ndi kubwereza kwapang'ono, komwe kumachitidwa mosalekeza mu asynchronous (yomwe ikugwiritsidwa ntchito mu mtundu waposachedwa wa Tarantool - 1.10) kapena synchronous (kuti igwiritsidwe ntchito m'matembenuzidwe otsatira a Tarantool), kubwereza kwapamwamba kumatha kuchitika magawo (ie, the ntchito imagwirizanitsa deta poyamba - deta ya gawo la kusinthana, ndiye pamakhala kupuma mobwerezabwereza, pambuyo pake gawo lotsatira losinthana likuchitika, ndi zina zotero);
  • ngati mbiri yasintha kangapo, mutha kusamutsa mtundu wake waposachedwa (mosiyana ndi kubwereza kwapang'onopang'ono, momwe zosintha zonse zomwe zasinthidwa mbuye zidzaseweredwa motsatizana pazofananira).

2. Palibe zovuta pakukhazikitsa kusinthana kwa HTTP, komwe kumakupatsani mwayi wolumikizana ndi ma database akutali.

Kubwereza kwapamwamba mu Tarantool DBMS
Mpunga. 2. Kubwereza pa HTTP

3. Zomwe zimasungidwa pakati pa zomwe data zimasamutsidwa siziyenera kukhala zofanana (kuphatikiza apo, nthawi zambiri, ndizotheka kugwiritsa ntchito ma DBMS osiyanasiyana, zilankhulo zamapulogalamu, nsanja, ndi zina).

Kubwereza kwapamwamba mu Tarantool DBMS
Mpunga. 3. Kubwerezabwereza mu machitidwe osiyanasiyana

Choyipa ndichakuti, pafupifupi, mapulogalamu ndi ovuta / okwera mtengo kuposa kasinthidwe, ndipo m'malo mosintha magwiridwe antchito, muyenera kukhazikitsa zanu.

Ngati m'malo mwanu zabwino zomwe zili pamwambapa ndizofunikira (kapena ndizofunikira), ndiye kuti ndizomveka kugwiritsa ntchito kubwereza kwapamwamba. Tiyeni tiwone njira zingapo zogwiritsira ntchito kubwereza kwapamwamba kwa data mu Tarantool DBMS.

Kuchepetsa magalimoto

Chifukwa chake, chimodzi mwazabwino za kubwereza kwapamwamba ndikusunga ndalama zamagalimoto. Kuti ubwino umenewu ukwaniritsidwe mokwanira, m'pofunika kuchepetsa kuchuluka kwa deta yomwe imasamutsidwa panthawi iliyonse yosinthana. Zachidziwikire, tisaiwale kuti kumapeto kwa gawoli, wolandila data ayenera kulumikizidwa ndi gwero (osachepera gawo la data lomwe likukhudzidwa ndi kubwereza).

Kodi mungachepetse bwanji kuchuluka kwa data yomwe imasamutsidwa panthawi yobwerezeka kwambiri? Yankho lolunjika lingakhale kusankha deta ndi tsiku ndi nthawi. Kuti muchite izi, mutha kugwiritsa ntchito gawo la nthawi yomwe ilipo kale patebulo (ngati ilipo). Mwachitsanzo, chikalata cha "oda" chikhoza kukhala ndi gawo la "nthawi yoyitanitsa" - delivery_time. Vuto ndi yankho ili ndikuti mfundo zomwe zili m'gawoli siziyenera kukhala motsatira zomwe zimagwirizana ndi kupanga madongosolo. Chifukwa chake sitingakumbukire kuchuluka kwamunda delivery_time, yofalitsidwa panthawi yosinthana yapitayi, ndipo panthawi yosinthana yotsatira sankhani zolemba zonse zomwe zili ndi mtengo wapamwamba delivery_time. Zolemba zokhala ndi mtengo wotsika wagawo zitha kuwonjezeredwa pakati pa magawo osinthanitsa delivery_time. Komanso, dongosololi likadakhala likusintha, zomwe sizinakhudze gawolo delivery_time. Muzochitika zonsezi, zosintha sizingasinthidwe kuchokera kugwero kupita komwe mukupita. Kuthetsa mavutowa, tiyenera kusamutsa deta "kudutsana". Iwo. mu gawo lililonse lakusinthana tidzasamutsa deta yonse ndi mtengo wamunda delivery_time, kupitirira nthawi ina m'mbuyomu (mwachitsanzo, ma N maola kuchokera pakali pano). Komabe, n’zachidziΕ΅ikire kuti pamakina akuluakulu njira imeneyi ndi yosafunika kwambiri ndipo ingachepetse ndalama zimene tikuyesetsa kuti zisakhale zachabechabe. Kuphatikiza apo, tebulo lomwe likusamutsidwa silingakhale ndi gawo logwirizana ndi nthawi.

Yankho lina, lovuta kwambiri pakukhazikitsa, ndikuvomereza kulandira deta. Pankhaniyi, panthawi iliyonse yosinthana, deta yonse imafalitsidwa, kulandila komwe sikunatsimikizidwe ndi wolandira. Kuti mugwiritse ntchito izi, muyenera kuwonjezera ndime ya Boolean pagawo loyambira (mwachitsanzo, is_transferred). Ngati wolandirayo akuvomereza kuti walandira mbiriyo, gawo lofananira limatenga mtengo wake true, pambuyo pake kulowa sikulowanso mu kusinthanitsa. Njira yokhazikitsa iyi ili ndi zovuta zotsatirazi. Choyamba, pa mbiri iliyonse yomwe yasamutsidwa, chivomerezo chiyenera kupangidwa ndikutumizidwa. Kunena mwachidule, izi zitha kufanana ndi kuwirikiza kawiri kuchuluka kwa data yomwe yatumizidwa ndikupangitsa kuchulukitsa maulendo obwereza. Kachiwiri, palibe kuthekera kotumiza zolemba zomwezo kwa olandila angapo (wolandila woyamba kulandira adzatsimikizira kuti ali ndi risiti yekha ndi ena onse).

Njira yomwe ilibe zovuta zomwe zaperekedwa pamwambapa ndikuwonjezera gawo patebulo losamutsidwa kuti muwone kusintha kwa mizere yake. Mzere woterewu ukhoza kukhala wamtundu wanthawi ndipo uyenera kukhazikitsidwa / kusinthidwa ndi pulogalamuyo mpaka pano nthawi iliyonse yomwe ma rekodi akuwonjezeredwa / kusinthidwa (atomiki ndi kuwonjezera / kusintha). Mwachitsanzo, tiyeni tiyitane ndime update_time. Posunga kuchuluka kwa gawoli pazambiri zomwe zasamutsidwa, titha kuyambitsa gawo lotsatira losinthana ndi mtengowu (sankhani zolemba ndi mtengo wamunda. update_time, kupitirira mtengo wosungidwa kale). Vuto ndi njira yotsirizayi ndikuti kusintha kwa deta kumatha kuchitika m'magulu. Chifukwa cha zomwe zili m'mundamo update_time sizingakhale zapadera. Chifukwa chake, gawoli silingagwiritsidwe ntchito potulutsa deta (tsamba ndi tsamba). Kuti muwonetse deta tsamba ndi tsamba, muyenera kupanga njira zowonjezera zomwe zingakhale zotsika kwambiri (mwachitsanzo, kuchotsa kuchokera ku database zolemba zonse ndi mtengo wake. update_time apamwamba kuposa omwe apatsidwa ndikupanga zolemba zingapo, kuyambira pakusintha kwina koyambira koyambira).

Mutha kusintha luso la kusamutsa deta posintha pang'ono njira yapitayi. Kuti tichite izi, tidzagwiritsa ntchito mtundu wamtundu (intaneti yayitali) ngati magawo agawo pakutsata kusintha. Tiyeni titchule gawoli row_ver. Mtengo wa gawoli uyenera kukhazikitsidwa / kusinthidwa nthawi iliyonse pomwe mbiri ikupangidwa/kusinthidwa. Koma pamenepa, munda sudzapatsidwa nthawi yomwe ilipo, koma mtengo wa kauntala ina, yowonjezereka ndi imodzi. Chifukwa chake, gawoli row_ver idzakhala ndi makhalidwe apadera ndipo ingagwiritsidwe ntchito osati kusonyeza "delta" deta (deta yowonjezeredwa / yosinthidwa kuyambira kumapeto kwa gawo lapitalo la kusinthana), komanso kugawanitsa mwatsatanetsatane m'masamba.

Njira yotsiriza yochepetsera kuchuluka kwa deta yomwe imasamutsidwa mkati mwa ndondomeko ya kubwereza kwapamwamba ikuwoneka kwa ine kukhala yabwino kwambiri komanso yapadziko lonse. Tiyeni tione mwatsatanetsatane.

Kudutsa Data Pogwiritsa Ntchito Row Version Counter

Kukhazikitsa kwa seva / gawo la master

Mu MS SQL Server, pali mtundu wapadera wa magawo kuti mugwiritse ntchito njirayi - rowversion. Nawonso database iliyonse ili ndi kauntala yomwe imachulukitsa ndi imodzi nthawi iliyonse mbiri ikawonjezeredwa / kusinthidwa patebulo lomwe lili ndi gawo ngati rowversion. Mtengo wa kauntalayi umangoperekedwa kugawo lazagawoli mu mbiri yowonjezeredwa/yosinthidwa. Tarantool DBMS ilibe makina omangidwira ofanana. Komabe, mu Tarantool sikovuta kukhazikitsa pamanja. Tiyeni tiwone momwe izi zimachitikira.

Choyamba, mawu ang'onoang'ono: matebulo ku Tarantool amatchedwa mipata, ndipo zolemba zimatchedwa tuples. Mu Tarantool mutha kupanga zotsatizana. Zotsatizana sizili kanthu koma majenereta otchulidwa amagulu ophatikizidwa. Iwo. Izi ndi zomwe timafunikira pazolinga zathu. Pansipa tidzapanga ndondomeko yotere.

Musanayambe ntchito iliyonse ya database ku Tarantool, muyenera kuyendetsa lamulo ili:

box.cfg{}

Zotsatira zake, Tarantool iyamba kulemba zithunzithunzi za database ndi zipika zamalonda ku bukhu lapano.

Tiyeni tipange ndandanda row_version:

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

Yankho if_not_exists imalola kuti zolemba za chilengedwe zizichitika kangapo: ngati chinthucho chilipo, Tarantool sidzayesa kulenganso. Izi zidzagwiritsidwa ntchito m'malamulo onse a DDL.

Tiyeni tipange danga monga chitsanzo.

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

Apa tikuyika dzina la danga (goods), mayina a minda ndi mitundu yawo.

Magawo owonjezera okha ku Tarantool amapangidwanso pogwiritsa ntchito motsatana. Tiyeni tipange makiyi oyambira owonjezera okha ndi gawo 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 imathandizira mitundu ingapo yama index. Zolozera zomwe zimagwiritsidwa ntchito kwambiri ndi mitundu ya TREE ndi HASH, yomwe imachokera pamapangidwe ofanana ndi dzinalo. TREE ndiye mtundu wamtundu wosinthasintha kwambiri. Kumakuthandizani kuti akatenge deta mwadongosolo. Koma pakusankha kofanana, HASH ndiyoyenera. Chifukwa chake, ndikofunikira kugwiritsa ntchito HASH pa kiyi yoyamba (zomwe ndi zomwe tidachita).

Kuti mugwiritse ntchito column row_ver kusamutsa deta yosinthidwa, muyenera kumangirira zikhalidwe zamagawo agawoli row_ver. Koma mosiyana ndi kiyi yoyamba, mtengo wagawo lazanja row_ver ziyenera kuwonjezeka ndi imodzi osati powonjezera zolemba zatsopano, komanso posintha zomwe zilipo kale. Mutha kugwiritsa ntchito zoyambitsa izi. Tarantool ili ndi mitundu iwiri ya zoyambitsa danga: before_replace ΠΈ on_replace. Zoyambitsa zimachotsedwa nthawi iliyonse yomwe deta yomwe ili mumlengalenga imasintha (pa tuple iliyonse yomwe imakhudzidwa ndi kusintha, ntchito yoyambitsa imayambitsidwa). Mosiyana on_replace, before_replace-zoyambitsa zimakulolani kuti musinthe deta ya tuple yomwe choyambitsacho chimapangidwira. Chifukwa chake, zoyambitsa zomaliza zimatikwanira.

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

Choyambitsa chotsatirachi chimalowa m'malo mwa mtengo wamunda row_ver tuple yosungidwa ku mtengo wina wotsatira row_version.

Kuti athe kuchotsa deta kuchokera mlengalenga goods pa ndime row_ver, tiyeni tipange index:

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

Mtundu wa index - mtengo (TREE), chifukwa tidzafunika kutulutsa zomwe zili mumndandanda wokwera wamtengowo row_ver.

Tiyeni tiwonjeze data ku danga:

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}

Chifukwa Munda woyamba ndi wowonjezera-owonjezera; timadutsa nil m'malo mwake. Tarantool imangolowetsa mtengo wotsatira. Mofananamo, monga mtengo wa minda ya mzati row_ver mutha kudutsa popanda - kapena osatchula mtengo konse, chifukwa ndime iyi ili pomaliza mu danga.

Tiyeni tiwone zotsatira zoyika:

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

Monga mukuonera, minda yoyamba ndi yomaliza imadzazidwa ndi basi. Tsopano kudzakhala kosavuta kulemba ntchito yokweza tsamba ndi tsamba la kusintha kwa malo 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

Ntchitoyi imatenga ngati parameter mtengo row_ver, kuyambira pomwe ndikofunikira kutsitsa zosintha, ndikubwezeretsa gawo lazosinthidwa.

Zitsanzo za data mu Tarantool zimachitika kudzera m'ma index. Ntchito get_goods amagwiritsa ntchito iterator ndi index row_ver kulandira deta yosinthidwa. Mtundu wa Iterator ndi GT (Wamkulu Kuposa, wamkulu kuposa). Izi zikutanthauza kuti wobwereza adzadutsa motsatizana ziwerengero kuyambira pa kiyi yodutsa (mtengo wamunda. row_ver).

Wobwereza amabwezera ma tuples. Kuti kenako muthe kusamutsa deta kudzera pa HTTP, ndikofunikira kusintha ma tuples kukhala mawonekedwe osavuta kutsatiridwa motsatira. Chitsanzo chimagwiritsa ntchito ntchito yokhazikika pa izi tomap. M'malo mogwiritsa ntchito tomap mukhoza kulemba ntchito yanu. Mwachitsanzo, tingafune kutchulanso gawo name, osadutsa munda code ndi kuwonjezera munda 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

Kukula kwa tsamba lazotulutsa (chiwerengero cha zolemba mu gawo limodzi) kumatsimikiziridwa ndi kusintha page_size. Mu chitsanzo mtengo page_size ndi 5. Mu pulogalamu yeniyeni, kukula kwa tsamba kumakhala kofunikira kwambiri. Zimatengera kukula kwa danga la tuple. Kukula koyenera kwa tsamba kungadziwike mwachidziwitso poyesa nthawi yosamutsa deta. Kukula kwa tsamba, kumachepetsa kuchuluka kwa maulendo ozungulira pakati pa mbali zotumiza ndi zolandira. Mwanjira iyi mutha kuchepetsa nthawi yonse yotsitsa zosintha. Komabe, ngati kukula kwa tsamba ndi kwakukulu kwambiri, tikhala nthawi yayitali kwambiri pa seva ndikuyika zitsanzo. Zotsatira zake, pangakhale kuchedwa pakukonza zopempha zina zomwe zikubwera ku seva. Parameter page_size ikhoza kutsitsidwa kuchokera ku fayilo yosinthika. Pamalo aliwonse opatsirana, mutha kukhazikitsa mtengo wake. Komabe, m'malo ambiri mtengo wokhazikika (mwachitsanzo, 100) ungakhale woyenera.

Tiyeni tigwiritse ntchito 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
...

Tiyeni titenge mtengo wamunda row_ver kuchokera pamzere womaliza ndikuyimbiranso ntchitoyi:

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

Kenanso:

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

Monga mukuwonera, ikagwiritsidwa ntchito motere, ntchitoyi imabwezeretsa zolemba zonse za danga tsamba ndi tsamba goods. Tsamba lomaliza likutsatiridwa ndi kusankha kopanda kanthu.

Tiyeni tisinthe malo:

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

Tasintha mtengo wamunda name pakulowa kumodzi ndikuwonjezera zolemba ziwiri zatsopano.

Tiyeni tibwereze kuyimba komaliza:

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

Ntchitoyo idabweza zolemba zosinthidwa ndikuwonjezera. Choncho ntchito get_goods amakulolani kuti mulandire deta yomwe yasintha kuyambira kuyitana kwake komaliza, komwe kuli maziko a njira yobwerezabwereza yomwe ikuganiziridwa.

Tisiya kutulutsa zotsatira kudzera pa HTTP mu mawonekedwe a JSON kunja kwa nkhaniyi. Mutha kuwerenga za izi apa: https://habr.com/ru/company/mailru/blog/272141/

Kukhazikitsa gawo la kasitomala / kapolo

Tiyeni tiwone momwe kukhazikitsidwa kwa mbali yolandirira kumawonekera. Tiyeni tipange malo kumbali yolandirira kuti tisunge zomwe zidatsitsidwa:

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

Mapangidwe a danga amafanana ndi mawonekedwe a danga mu gwero. Koma popeza sitidzapereka zomwe talandira kwina kulikonse, gawoli row_ver sichili m'malo a wolandira. M'munda id zozindikiritsa zoyambira zidzajambulidwa. Chifukwa chake, pa mbali yolandila palibe chifukwa chopangira auto-incrementing.

Kuphatikiza apo, timafunikira malo kuti tisunge zikhalidwe 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
})

Pamalo aliwonse odzaza (munda space_name) tidzasunga mtengo womaliza wokwezedwa apa row_ver (munda value). Gawoli limakhala ngati kiyi yoyamba space_name.

Tiyeni tipange ntchito kuti tiyike data ya danga goods kudzera pa HTTP. Kuti tichite izi, tikufuna laibulale yomwe imagwiritsa ntchito kasitomala wa HTTP. Mzere wotsatirawu umakweza laibulale ndikuyambitsa kasitomala wa HTTP:

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

Tikufunanso laibulale ya json deerialization:

local json = require('json')

Izi ndizokwanira kupanga ntchito yotsitsa deta:

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

Ntchitoyi ikuchita pempho la HTTP ku adilesi ya url ndikutumiza row_ver monga parameter ndi kubweza zotsatira zosafunika za pempho.

Ntchito yosunga zomwe mwalandira zikuwoneka motere:

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

Mkombero wosunga deta kumlengalenga goods kuyikidwa mu malonda (ntchitoyo imagwiritsidwa ntchito pa izi box.atomic) kuchepetsa kuchuluka kwa ntchito za disk.

Pomaliza, ntchito yolumikizira danga mdera lanu goods ndi gwero mutha kukhazikitsa motere:

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

Choyamba timawerenga mtengo wosungidwa kale row_ver kwa danga goods. Ngati ikusowa (gawo loyamba losinthana), ndiye timalitenga ngati row_ver ziro. Kenako, timatsitsa tsamba ndi tsamba zomwe zasinthidwa kuchokera komwe kumachokera pa ulalo womwe watchulidwa. Pobwerezabwereza, timasunga zomwe talandira ku malo oyenera am'deralo ndikusintha mtengo wake row_ver (mu space row_ver ndi mu variable row_ver) - tenga mtengo row_ver kuchokera pamzere womaliza wa data yodzaza.

Kuteteza ku kulumphira mwangozi (ngati pakhala cholakwika mu pulogalamu), loop while akhoza kusinthidwa ndi for:

for _ = 1, max_req do ...

Chifukwa cha ntchitoyo sync_goods danga goods wolandirayo adzakhala ndi matembenuzidwe atsopano a zolemba zonse za danga goods mu gwero.

Mwachiwonekere, kufufutidwa kwa deta sikungathe kuwulutsidwa motere. Ngati chosowacho chilipo, mutha kugwiritsa ntchito chizindikiro chochotsa. Onjezani ku danga goods munda wa boolean is_deleted ndipo m'malo mochotsa mbiri, timagwiritsa ntchito kufufuta momveka - timayika mtengo wamunda is_deleted mu mtengo true. Nthawi zina m'malo mwa malo a boolean is_deleted ndikosavuta kugwiritsa ntchito kumunda deleted, yomwe imasunga tsiku la nthawi yochotsa cholembedwacho. Mukachotsa momveka bwino, mbiri yolembedwa kuti ichotsedwe idzasamutsidwa kuchokera komwe kumachokera kupita komwe mukupita (malinga ndi malingaliro omwe takambirana pamwambapa).

Kusintha row_ver angagwiritsidwe ntchito kutumiza deta kuchokera kumalo ena: palibe chifukwa chopanga ndondomeko yosiyana pa malo aliwonse opatsirana.

Tinayang'ana njira yothandiza yobwereza deta yapamwamba pamapulogalamu pogwiritsa ntchito Tarantool DBMS.

anapezazo

  1. Tarantool DBMS ndi chinthu chokongola, chodalirika chopanga mapulogalamu olemetsa kwambiri.
  2. Kubwereza kwapamwamba kwa deta kumakhala ndi ubwino wambiri kusiyana ndi kubwereza kochepa.
  3. Njira yobwerezabwereza yapamwamba yomwe yakambidwa m'nkhaniyi imakupatsani mwayi wochepetsera kuchuluka kwa data yomwe yasamutsidwa mwa kusamutsa zolemba zokha zomwe zasintha kuyambira gawo lomaliza la kusinthana.

Source: www.habr.com

Kuwonjezera ndemanga