Tulaga maualuga i le Tarantool DBMS

Talofa, o lo'o ou faia ni talosaga mo le DBMS Tarantool ose fa'avae na fausia e le Mail.ru Group e tu'ufa'atasia ai se DBMS maualuga ma se fa'aumau talosaga i le gagana Lua. O le maualuga o le saoasaoa o fofo e faʻavae i luga o Tarantool e ausia, aemaise lava, ona o le lagolago mo le faʻaogaina o le DBMS ma le mafai ona faʻatinoina le faʻaogaina o pisinisi pisinisi i totonu o se tuatusi avanoa e tasi ma faʻamaumauga. I le taimi lava e tasi, e faʻamautinoa le faʻamautu o faʻamatalaga e faʻaaoga ai fefaʻatauaiga a le ACID (o loʻo tausia le WAL log i luga o le disk). Tarantool ua fausia-i totonu lagolago mo le toe faia ma sharding. Amata mai le version 2.1, e lagolagoina fesili ile gagana SQL. Tarantool o se punaoa tatala ma laiseneina i lalo ole laisene BSD Simplified. O loʻo iai foʻi se faʻasalalauga faʻapisinisi Enterprise.

Tulaga maualuga i le Tarantool DBMS
Lagona le mana! (...aka fiafia i le faatinoga)

O mea uma o loʻo i luga o loʻo avea ai Tarantool o se faʻailoga matagofie mo le fatuina o talosaga maualuga e galulue ma faʻamaumauga. I ia talosaga, e masani ona manaʻomia le toe faʻasologa o faʻamaumauga.

E pei ona taʻua i luga, ua fausia e Tarantool faʻamaumauga faʻamaumauga. O le fa'avae o lona fa'agaioiga o le fa'asologa fa'asolosolo i luga o fa'asologa o fefa'atauaiga uma o lo'o i totonu o le master log (WAL). E masani lava o ia toe faʻafoʻi (o le a matou taʻua atili tulaga maualalo) e fa'aaogaina e fa'amautinoa ai le fa'apalepale o fa'aletonu ma/po'o le tufatufaina o le uta faitau i le va o nodes fuifui.

Tulaga maualuga i le Tarantool DBMS
Alaisa. 1. Toe faia i totonu o se fuifui

O se fa'ata'ita'iga o se isi fa'ata'ita'iga o le fa'aliliuina lea o fa'amaumauga na faia i le tasi fa'amaumauga i le isi fa'amaumauga mo le fa'agaioiina/mata'ituina. I le tulaga mulimuli, o se fofo sili atu ona faigofie e mafai ona faʻaaogaina maualuga maualuga fa'asologa - fa'amaumauga fa'amaumauga i le tulaga fa'atatau pisinisi talosaga. O na. Matou te le fa'aogaina se fofo ua saunia e fausia i totonu o le DBMS, ae fa'atino le toe fa'afoliga na'o matou lava i totonu o le talosaga o lo'o matou atia'e. O lenei faiga e i ai uma itu lelei ma mea le lelei. Sei o tatou lisi mea lelei.

1. Fa'asaoina o feoaiga:

  • E le mafai ona e faʻafeiloaʻi uma faʻamatalaga, ae naʻo se vaega (mo se faʻataʻitaʻiga, e mafai ona e faʻafeiloaʻi na o ni laulau, nisi o latou koluma poʻo faʻamaumauga e fetaui ma se faʻatonuga);
  • E le pei o le faʻasologa maualalo, lea e faʻaauau pea i le asynchronous (faʻatinoina i le taimi nei o Tarantool - 1.10) poʻo le synchronous (ia faʻatinoina i isi lomiga mulimuli o Tarantool), e mafai ona faia le faʻasologa maualuga i sauniga (ie, le fa'aoga muamua e fa'amaopoopoina fa'amaumauga - o fa'amatalaga o fefa'ataua'iga, ona i ai lea o se taofi i le toe faia, pe a mae'a ona tupu le isi fefa'asoa'iga, ma isi);
  • afai e tele taimi e suia ai se faʻamaumauga, e mafai ona e faʻafeiloaʻi naʻo lona faʻamatalaga lata mai (e le pei o le faʻasologa maualalo, lea o suiga uma e faia i le matai o le a toe taʻalo faʻasolosolo i luga o kopi).

2. E leai ni faʻafitauli i le faʻaogaina o le HTTP exchange, lea e mafai ai ona e faʻaogaina faʻamaumauga mamao.

Tulaga maualuga i le Tarantool DBMS
Alaisa. 2. Toe fai i luga ole HTTP

3. O faʻamaumauga faʻamaumauga i le va o le faʻaliliuina o faʻamaumauga e le tatau ona tutusa (e le gata i lea, i le tulaga lautele, e mafai lava ona faʻaogaina DBMS eseese, gagana polokalame, faʻavae, ma isi).

Tulaga maualuga i le Tarantool DBMS
Alaisa. 3. Toe faia i faiga eseese

O le itu i lalo o le, i le averesi, polokalame e sili atu ona faigata / taugata nai lo le faʻatulagaina, ma nai lo le faʻavasegaina o galuega faʻapipiʻi, e tatau ona e faʻatinoina oe lava.

Afai i lou tulaga o faʻamanuiaga o loʻo i luga e taua tele (poʻo se tulaga talafeagai), ona talafeagai lea o le faʻaogaina o le faʻasologa maualuga. Sei o tatou vaʻavaʻai i le tele o auala e faʻatino ai le faʻasologa o faʻamaumauga maualuga i le Tarantool DBMS.

Fa'aitiitiga o feoaiga

O lea la, o se tasi o faʻamanuiaga o le toe faʻaleleia maualuga o le faʻasaoina o feoaiga. Ina ia mafai ona iloa atoatoa lenei avanoa, e tatau ona faʻaitiitia le aofaʻi o faʻamatalaga faʻafeiloaʻi i taimi o fefaʻatauaiga taitasi. Ioe, e le tatau ona galo ia i tatou i le faaiuga o le sauniga, e tatau ona faʻamaopoopoina le tagata e mauaina faʻamatalaga ma le puna (a itiiti ifo mo lena vaega o faʻamatalaga o loʻo aʻafia i le toe faia).

E fa'afefea ona fa'aitiitia le aofa'i o fa'amatalaga na fa'aliliuina i le taimi o le fa'asologa maualuga? O se fofo tuusa'o e mafai ona filifili fa'amaumauga ile aso ma le taimi. Ina ia faia lenei mea, e mafai ona e faʻaogaina le aso-taimi fanua ua uma ona iai i le laulau (pe a iai). Mo se faʻataʻitaʻiga, o se pepa "poloaiga" atonu e iai se fanua "taimi e manaʻomia ai le faʻatonuga" - delivery_time. O le faʻafitauli i lenei fofo o le tau i lenei fanua e le tatau ona i ai i le faasologa e fetaui ma le fausiaina o poloaiga. E le mafai la ona tatou manatua le maualuga o le tau o le fanua delivery_time, auina atu i le taimi o le fefaʻatauaʻiga muamua, ma i le taimi o le isi fefaʻatauaʻiga, filifili faʻamaumauga uma e maualuga le tau o le fanua delivery_time. O fa'amaumauga e maualalo le tau o fanua atonu na fa'aopoopoina i le va o fefa'asoa'iga delivery_time. E le gata i lea, o le poloaiga na ono faia ni suiga, e ui i lea e leʻi afaina ai le fanua delivery_time. I tulaga uma e lua, o suiga o le a le faʻafeiloaʻi mai le punavai i le mea e alu i ai. Ina ia foia nei faʻafitauli, matou te manaʻomia le tuʻuina atu o faʻamatalaga "faʻapipiʻi". O na. i sauniga fefaʻatauaʻiga taʻitasi o le a matou tuʻuina atu faʻamatalaga uma ma le tau o le fanua delivery_time, e sili atu i se vaega i le taimi ua tuanaʻi (mo se faʻataʻitaʻiga, N itula mai le taimi nei). Ae ui i lea, o loʻo manino mai mo faiga tetele o lenei auala e matua faʻaaogaina ma e mafai ona faʻaitiitia ai le faʻapolopolo o taavale o loʻo tatou taumafai e leai se mea. E le gata i lea, o le laulau o loʻo faʻaliliuina atonu e leai se fanua e fesoʻotaʻi ma se aso-taimi.

O le isi fofo, sili atu ona faigata i le tulaga o le faʻatinoga, o le faʻaalia lea o le mauaina o faʻamaumauga. I lenei tulaga, i taimi o fefaʻatauaiga taʻitasi, e tuʻuina atu faʻamatalaga uma, o le lisiti e leʻi faʻamaonia e le tagata na mauaina. Ina ia faʻatinoina lenei mea, e te manaʻomia le faʻaopoopoina o se koluma Boolean i le laulau faʻapogai (mo se faʻataʻitaʻiga, is_transferred). Afai e talia e le tagata e taliaina le mauaina o le faamaumauga, o le fanua talafeagai e ave le tau true, a maeʻa ona le toe aofia ai le ulufale i fefaʻatauaiga. O lenei filifiliga faʻatinoga o loʻo i ai faʻaletonu nei. Muamua, mo fa'amaumauga ta'itasi e fa'aliliuina, e tatau ona faia ma lafo atu se fa'amatalaga. I se tautalaga fa'apitoa, e mafai ona fa'atusa lenei mea i le fa'aluaina o le aofa'i o fa'amatalaga e fa'aliliu ma ta'ita'ia i le fa'aluaina o le aofa'i o malaga toe fo'i. Lona lua, e leai se avanoa e tu'uina atu ai le fa'amaumauga tutusa i le tele o tagata e taliaina (o le tagata muamua na te mauaina o le a fa'amaonia le lisiti mo ia lava ma mo isi uma).

O se metotia e leai ni fa'aletonu o lo'o tu'uina atu i luga o le fa'aopoopoina lea o se koluma i le laulau fa'aliliu e siaki ai suiga i ona laina. O sea koluma e mafai ona avea ma ituaiga aso-taimi ma e tatau ona seti / faʻafouina e le talosaga i le taimi nei i taimi taʻitasi e faʻaopoopoina / suia faʻamaumauga (atomically ma le faʻaopoopoga / suiga). Mo se faʻataʻitaʻiga, taʻu le koluma update_time. E ala i le fa'asaoina o le maualuga o le tau o lenei koluma mo fa'amaumauga ua tu'uina atu, e mafai ona tatou amataina le isi fa'asalalauga fa'atasi ma lenei tau (filifili fa'amaumauga ma le tau o le fanua. update_time, e sili atu i le tau na teuina muamua). O le faʻafitauli i le auala mulimuli o le suiga o faʻamatalaga e mafai ona tupu i vaega. O se taunuuga o tulaga taua i le koluma update_time atonu e le tulaga ese. O lea la, e le mafai ona fa'aogaina lenei koluma mo fa'asoa fa'asoa (itulau-itulau) fa'amaumauga. Ina ia faʻaalia itulau faʻamaumauga i le itulau, e tatau ona e faia ni auala faʻaopoopo e foliga mai e matua maualalo le lelei (mo se faʻataʻitaʻiga, toe aumai mai le database faamaumauga uma ma le tau. update_time maualuga atu nai lo le tuʻuina atu ma faia se numera patino o faʻamaumauga, e amata mai i se faʻasalaga faʻapitoa mai le amataga o le faʻataʻitaʻiga).

E mafai ona e faʻaleleia le lelei o le faʻaliliuina o faʻamatalaga e ala i le faʻaleleia teisi o le auala muamua. Ina ia faia lenei mea, o le a matou faʻaogaina le integer type (umi integer) e pei o le koluma fanua faʻatatau mo suiga o suiga. Tatou faaigoa le koluma row_ver. Ole tau ole fanua ole koluma lea e tatau lava ona seti/fa'afou i taimi uma e fatu/suia ai se faamaumauga. Ae i lenei tulaga, o le fanua o le a le tuʻuina atu i le aso-taimi o loʻo iai nei, ae o le tau o nisi faʻatau, faʻateleina i le tasi. O se taunuuga, o le koluma row_ver o le a aofia ai tulaga faʻapitoa ma e mafai ona faʻaaogaina e le gata e faʻaalia ai faʻamatalaga "delta" (faʻamatalaga faʻaopoopo / suia talu mai le faaiuga o le fefaʻatauaʻiga muamua), ae faʻapea foʻi ma faigofie ma lelei le talepeina i lalo i itulau.

O le auala mulimuli na tuʻuina atu e faʻaitiitia ai le aofaʻi o faʻamatalaga na tuʻuina atu i totonu o le faʻavae o le toe faʻaleleia maualuga e foliga mai ia te aʻu o le sili ona lelei ma lautele. Se'i o tatou va'ai atili i ai.

Fa'asalalauina Fa'amatalaga Fa'aaogāina Fa'amatalaga Fa'asologa o Laila

Fa'atinoga o le 'au'aunaga/vaega matai

I le MS SQL Server, o loʻo i ai se ituaiga koluma faʻapitoa e faʻatino ai lenei faiga - rowversion. O fa'amaumauga ta'itasi e iai se fa'atau e fa'asili i le tasi i taimi uma e fa'aopoopo/suia ai se fa'amaumauga i se laulau e iai se koluma fa'apei rowversion. O le tau o lenei fata e otometi lava ona tu'uina atu i le fanua o lenei koluma i totonu o fa'amaumauga fa'aopoopo/suia. O le Tarantool DBMS e leai se faʻaogaina tutusa i totonu. Ae ui i lea, i Tarantool e le faigata ona faʻatinoina ma le lima. Sei o tatou vaai pe faapefea ona fai lenei mea.

Muamua, o sina faʻamatalaga: laulau i Tarantool e taʻua o avanoa, ma faʻamaumauga e taʻua o tuples. I Tarantool e mafai ona e fatuina faʻasologa. O fa'asologa e leai se mea e sili atu nai lo fa'aigoaina generators o fa'atonuga fa'atasi. O na. o le mea tonu lava lea tatou te manaomia mo o tatou faamoemoega. I lalo ifo o le a tatou fatuina se faasologa faapena.

Aʻo leʻi faia soʻo se faʻamaumauga faʻamaumauga i Tarantool, e tatau ona e faʻataʻitaʻiina le poloaiga lenei:

box.cfg{}

O se taunuuga, Tarantool o le a amata ona tusia faʻamaumauga faʻamaumauga ma faʻamaumauga o fefaʻatauaiga i le lisi o loʻo iai nei.

Tatou fai se fa'asologa row_version:

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

Filifiliga if_not_exists fa'atagaina le fa'asologa o le fatuga e fa'atino i le tele o taimi: afai o lo'o iai le mea, o le a le toe taumafai Tarantool e toe faia. O lenei filifiliga o le a faʻaaogaina i tulafono uma DDL mulimuli ane.

Tatou faia se avanoa e fai ma fa'ata'ita'iga.

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

O iinei matou te setiina ai le igoa o le avanoa (goods), igoa fanua ma o latou ituaiga.

Auto-incrementing fanua i Tarantool e faia foi e faʻaaoga ai faʻasologa. Se'i o tatou fa'atupuina se ki fa'aopoopo fa'a-autometi ile fanua 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
})

E lagolagoina e Tarantool le tele o ituaiga o faasino igoa. O fa'ailoga e masani ona fa'aaogaina o la'au ma HASH ituaiga, lea e fa'avae i luga o fausaga e fetaui ma le igoa. TREE o le fa'ailoga sili ona fa'aogaina. E fa'atagaina oe e toe aumai fa'amaumauga i se faiga fa'atulagaina. Ae mo filifiliga tutusa, HASH e sili atu ona talafeagai. E tusa ai, e fautuaina e faʻaaoga HASH mo le ki autu (o le mea lea na matou faia).

E fa'aoga le koluma row_ver e faʻafeiloaʻi faʻamatalaga ua suia, e tatau ona e fusifusia faʻasologa faʻasologa i fanua o lenei koluma row_ver. Ae e le pei o le ki autu, o le koluma fanua tau row_ver e tatau ona faateleina i le tasi e le gata pe a faaopoopo faamaumauga fou, ae faapea foi pe a suia faamaumauga oi ai. E mafai ona e faʻaogaina faʻailoga mo lenei mea. Tarantool e lua ituaiga o avanoa avanoa: before_replace и on_replace. E fa'aoso fa'aoso i so'o se taimi e suia ai fa'amaumauga i le avanoa (mo tuple ta'itasi e a'afia i suiga, e fa'alauiloa ai se galuega fa'aoso). E le pei on_replace, before_replace-triggers e mafai ai ona e suia faʻamatalaga o le tuple lea e faʻatino ai le faʻaoso. E tusa ai, o le ituaiga mulimuli o faʻaoso e fetaui ma i tatou.

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

O le fa'aoso lea e sui ai le tau o le fanua row_ver teuina tuple i le isi tau o le faasologa row_version.

Ina ia mafai ona aveese faʻamatalaga mai le vateatea goods i koluma row_ver, se'i tatou faia se fa'ailoga:

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

Ituaiga faasino igoa - laau (TREE), ona matou te manaʻomia le suʻeina o faʻamatalaga i luga o le faasologa o tau i le koluma row_ver.

Tatou fa'aopoopo nisi fa'amatalaga ile avanoa:

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}

Aua O le fanua muamua o le fa'aopoopo fa'a-autometi; matou te pasi e leai. Tarantool o le a otometi lava ona sui le isi tau. E faapena foi, e pei o le tau o fanua koluma row_ver e mafai ona e pasi nil - pe le faʻamaonia le tau, aua o lenei koluma e nofo i le tulaga mulimuli i le avanoa.

Se'i o tatou siaki le taunu'uga fa'aofi:

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

E pei ona e vaʻai, o le muamua ma le fanua mulimuli e faʻatumu otometi. O le taimi nei o le a faigofie ona tusia se galuega mo le faʻapipiʻiina o itulau i lea itulau o suiga avanoa 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

O le galuega e ave e fai ma parakalafa le tau row_ver, e amata mai i le mea e manaʻomia ai le laʻuina o suiga, ma toe faʻafoʻi se vaega o faʻamatalaga ua suia.

O faʻataʻitaʻiga faʻamatalaga i Tarantool e faia e ala i faʻamatalaga. Galuega get_goods fa'aaogaina se fa'amatalaga e ala ile fa'asinomaga row_ver e maua ai fa'amaumauga ua suia. O le ituaiga faʻamatalaga o le GT (Greater Than, greater than). O lona uiga o le a faʻasolosolo faʻasolosolo e le tagata suʻesuʻe ia faʻamaufaʻailoga e amata mai le ki ua pasia (taua fanua row_ver).

E toe fa'afo'i tuple e le tagata fa'atonu. Ina ia mafai mulimuli ane ona faʻafeiloaʻi faʻamatalaga e ala i le HTTP, e manaʻomia le faʻaliliuina o tuples i se fausaga talafeagai mo le faʻasologa mulimuli ane. O le faʻataʻitaʻiga e faʻaaogaina le galuega masani mo lenei tomap. Nai lo le faʻaaogaina tomap e mafai ona e tusia lau lava galuega. Mo se faʻataʻitaʻiga, atonu tatou te mananaʻo e toe faʻaigoaina se fanua name, aua le pasia le fanua code ma faaopoopo se fanua 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

Ole tele ole itulau ole fa'amaumauga o galuega (numera o fa'amaumauga i le vaega e tasi) e fa'atatau i le fesuiaiga page_size. I le faataitaiga o le tau page_size o le 5. I se polokalama moni, o le tele o itulau e masani ona sili atu ona taua. E fa'alagolago i le tele o le tuple avanoa. Ole tele ole itulau ole lapo'a e mafai ona fa'amautu fa'apitoa ile fuaina ole taimi ole fa'aliliuina o fa'amatalaga. O le tele o le itulau, o le laʻititi foi lea o le numera o malaga i le va o le auina atu ma le mauaina. O le auala lea e mafai ai ona fa'aitiitia le taimi atoa mo le la'uina o suiga. Ae peita'i, afai e telē tele le lapo'a o le itulau, o le a tatou fa'aalu umi tele i luga o le 'au'aunaga fa'asologa o le fa'ata'ita'iga. O le i'uga, e ono fa'atuai i le faiga o isi talosaga e o'o mai i le 'au'aunaga. Parameter page_size e mafai ona utaina mai le faila faatulagaina. Mo avanoa faʻasalalau taʻitasi, e mafai ona e setiina lona lava taua. Ae peita'i, mo le tele o avanoa o le tau fa'aletonu (fa'ata'ita'iga, 100) e ono fetaui.

Tatou faatino le galuega 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
...

Tatou ave le tau o le fanua row_ver mai le laina mulimuli ma toe valaau le galuega:

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

Faapena foi:

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

E pei ona e vaʻai, pe a faʻaaogaina i lenei auala, o le galuega e toe faʻafoʻi uma faʻamaumauga avanoa itulau i itulau goods. O le itulau mulimuli e sosoo ai ma se filifiliga avanoa.

Tatou fai suiga ile avanoa:

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

Ua matou suia le tau o le fanua name mo se tusi e tasi ma faaopoopo i ai ni tala fou se lua.

Se'i o tatou toe fai le valaau galuega mulimuli:

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

Na toe fa'afo'i e le galuega le fa'amaumauga ua suia ma fa'aopoopo. O le galuega la get_goods e mafai ai ona e mauaina faʻamatalaga ua suia talu mai lona valaʻau mulimuli, o le faʻavae lea o le auala toe faʻaaogaina o loʻo iloiloina.

Matou te tuʻuina atu le tuʻuina atu o taunuʻuga e ala i le HTTP i le tulaga o le JSON i fafo atu o le lautele o lenei tusiga. E mafai ona e faitau e uiga i lenei mea iinei: https://habr.com/ru/company/mailru/blog/272141/

Fa'atinoga ole vaega ole kalani/pologa

Se'i o tatou va'ava'ai pe fa'apefea le fa'atinoga a le itu e mauaina. Sei o tatou faia se avanoa i le itu e maua ai e teu ai faʻamaumauga na sii mai:

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

O le fausaga o le avanoa e pei o le fausaga o le avanoa i le puna. Ae talu ai o le a matou le pasia faʻamatalaga maua i se isi mea, o le koluma row_ver e le o iai i le avanoa o le tagata e mauaina. I le fanua id o le a fa'amaumau fa'amatalaga fa'apogai. O le mea lea, i luga o le itu e taliaina e leai se mea e manaʻomia e fai ai le auto-incrementing.

E le gata i lea, matou te manaʻomia se avanoa e faʻasaoina ai tau 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
})

Mo avanoa uma e utaina (fanua space_name) matou te faʻasaoina le tau faʻatau mulimuli iinei row_ver (fanua value). O le koluma e fai ma ki autu space_name.

Se'i fai se galuega e uta ai fa'amatalaga avanoa goods ala HTTP. Ina ia faia lenei mea, matou te manaʻomia se faletusi e faʻaaogaina se tagata faʻatau HTTP. O le laina o loʻo i lalo e utaina le faletusi ma faʻaalia le tagata HTTP client:

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

Matou te manaʻomia foi se faletusi mo le json deserialization:

local json = require('json')

Ua lava lea e fatu ai se galuega e utaina ai faamatalaga:

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

O le galuega e faʻatino se talosaga HTTP i le tuatusi url ma auina atu row_ver e fai ma fa'ailoga ma toe fa'afo'i mai le fa'ai'uga fa'aleaogaina o le talosaga.

Ole galuega mo le fa'asaoina o fa'amatalaga na maua e pei o lenei:

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

Ta'amilosaga o le fa'asaoina o fa'amaumauga i le vateatea goods tuʻu i se fefaʻatauaiga (o loʻo faʻaaogaina le galuega mo lenei box.atomic) e faʻaitiitia ai le numera o gaioiga faʻapipiʻi.

Mulimuli ane, o le galuega fa'akomepiuta avanoa fa'apitonu'u goods faʻatasi ai ma se puna e mafai ona e faʻatinoina e pei o lenei:

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

Muamua matou te faitau i le tau na faʻasaoina muamua row_ver mo avanoa goods. Afai e misi (le sauniga fefaʻatauaʻiga muamua), ona matou faʻaaogaina lea row_ver o. O le isi i le taamilosaga matou te faia ai se itulau-i-itulau download o faʻamatalaga suia mai le puna i le url faʻamaonia. I faʻasalalauga taʻitasi, matou te faʻasaoina faʻamatalaga maua i le avanoa faʻapitonuʻu talafeagai ma faʻafouina le tau row_ver (i le vateatea row_ver ma i le fesuiaiga row_ver) - ave le tau row_ver mai le laina mulimuli o faʻamatalaga faʻapipiʻiina.

Ina ia puipuia mai faʻalavelave faʻafuaseʻi (i le tulaga o se mea sese i le polokalama), o le matasele while e mafai ona suia e for:

for _ = 1, max_req do ...

O se taunuuga o le faʻatinoina o le galuega sync_goods avanoa goods o le a maua e le tagata e taliaina lomiga aupito lata mai o fa'amaumauga avanoa uma goods i le puna.

E manino lava, e le mafai ona faʻasalalau faʻamaumauga i lenei auala. Afai e iai se mana'oga faapena, e mafai ona e fa'aogaina se fa'ailoga tape. Faaopoopo i avanoa goods fanua boolean is_deleted ma nai lo le tapeina faaletino o se faamaumauga, matou te faʻaaogaina le tapeina talafeagai - matou te setiina le tau o le fanua is_deleted i le uiga true. O nisi taimi nai lo se fanua boolean is_deleted e sili atu ona faigofie le faʻaogaina o le fanua deleted, lea e teu ai le aso-taimi o le tapeina talafeagai o le faamaumauga. A maeʻa ona faʻatinoina se tapeina talafeagai, o le faʻamaumauga ua faailogaina mo le tapeina o le a faʻafeiloaʻi mai le puna i le mea e alu i ai (e tusa ai ma le faʻamatalaga o loʻo talanoaina i luga).

Faʻasologa row_ver e mafai ona fa'aoga e fa'asalalauina fa'amatalaga mai isi avanoa: e leai se mana'oga e fai se fa'asologa ese mo avanoa fa'asalalau ta'itasi.

Na matou vaʻavaʻai i se auala lelei o le faʻasologa o faʻamaumauga maualuga i talosaga e faʻaaoga ai le Tarantool DBMS.

sailiiliga

  1. Tarantool DBMS o se mea matagofie, faʻamaonia oloa mo le fatuina o talosaga maualuga.
  2. O le fa'asologa o fa'amaumauga maualuga e iai le tele o fa'amanuiaga nai lo le fa'asologa o tulaga maualalo.
  3. O le auala maualuga o le toe faia o faʻamatalaga o loʻo talanoaina i totonu o le tusiga e mafai ai ona e faʻaitiitia le aofaʻi o faʻamatalaga faʻafeiloaʻi e ala i le faʻaliliuina naʻo na faʻamaumauga ua suia talu mai le taimi o fefaʻatauaiga mulimuli.

puna: www.habr.com

Faaopoopo i ai se faamatalaga