Macasamhlú ardleibhéil i DBMS Tarantool

Dia duit, táim ag cruthú feidhmchláir do DBMS Tarantool ardán atá forbartha ag Mail.ru Group a chomhcheanglaíonn DBMS ardfheidhmíochta agus freastalaí feidhmchláir sa teanga Lua. Baintear amach an luas ard réitigh atá bunaithe ar Tarantool, go háirithe, mar gheall ar thacaíocht do mhodh in-chuimhne an DBMS agus an cumas chun loighic gnó iarratais a fhorghníomhú i spás seoladh amháin le sonraí. Ag an am céanna, áirithítear marthanacht sonraí ag baint úsáide as idirbhearta ACID (coimeádtar logáil WAL ar an diosca). Tá tacaíocht ionsuite ag Tarantool le haghaidh macasamhlú agus bearrtha. Ag tosú ó leagan 2.1, tacaítear le fiosruithe i dteanga SQL. Is foinse oscailte é Tarantool agus tá sé ceadúnaithe faoin gceadúnas BSD Simplithe. Tá leagan Fiontar tráchtála ann freisin.

Macasamhlú ardleibhéil i DBMS Tarantool
Mothaigh an chumhacht! (…bain sult as an léiriú)

Déanann an méid thuas go léir ardán tarraingteach do Tarantool chun feidhmchláir bhunachar sonraí ard-ualaigh a chruthú. In iarratais den sórt sin, is minic go mbíonn gá le sonraí a mhacasamhlú.

Mar a luadh thuas, tá macasamhlú sonraí ionsuite ag Tarantool. Is é prionsabal a oibríochta na hidirbhearta go léir atá sa mháistirlog (WAL) a fhorghníomhú go seicheamhach ar mhacasamhlacha. De ghnáth macasamhlú den sórt sin (cuirfimid glaoch air tuilleadh leibhéal íseal) a úsáidtear chun lamháltas lochtanna feidhmchláir a áirithiú agus/nó chun an t-ualach léitheoireachta a dháileadh idir nóid bhraisle.

Macasamhlú ardleibhéil i DBMS Tarantool
Rís. 1. Macasamhlú laistigh de bhraisle

Sampla de chás eile is ea sonraí a chruthaítear i mbunachar sonraí amháin a aistriú go dtí bunachar sonraí eile le haghaidh próiseála/monatóireachta. Sa chás deiridh sin, d'fhéadfadh go mbeadh réiteach níos áisiúla le húsáid ardleibhéil macasamhlú - macasamhlú sonraí ag leibhéal loighic ghnó an fheidhmchláir. Iad siúd. Ní úsáidimid réiteach réamhdhéanta atá ionsuite sa DBMS, ach cuirimid macasamhlú i bhfeidhm orainn féin laistigh den fheidhmchlár atá á fhorbairt againn. Tá buntáistí agus míbhuntáistí ag baint leis an gcur chuige seo. Déanaimis liosta de na buntáistí.

1. Coigilteas tráchta:

  • Ní féidir leat na sonraí go léir a aistriú, ach níl ach cuid de (mar shampla, ní féidir leat ach roinnt táblaí a aistriú, cuid dá gcolúin nó taifid a chomhlíonann critéar áirithe);
  • Murab ionann agus macasamhlú leibhéal íseal, a dhéantar go leanúnach i mód asincrónach (arna chur i bhfeidhm sa leagan reatha de Tarantool - 1.10) nó sioncrónach (le cur i bhfeidhm i leaganacha ina dhiaidh sin de Tarantool), is féidir macasamhlú ardleibhéil a dhéanamh i seisiúin (i.e., an déanann an t-iarratas na sonraí a shioncrónú ar dtús - sonraí seisiún malairte, ansin tá sos i macasamhlú, tar éis a dtarlaíonn an chéad seisiún malairte eile, etc.);
  • má tá taifead athraithe arís agus arís eile, ní féidir leat ach a leagan is déanaí a aistriú (murab ionann agus macasamhlú leibhéal íseal, ina ndéanfar na hathruithe go léir a dhéantar ar an máistir a imirt ar ais go seicheamhach ar na macasamhla).

2. Níl aon deacrachtaí ann le malartú HTTP a chur i bhfeidhm, rud a ligeann duit bunachair shonraí iargúlta a shioncrónú.

Macasamhlú ardleibhéil i DBMS Tarantool
Rís. 2. Macasamhlú thar HTTP

3. Ní gá go mbeadh na struchtúir bhunachar sonraí ina n-aistrítear sonraí mar an gcéanna (ina theannta sin, sa chás ginearálta, is féidir fiú DBMSanna éagsúla, teangacha ríomhchlárúcháin, ardáin, etc. a úsáid).

Macasamhlú ardleibhéil i DBMS Tarantool
Rís. 3. Macasamhlú i gcórais ilchineálacha

Is é an míbhuntáiste, ar an meán, go bhfuil ríomhchlárú níos deacra / níos costasaí ná cumraíocht, agus in ionad an fheidhmiúlacht ionsuite a shaincheapadh, beidh ort do chuid féin a chur i bhfeidhm.

Más rud é i do chás go bhfuil na buntáistí thuas ríthábhachtach (nó gur coinníoll riachtanach iad), ansin is ciall duit macasamhlú ardleibhéil a úsáid. Breathnaímid ar roinnt bealaí chun macasamhlú sonraí ardleibhéil a chur i bhfeidhm sa Tarantool DBMS.

Íoslaghdú tráchta

Mar sin, ceann de na buntáistí a bhaineann le macasamhlú ardleibhéil ná coigilteas tráchta. Chun an buntáiste seo a bhaint amach go hiomlán, is gá an méid sonraí a aistrítear le linn gach seisiún malartaithe a íoslaghdú. Ar ndóigh, níor cheart dúinn dearmad a dhéanamh, ag deireadh an tseisiúin, go gcaithfear an glacadóir sonraí a shioncronú leis an bhfoinse (ar a laghad don chuid sin de na sonraí a bhfuil baint acu le macasamhlú).

Conas an méid sonraí a aistrítear le linn macasamhlú ardleibhéil a íoslaghdú? Réiteach simplí a d’fhéadfadh a bheith ann sonraí a roghnú de réir dáta agus ama. Chun seo a dhéanamh, is féidir leat an réimse dáta-ama atá sa tábla cheana féin a úsáid (má tá sé ann). Mar shampla, d’fhéadfadh go mbeadh réimse “am forghníomhaithe ordaithe riachtanach” i ndoiciméad “ordú” - delivery_time. Is í an fhadhb leis an réiteach seo ná nach gá go mbeadh na luachanna sa réimse seo san ord a fhreagraíonn do chruthú orduithe. Mar sin ní féidir linn cuimhneamh ar an luach uasta réimse delivery_time, a tharchuirtear le linn an tseisiúin malairte roimhe seo, agus le linn an chéad seisiún malairte eile roghnaigh na taifid go léir a bhfuil luach réimse níos airde acu delivery_time. D’fhéadfadh sé gur cuireadh taifid a bhfuil luach réimse níos ísle acu idir seisiúin mhalartaithe delivery_time. Chomh maith leis sin, d'fhéadfadh an t-ordú tar éis dul faoi athruithe, mar sin féin ní raibh tionchar acu ar an réimse delivery_time. Sa dá chás, ní aistreofar na hathruithe ón bhfoinse go dtí an ceann scríbe. Chun na fadhbanna seo a réiteach, beidh orainn sonraí "forluiteacha" a aistriú. Iad siúd. i ngach seisiún malairte aistreoimid na sonraí go léir leis an luach réimse delivery_time, níos mó ná pointe éigin san am atá caite (mar shampla, N uair an chloig ón nóiméad reatha). Mar sin féin, is léir go bhfuil an cur chuige seo fíor-iomarcúil do chórais mhóra agus gur féidir leis an coigilteas tráchta a bhfuilimid ag iarraidh a bhaint amach a laghdú go dtí rud ar bith. Ina theannta sin, d'fhéadfadh sé nach mbeadh réimse a bhaineann le dáta-am ag an tábla atá á aistriú.

Réiteach eile, atá níos casta ó thaobh cur i bhfeidhm de, is ea admháil go bhfuarthas sonraí. Sa chás seo, le linn gach seisiún malartaithe, tarchuirtear na sonraí go léir, nach bhfuil an admháil deimhnithe ag an bhfaighteoir. Chun é seo a chur i bhfeidhm, beidh ort colún Boole a chur leis an tábla foinse (mar shampla, is_transferred). Má admhaíonn an glacadóir go bhfuarthas an taifead, tógann an réimse comhfhreagrach an luach true, ina dhiaidh sin níl baint ag an iontráil le malartuithe a thuilleadh. Tá na míbhuntáistí seo a leanas ag an rogha cur chun feidhme seo. Ar dtús, i gcás gach taifead a aistrítear, ní mór admháil a ghiniúint agus a sheoladh. Go garbh, d’fhéadfadh sé seo a bheith inchomparáide leis an méid sonraí a aistrítear a dhúbailt agus líon na dturas timpeall a dhúbailt dá bharr. Ar an dara dul síos, ní féidir an taifead céanna a sheoladh chuig roinnt glacadóirí (deimhneoidh an chéad ghlacadóir a gheobhaidh admháil dó féin agus do na cinn eile go léir).

Modh nach bhfuil na míbhuntáistí thuas ann ná colún a chur leis an tábla tarchurtha chun athruithe ina sraitheanna a rianú. Is féidir le colún den sórt sin a bheith de chineál dáta-ama agus ní mór é a shocrú/uasdátú leis an bhfeidhmchlár go dtí an t-am reatha gach uair a chuirtear nó a athraítear taifid (go hatamach leis an suimiú/athrú). Mar shampla, déanaimis glaoch ar an gcolún update_time. Trí uasluach réimse an cholúin seo a shábháil le haghaidh na dtaifead aistrithe, is féidir linn an chéad seisiún malairte eile a thosú leis an luach seo (roghnaigh taifid leis an luach réimse update_time, níos mó ná an luach a stóráiltear roimhe seo). Is í an fhadhb atá leis an gcur chuige deiridh ná gur féidir le hathruithe sonraí tarlú i mbaisceanna. Mar thoradh ar na luachanna réimse sa cholún update_time b'fhéidir nach bhfuil siad uathúil. Mar sin, ní féidir an colún seo a úsáid le haghaidh aschur sonraí roinnte (leathanach ar leathanach). Chun sonraí a thaispeáint leathanach ar leathanach, beidh ort meicníochtaí breise a chumadh a mbeidh éifeachtúlacht an-íseal acu is dócha (mar shampla, gach taifead leis an luach a aisghabháil ón mbunachar sonraí update_time níos airde ná ceann ar leith agus líon áirithe taifead á dtáirgeadh, ag tosú ó fhritháireamh áirithe ó thús an tsampla).

Is féidir leat éifeachtúlacht an aistrithe sonraí a fheabhsú trí fheabhas a chur ar an gcur chuige roimhe seo. Chun seo a dhéanamh, úsáidfimid an cineál slánuimhir (slánuimhir fhada) mar luachanna réimse an cholúin chun athruithe a rianú. Ainmnímid an colún row_ver. Ní mór go fóill luach réimse an cholúin seo a shocrú/a nuashonrú gach uair a chruthaítear/athraítear taifead. Ach sa chás seo, ní bheidh an réimse a shannadh an dáta-am atá ann faoi láthair, ach an luach roinnt gcuntar, méadú de cheann amháin. Mar thoradh air sin, an colún row_ver beidh luachanna uathúla ann agus is féidir iad a úsáid ní hamháin chun sonraí “delta” a thaispeáint (sonraí a cuireadh leis/athraíodh ó dheireadh an tseisiúin mhalartaithe roimhe sin), ach freisin chun iad a bhriseadh síos ina leathanaigh go simplí agus go héifeachtach.

Is cosúil domsa gurb é an modh deireanach atá molta chun an méid sonraí a aistrítear faoi chuimsiú an mhacasamhlú ardleibhéil a íoslaghdú, an modh is fearr agus is uilíoch. A ligean ar breathnú ar sé níos mine.

Sonraí a Chur ar Aghaidh Ag Úsáid Áiritheoir Leaganacha Ró

Cur i bhfeidhm an fhreastalaí/mháistirpháirte

In MS SQL Server, tá cineál colún speisialta ann chun an cur chuige seo a chur i bhfeidhm - rowversion. Tá cuntar ag gach bunachar sonraí a mhéadaíonn ceann amháin gach uair a chuirtear taifead leis/athraítear i dtábla a bhfuil a leithéid de cholún aige rowversion. Sanntar luach an chuntar seo go huathoibríoch do réimse an cholúin seo sa taifead breise/athraithe. Níl meicníocht ionsuite den chineál céanna ag an Tarantool DBMS. Mar sin féin, i Tarantool níl sé deacair é a chur i bhfeidhm de láimh. Breathnaímid ar conas a dhéantar é seo.

Ar dtús, beagán téarmaíochta: tugtar spásanna ar tháblaí i Tarantool, agus tugtar tuples ar thaifid. I Tarantool is féidir leat seichimh a chruthú. Níl i gceist le seichimh ach gineadóirí ainmnithe de luachanna slánuimhir ordaithe. Iad siúd. is é seo go díreach a theastaíonn uainn chun ár gcríocha. Anseo thíos cruthóimid seicheamh den sórt sin.

Sula ndéanfaidh tú aon oibríocht bunachar sonraí i Tarantool, ní mór duit an t-ordú seo a leanas a rith:

box.cfg{}

Mar thoradh air sin, tosóidh Tarantool ag scríobh pictiúir bhunachar sonraí agus logaí idirbheart chuig an eolaire reatha.

Déanaimis seicheamh a chruthú row_version:

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

Rogha if_not_exists is féidir an script chruthaithe a fhorghníomhú go minic: má tá an réad ann, ní dhéanfaidh Tarantool iarracht é a chruthú arís. Úsáidfear an rogha seo i ngach ordú DDL ina dhiaidh sin.

Cruthaímid spás mar shampla.

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

Anseo leagaimid ainm an spáis (goods), ainmneacha páirce agus a gcineálacha.

Cruthaítear réimsí uath-mhéadaithe i Tarantool freisin ag baint úsáide as seichimh. A ligean ar a chruthú eochair bunscoile uathoibríoch-incrementing de réir réimse 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
})

Tacaíonn Tarantool le roinnt cineálacha innéacsanna. Is iad na hinnéacsanna is coitianta a úsáidtear ná cineálacha TREE agus HASH, atá bunaithe ar struchtúir a fhreagraíonn don ainm. Is é TREE an cineál innéacs is versatile. Ligeann sé duit sonraí a aisghabháil ar bhealach eagraithe. Ach le haghaidh roghnú comhionannais, tá HASH níos oiriúnaí. Dá réir sin, tá sé inmholta HASH a úsáid don phríomheochair (is é sin a rinne muid).

Chun an colún a úsáid row_ver chun sonraí athraithe a aistriú, ní mór duit luachanna seicheamh a cheangal le réimsí an cholúin seo row_ver. Ach murab ionann agus an eochair bunscoile, an luach réimse colún row_ver Ba chóir go n-ardóidh sé ceann amháin, ní hamháin nuair a chuirtear taifid nua leis, ach freisin nuair a athraítear na cinn atá ann cheana féin. Is féidir leat truicear a úsáid chuige seo. Tá dhá chineál truicear spáis ag Tarantool: before_replace и on_replace. Díbrítear truicear nuair a athraíonn na sonraí sa spás (do gach tuple a mbíonn tionchar ag na hathruithe orthu, seoltar feidhm truicear). Murab ionann on_replace, before_replaceCeadaíonn -triggers duit sonraí an tuple as a ndéantar an truicear a mhodhnú. Dá réir sin, oireann an cineál deireanach truicear dúinn.

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

Tagann an truicear seo a leanas in ionad luach an réimse row_ver stóráilte tuple go dtí an chéad luach eile den seicheamh row_version.

Chun a bheith in ann sonraí a bhaint as spás goods de réir colún row_ver, cruthaimis innéacs:

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

Cineál innéacs - crann (TREE), mar beidh orainn a bhaint as na sonraí in ord ardaitheach na luachanna sa cholún row_ver.

Cuirimis roinnt sonraí leis an spás:

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}

Mar Is é an chéad réimse ná cuntar incriminteach uathoibríoch; ní dhéanaimid pas náid ina ionad. Cuirfidh Tarantool an chéad luach eile in ionad go huathoibríoch. Mar an gcéanna, mar luach na réimsí colún row_ver is féidir leat pas a fháil nialas - nó nach bhfuil a shonrú ar an luach ar chor ar bith, mar gheall ar tá an colún seo sa suíomh deireanach sa spás.

Déanaimis an toradh ionchuir a sheiceáil:

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

Mar a fheiceann tú, líontar an chéad réimse agus an ceann deireanach isteach go huathoibríoch. Anois beidh sé éasca feidhm a scríobh chun athruithe spáis a uaslódáil leathanach ar leathanach 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

Glacann an fheidhm an luach mar pharaiméadar row_ver, ag tosú óna bhfuil sé riachtanach athruithe a dhíluchtú, agus cuireann sé cuid de na sonraí athraithe ar ais.

Déantar sampláil sonraí i Tarantool trí innéacsanna. Feidhm get_goods úsáideann iterator de réir innéacs row_ver chun sonraí athraithe a fháil. Is cineál iterator GT (Níos mó ná, níos mó ná). Ciallaíonn sé seo go dtrasnaíonn an t-iterator go seicheamhach na luachanna innéacs ag tosú ón eochair a ritheadh ​​​​(luach réimse row_ver).

Filleann an t-iterator tuples. D'fhonn a bheith in ann sonraí a aistriú trí HTTP ina dhiaidh sin, is gá na tuples a thiontú go struchtúr atá áisiúil le haghaidh sraithiú ina dhiaidh sin. Úsáideann an sampla an fheidhm chaighdeánach chuige seo tomap. In ionad úsáid a bhaint as tomap is féidir leat d’fheidhm féin a scríobh. Mar shampla, b'fhéidir gur mhaith linn réimse a athainmniú name, ná pas a fháil sa réimse code agus cuir réimse 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

Cinneann an athróg méid leathanaigh na sonraí aschuir (líon na dtaifead i gcuid amháin). page_size. Sa sampla an luach page_size Is é 5. I bhfíorchlár, bíonn níos mó tábhachta ag baint le méid an leathanaigh. Braitheann sé ar mheánmhéid an tuple spáis. Is féidir méid an leathanaigh is fearr a chinneadh go heimpíreach trí am aistrithe sonraí a thomhas. Dá mó méid an leathanaigh, is ea is lú líon na dturas cruinne idir an taobh seolta agus glactha. Ar an mbealach seo is féidir leat an t-am iomlán le haghaidh athruithe a íoslódáil a laghdú. Mar sin féin, má tá méid an leathanaigh ró-mhór, caithfimid ró-fhada ar an bhfreastalaí ag sraithiú an tsampla. Mar thoradh air sin, d'fhéadfadh go mbeadh moill ar phróiseáil iarratais eile a thagann chuig an bhfreastalaí. Paraiméadar page_size is féidir é a luchtú ón gcomhad cumraíochta. I gcás gach spás tarchurtha, is féidir leat a luach féin a shocrú. Mar sin féin, d'fhéadfadh an luach réamhshocraithe (mar shampla, 100) a bheith oiriúnach don chuid is mó de spásanna.

Déanaimis an fheidhm a fhorghníomhú 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
...

Glacaimis luach na páirce row_ver ón líne dheireanach agus glaoigh ar an bhfeidhm arís:

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

Arís:

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

Mar a fheiceann tú, nuair a úsáidtear é ar an mbealach seo, filleann an fheidhm na taifid spáis go léir leathanach ar leathanach goods. Tar éis an leathanach deiridh tá rogha folamh.

Déanaimis athruithe ar an spás:

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

Tá luach na páirce athraithe againn name d’iontráil amháin agus cuireadh dhá iontráil nua leis.

Déanaimis an glao feidhme deiridh arís:

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

Chuir an fheidhm na taifid athraithe agus curtha leis ar ais. Mar sin an fheidhm get_goods ligeann sé duit sonraí a fháil a d’athraigh ón nglao deiridh, atá mar bhunús leis an modh macasamhlaithe atá á bhreithniú.

Fágfaimid eisiúint torthaí trí HTTP i bhfoirm JSON lasmuigh de raon feidhme an ailt seo. Is féidir leat léamh faoi seo anseo: https://habr.com/ru/company/mailru/blog/272141/

Cur i bhfeidhm na coda cliaint/sclábhaí

Breathnaímid ar an gcuma atá ar fheidhmiú an taobh glactha. Cruthaímid spás ar an taobh glactha chun na sonraí íoslódáilte a stóráil:

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

Tá struchtúr an spáis cosúil le struchtúr an spáis sa fhoinse. Ach ós rud é nach bhfuil muid ag dul chun pas a fháil ar na sonraí a fuarthas áit ar bith eile, an colún row_ver nach bhfuil i spás an fhaighteora. I réimse id déanfar aitheantóirí foinse a thaifeadadh. Dá bhrí sin, ar thaobh an ghlacadóra ní gá é a dhéanamh go huathoibríoch incriminteach.

Ina theannta sin, ní mór dúinn spás a shábháil luachanna 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
})

I gcás gach spás luchtaithe (réimse space_name) sábhálfaimid an luach luchtaithe deiridh anseo row_ver (Gort value). Feidhmíonn an colún mar phríomheochair space_name.

Cruthaímid feidhm chun sonraí spáis a luchtú goods trí HTTP. Chun seo a dhéanamh, ní mór dúinn leabharlann a chuireann cliant HTTP i bhfeidhm. Lódálann an líne seo a leanas an leabharlann agus cuireann sé an cliant HTTP ar an toirt:

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

Teastaíonn leabharlann uainn freisin le haghaidh díscriosú json:

local json = require('json')

Is leor é seo chun feidhm lódála sonraí a chruthú:

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

Déanann an fheidhm iarratas HTTP a fhorghníomhú chuig an seoladh url agus seolann í row_ver mar pharaiméadar agus cuireann sé ar ais an toradh díscriúnaithe ar an iarratas.

Breathnaíonn an fheidhm chun sonraí faighte a shábháil mar seo:

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

Timthriall chun sonraí a shábháil go spás goods a chuirtear in idirbheart (úsáidtear an fheidhm chuige seo box.atomic) chun líon na n-oibríochtaí diosca a laghdú.

Ar deireadh, an fheidhm sioncrónaithe spáis áitiúil goods le foinse is féidir leat é a chur i bhfeidhm mar seo:

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

An Chéad léigh muid an luach a shábháil roimhe seo row_ver don spás goods. Má tá sé ar iarraidh (an chéad seisiún malairte), ansin a chur orainn é mar row_ver nialas. Ansin sa timthriall déanaimid íoslódáil leathanach ar leathanach de na sonraí athraithe ón bhfoinse ag an url sonraithe. Ag gach atriall, sábhálaimid na sonraí faighte chuig an spás áitiúil cuí agus nuashonraímid an luach row_ver (sa spás row_ver agus san athróg row_ver) - tóg an luach row_ver ón líne dheireanach de shonraí luchtaithe.

Chun cosaint a dhéanamh i gcoinne lúbadh thaisme (i gcás earráide sa chlár), an lúb while is féidir a chur in ionad for:

for _ = 1, max_req do ...

Mar thoradh ar an fheidhm a fhorghníomhú sync_goods spás goods beidh na leaganacha is déanaí de gach taifead spáis sa ghlacadóir goods sa bhfoinse.

Ar ndóigh, ní féidir scriosadh sonraí a chraoladh ar an mbealach seo. Má tá a leithéid de riachtanas ann, is féidir leat marc scriosta a úsáid. Cuir leis an spás goods réimse boolean is_deleted agus in ionad taifead a scriosadh go fisiciúil, úsáidimid scriosadh loighciúil - socraímid luach an réimse is_deleted isteach sa chiall true. Uaireanta in ionad réimse boolean is_deleted tá sé níos áisiúla an réimse a úsáid deleted, a stórálann dáta-am scriosta loighciúil an taifid. Tar éis scriosadh loighciúil a dhéanamh, aistreofar an taifead atá marcáilte le haghaidh scriosadh ón bhfoinse go dtí an ceann scríbe (de réir na loighice a pléadh thuas).

Seicheamh row_ver is féidir iad a úsáid chun sonraí a tharchur ó spásanna eile: ní gá seicheamh ar leith a chruthú do gach spás tarchurtha.

D’fhéachamar ar bhealach éifeachtach chun sonraí ardleibhéil a mhacasamhlú in feidhmchláir a úsáideann Tarantool DBMS.

Torthaí

  1. Is táirge tarraingteach, gealltanais é Tarantool DBMS chun feidhmchláir ard-ualaigh a chruthú.
  2. Tá roinnt buntáistí ag baint le macasamhlú sonraí ardleibhéil seachas macasamhlú ar leibhéal íseal.
  3. Ceadaíonn an modh macasamhlaithe ardleibhéil a pléadh san alt leat méid na sonraí aistrithe a íoslaghdú trí na taifid sin a d'athraigh ón seisiún malairte deiridh amháin a aistriú.

Foinse: will.com

Add a comment