Atunṣe ipele giga ni Tarantool DBMS

Kaabo, Mo n ṣẹda awọn ohun elo fun DBMS Tarantool jẹ pẹpẹ ti o ni idagbasoke nipasẹ Ẹgbẹ Mail.ru ti o ṣajọpọ DBMS iṣẹ ṣiṣe giga ati olupin ohun elo ni ede Lua. Iyara giga ti awọn solusan ti o da lori Tarantool jẹ aṣeyọri, ni pataki, nitori atilẹyin fun ipo-iranti ti DBMS ati agbara lati ṣiṣẹ ọgbọn iṣowo ohun elo ni aaye adirẹsi kan pẹlu data. Ni akoko kanna, idaduro data jẹ idaniloju nipa lilo awọn iṣowo ACID (logi WAL ti wa ni itọju lori disk). Tarantool ti ni atilẹyin ti a ṣe sinu fun atunkọ ati sharding. Bibẹrẹ lati ẹya 2.1, awọn ibeere ni ede SQL ni atilẹyin. Tarantool jẹ orisun ṣiṣi ati iwe-aṣẹ labẹ iwe-aṣẹ Simplified BSD. Ẹya Idawọlẹ iṣowo tun wa.

Atunṣe ipele giga ni Tarantool DBMS
Rilara agbara naa! (...aka gbadun iṣẹ naa)

Gbogbo awọn ti o wa loke jẹ ki Tarantool jẹ pẹpẹ ti o wuyi fun ṣiṣẹda awọn ohun elo fifuye giga ti o ṣiṣẹ pẹlu awọn apoti isura data. Ninu iru awọn ohun elo, igbagbogbo nilo fun ẹda data.

Gẹgẹbi a ti sọ loke, Tarantool ni ẹda data ti a ṣe sinu. Ilana ti iṣiṣẹ rẹ ni lati ṣiṣẹ lẹsẹsẹ lori awọn ẹda gbogbo awọn iṣowo ti o wa ninu log titunto si (WAL). Nigbagbogbo iru atunṣe (a yoo pe siwaju sii kekere-ipele) ni a lo lati rii daju ifarada aṣiṣe ohun elo ati/tabi lati pin kaakiri fifuye kika laarin awọn apa iṣupọ.

Atunṣe ipele giga ni Tarantool DBMS
Iresi. 1. Atunse laarin a iṣupọ

Apeere ti oju iṣẹlẹ omiiran yoo jẹ gbigbe data ti a ṣẹda ninu ibi ipamọ data kan si ibi ipamọ data miiran fun sisẹ/abojuto. Ninu ọran ikẹhin, ojutu irọrun diẹ sii le jẹ lilo ipele giga isodipupo - atunwi data ni ipele oye iṣowo ohun elo. Awon. A ko lo ojutu ti a ti ṣetan ti a ṣe sinu DBMS, ṣugbọn ṣe atunṣe lori ara wa laarin ohun elo ti a n dagbasoke. Ọna yii ni awọn anfani ati awọn alailanfani mejeeji. Jẹ ki a ṣe atokọ awọn anfani.

1. Awọn ifowopamọ ijabọ:

  • O ko le gbe gbogbo awọn data, sugbon nikan apakan ti o (fun apẹẹrẹ, o le gbe nikan diẹ ninu awọn tabili, diẹ ninu awọn ọwọn wọn tabi igbasilẹ ti o pade kan awọn ami);
  • Ko dabi ẹda ipele kekere, eyiti o ṣe ni igbagbogbo ni asynchronous (ti a ṣe ni ẹya lọwọlọwọ ti Tarantool - 1.10) tabi amuṣiṣẹpọ (lati ṣe imuse ni awọn ẹya atẹle ti Tarantool) ipo, atunṣe ipele giga le ṣee ṣe ni awọn akoko (ie, awọn Ohun elo akọkọ muṣiṣẹpọ data naa - data igba paṣipaarọ, lẹhinna o wa ni idaduro ni isọdọtun, lẹhin eyiti igba paṣipaarọ atẹle waye, bbl);
  • Ti igbasilẹ kan ba ti yipada ni ọpọlọpọ igba, o le gbe ẹya tuntun rẹ nikan (kii ṣe atunṣe ipele kekere, ninu eyiti gbogbo awọn ayipada ti o ṣe lori titunto si yoo dun sẹhin ni atẹlera lori awọn ẹda).

2. Ko si awọn iṣoro pẹlu imuse paṣipaarọ HTTP, eyiti o fun ọ laaye lati muuṣiṣẹpọ awọn apoti isura infomesonu latọna jijin.

Atunṣe ipele giga ni Tarantool DBMS
Iresi. 2. Atunse lori HTTP

3. Awọn ẹya data laarin eyi ti data ti wa ni gbigbe ko ni lati jẹ kanna (ni afikun, ni gbogbogbo, o ṣee ṣe lati lo awọn DBMS oriṣiriṣi, awọn ede siseto, awọn iru ẹrọ, ati bẹbẹ lọ).

Atunṣe ipele giga ni Tarantool DBMS
Iresi. 3. Atunse ni orisirisi awọn ọna šiše

Ilọkuro ni pe, ni apapọ, siseto jẹ nira sii / idiyele ju iṣeto lọ, ati dipo ti isọdi iṣẹ ṣiṣe ti a ṣe sinu, iwọ yoo ni lati ṣe imuse tirẹ.

Ti o ba wa ni ipo rẹ awọn anfani ti o wa loke jẹ pataki (tabi jẹ ipo pataki), lẹhinna o jẹ oye lati lo atunṣe ipele giga. Jẹ ki a wo awọn ọna pupọ lati ṣe imuṣe atunṣe data ipele giga ni Tarantool DBMS.

Idinku ijabọ

Nitorinaa, ọkan ninu awọn anfani ti atunkọ ipele giga jẹ ifowopamọ ijabọ. Ni ibere fun anfani yii lati ni imuse ni kikun, o jẹ dandan lati dinku iye data ti o ti gbe lakoko igba paṣipaarọ kọọkan. Nitoribẹẹ, a ko gbọdọ gbagbe pe ni opin igba, olugba data gbọdọ wa ni mimuuṣiṣẹpọ pẹlu orisun (o kere ju fun apakan ti data ti o ni ipa ninu ẹda).

Bii o ṣe le dinku iye data ti o gbe lakoko isọdọtun ipele giga? Ojutu taara le jẹ lati yan data nipasẹ ọjọ ati akoko. Lati ṣe eyi, o le lo aaye akoko-ọjọ ti o wa tẹlẹ ninu tabili (ti o ba wa). Fun apẹẹrẹ, iwe “ibere” le ni aaye kan “akoko ipaniyan aṣẹ ti o nilo” - delivery_time. Iṣoro pẹlu ojutu yii ni pe awọn iye ni aaye yii ko ni lati wa ni ọkọọkan ti o ni ibamu si ṣiṣẹda awọn aṣẹ. Nitorinaa a ko le ranti iye aaye ti o pọ julọ delivery_time, ti a firanṣẹ lakoko igba paṣipaarọ iṣaaju, ati lakoko igba paṣipaarọ atẹle yan gbogbo awọn igbasilẹ pẹlu iye aaye ti o ga julọ delivery_time. Awọn igbasilẹ pẹlu iye aaye kekere le ti jẹ afikun laarin awọn akoko paṣipaarọ delivery_time. Paapaa, aṣẹ le ti ni awọn ayipada, eyiti ko ni ipa lori aaye naa delivery_time. Ni awọn ọran mejeeji, awọn iyipada kii yoo gbe lati orisun si ibi ti o nlo. Lati yanju awọn iṣoro wọnyi, a yoo nilo lati gbe data "ni agbekọja". Awon. ni igba paṣipaarọ kọọkan a yoo gbe gbogbo data pẹlu iye aaye delivery_time, ju diẹ ninu awọn ojuami ninu awọn ti o ti kọja (fun apẹẹrẹ, N wakati lati awọn ti isiyi akoko). Sibẹsibẹ, o han gbangba pe fun awọn ọna ṣiṣe nla ọna yii jẹ aiṣedeede pupọ ati pe o le dinku awọn ifowopamọ ijabọ ti a n tiraka fun lasan. Ni afikun, tabili ti a gbe lọ le ma ni aaye ti o ni nkan ṣe pẹlu akoko-ọjọ kan.

Ojutu miiran, eka diẹ sii ni awọn ofin imuse, ni lati jẹwọ gbigba ti data. Ni idi eyi, lakoko igba paṣipaarọ kọọkan, gbogbo data ti wa ni gbigbe, gbigba ti ko ti fi idi rẹ mulẹ nipasẹ olugba. Lati ṣe eyi, iwọ yoo nilo lati ṣafikun iwe Boolean kan si tabili orisun (fun apẹẹrẹ, is_transferred). Ti olugba ba jẹwọ gbigba igbasilẹ naa, aaye ti o baamu gba iye naa true, lẹhin eyi titẹ sii ko ni ipa ninu awọn iyipada. Aṣayan imuse yii ni awọn alailanfani wọnyi. Ni akọkọ, fun igbasilẹ kọọkan ti o ti gbe, ijẹrisi gbọdọ wa ni ipilẹṣẹ ati firanṣẹ. Ni aijọju sisọ, eyi le jẹ afiwera si ilọpo meji iye data ti o ti gbe ati yori si ilọpo meji nọmba awọn irin-ajo. Ni ẹẹkeji, ko si iṣeeṣe ti fifiranṣẹ igbasilẹ kanna si ọpọlọpọ awọn olugba (olugba akọkọ lati gba yoo jẹrisi gbigba fun ararẹ ati fun gbogbo awọn miiran).

Ọna kan ti ko ni awọn aila-nfani ti a fun loke ni lati ṣafikun iwe kan si tabili ti a firanṣẹ lati tọpa awọn ayipada ninu awọn ori ila rẹ. Iru iwe bẹẹ le jẹ ti iru akoko-ọjọ ati pe o gbọdọ ṣeto / imudojuiwọn nipasẹ ohun elo si akoko lọwọlọwọ ni akoko kọọkan ti awọn igbasilẹ ti wa ni afikun / yi pada (atomically pẹlu afikun / iyipada). Bi apẹẹrẹ, jẹ ki ká pe awọn iwe update_time. Nipa fifipamọ iye aaye ti o pọju ti iwe yii fun awọn igbasilẹ gbigbe, a le bẹrẹ igba paṣipaarọ atẹle pẹlu iye yii (yan awọn igbasilẹ pẹlu iye aaye update_time, ju iye ti o ti fipamọ tẹlẹ). Iṣoro pẹlu ọna igbehin ni pe awọn iyipada data le waye ni awọn ipele. Bi abajade ti awọn iye aaye ninu iwe update_time le ma jẹ alailẹgbẹ. Nitorinaa, a ko le lo ọwọn yii fun iṣẹjade data ipin (oju-iwe-oju-iwe). Lati ṣe afihan oju-iwe data nipasẹ oju-iwe, iwọ yoo ni lati ṣẹda awọn ọna ṣiṣe afikun ti yoo ṣeese julọ ni ṣiṣe ti o kere pupọ (fun apẹẹrẹ, gbigba pada lati ibi ipamọ data gbogbo awọn igbasilẹ pẹlu iye update_time ti o ga ju ọkan ti a fun lọ ati ṣiṣe nọmba kan ti awọn igbasilẹ, bẹrẹ lati aiṣedeede kan lati ibẹrẹ ti apẹẹrẹ).

O le mu imunadoko gbigbe data pọ si nipasẹ ilọsiwaju diẹ si ọna iṣaaju. Lati ṣe eyi, a yoo lo iru odidi (odidi gigun) gẹgẹbi awọn iye aaye aaye fun awọn iyipada titele. Jẹ ki a lorukọ ọwọn naa row_ver. Iye aaye ti ọwọn yii gbọdọ tun ṣeto / imudojuiwọn ni igba kọọkan ti igbasilẹ kan ba ṣẹda / tunṣe. Ṣugbọn ninu ọran yii, aaye naa kii yoo pin akoko-ọjọ lọwọlọwọ, ṣugbọn iye diẹ ninu awọn counter, pọ nipasẹ ọkan. Bi abajade, ọwọn row_ver yoo ni awọn iye alailẹgbẹ ati pe o le ṣee lo kii ṣe lati ṣafihan data “delta” nikan (data ti a ṣafikun / yipada lati opin igba paṣipaarọ iṣaaju), ṣugbọn lati rọrun ati ni imunadoko lulẹ sinu awọn oju-iwe.

Ọna ti a dabaa ti o kẹhin ti idinku iye data ti o ti gbe laarin ilana ti atunwi ipele giga dabi ẹni pe o dara julọ ati gbogbo agbaye. Jẹ ká wo ni o ni diẹ apejuwe awọn.

Gbigbe Data Lilo Onika Ẹya Kari kan

Imuse ti olupin / titunto si apakan

Ninu MS SQL Server, iru ọwọn pataki kan wa lati ṣe imuse ọna yii - rowversion. Kọọkan database ni o ni a counter ti o mu nipa ọkan kọọkan akoko igbasilẹ ti wa ni afikun / yi pada ni a tabili ti o ni a iwe bi rowversion. Awọn iye ti counter yi ti wa ni laifọwọyi sọtọ si awọn aaye ti yi iwe ninu awọn kun / yi pada gba. Tarantool DBMS ko ni iru ẹrọ ti a ṣe sinu. Sibẹsibẹ, ni Tarantool ko nira lati ṣe imuse pẹlu ọwọ. Jẹ ki a wo bi eyi ṣe ṣe.

Ni akọkọ, awọn ọrọ-ọrọ kekere kan: awọn tabili ni Tarantool ni a pe ni awọn aaye, ati awọn igbasilẹ ni a pe ni tuples. Ni Tarantool o le ṣẹda awọn ọkọọkan. Awọn atẹle jẹ nkan diẹ sii ju awọn olupilẹṣẹ ti a darukọ ti awọn iye odidi ti a paṣẹ. Awon. eyi ni pato ohun ti a nilo fun awọn idi wa. Ni isalẹ a yoo ṣẹda iru ọkọọkan.

Ṣaaju ṣiṣe eyikeyi iṣẹ data ni Tarantool, o nilo lati ṣiṣe aṣẹ wọnyi:

box.cfg{}

Bi abajade, Tarantool yoo bẹrẹ kikọ awọn aworan ibi ipamọ data ati awọn akọọlẹ idunadura si itọsọna lọwọlọwọ.

Jẹ ki a ṣẹda ọkọọkan row_version:

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

Aṣayan if_not_exists gba iwe afọwọkọ ẹda laaye lati ṣiṣẹ ni igba pupọ: ti ohun naa ba wa, Tarantool kii yoo gbiyanju lati ṣẹda lẹẹkansi. Aṣayan yii yoo ṣee lo ni gbogbo awọn aṣẹ DDL ti o tẹle.

Jẹ ki a ṣẹda aaye kan bi apẹẹrẹ.

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

Nibi a ṣeto orukọ aaye naa (goods), awọn orukọ aaye ati awọn iru wọn.

Awọn aaye ti n pọ si aifọwọyi ni Tarantool tun ṣẹda ni lilo awọn ọna-tẹle. Jẹ ki a ṣẹda bọtini akọkọ ti n pọ si laifọwọyi nipasẹ aaye 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 ṣe atilẹyin awọn oriṣi awọn atọka pupọ. Awọn atọka ti o wọpọ julọ lo jẹ awọn oriṣi TREE ati HASH, eyiti o da lori awọn ẹya ti o baamu si orukọ naa. IGI jẹ oriṣi atọka ti o pọ julọ. O gba ọ laaye lati gba data pada ni ọna ti a ṣeto. Ṣugbọn fun yiyan isọgba, HASH dara julọ. Nitorinaa, o ni imọran lati lo HASH fun bọtini akọkọ (eyiti o jẹ ohun ti a ṣe).

Lati lo ọwọn row_ver lati gbe data ti o yipada, o nilo lati di awọn iye ọkọọkan si awọn aaye ti iwe yii row_ver. Ṣugbọn ko dabi bọtini akọkọ, iye aaye ọwọn row_ver yẹ ki o pọ sii nipasẹ ọkan kii ṣe nigbati o ba nfi awọn igbasilẹ titun kun, ṣugbọn tun nigba iyipada awọn ti o wa tẹlẹ. O le lo awọn okunfa fun eyi. Tarantool ni awọn oriṣi meji ti awọn okunfa aaye: before_replace и on_replace. Awọn okunfa ti wa ni ina nigbakugba ti data ti o wa ninu aaye ba yipada (fun tuple kọọkan ti o kan nipasẹ awọn ayipada, iṣẹ ti nfa ti ṣe ifilọlẹ). Ko dabi on_replace, before_replace-triggers gba o laaye lati yi awọn data ti awọn tuple fun eyi ti awọn okunfa ti wa ni executed. Gegebi bi, awọn ti o kẹhin iru ti okunfa ba wa.

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

Awọn okunfa atẹle rọpo iye aaye row_ver tuple ti o ti fipamọ si awọn tókàn iye ti awọn ọkọọkan row_version.

Lati le yọ data jade lati aaye goods nipa ọwọn row_ver, jẹ ki a ṣẹda atọka:

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

Iru atọka - igi (TREE), nitori a yoo nilo lati jade data naa ni aṣẹ goke ti awọn iye ninu iwe naa row_ver.

Jẹ ki a ṣafikun data diẹ si aaye naa:

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}

Nitori Aaye akọkọ jẹ iṣiro-ilọsiwaju aifọwọyi; a kọja nil dipo. Tarantool yoo paarọ iye atẹle laifọwọyi. Bakanna, bi iye ti awọn aaye ọwọn row_ver o le kọja nil - tabi ko pato iye ni gbogbo, nitori iwe yii wa ni ipo ti o kẹhin ni aaye.

Jẹ ki a ṣayẹwo abajade ifibọ:

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

Bi o ti le rii, awọn aaye akọkọ ati ti o kẹhin ti kun ni aifọwọyi. Bayi o yoo rọrun lati kọ iṣẹ kan fun ikojọpọ oju-iwe nipasẹ oju-iwe ti awọn ayipada aaye 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

Iṣẹ naa gba bi paramita iye row_ver, ti o bere lati eyi ti o jẹ pataki lati unload ayipada, ati ki o pada a ìka ti awọn data yi pada.

Ayẹwo data ni Tarantool jẹ nipasẹ awọn atọka. Išẹ get_goods nlo iterator nipa atọka row_ver lati gba data ti o yipada. Iru oluṣeto jẹ GT (Ti o tobi ju, tobi ju). Eyi tumọ si pe oluṣeto yoo ṣe atẹle lẹsẹsẹ awọn iye atọka ti o bẹrẹ lati bọtini ti o kọja (iye aaye row_ver).

Awọn iterator pada tuples. Lati le ṣe atẹle ni anfani lati gbe data nipasẹ HTTP, o jẹ dandan lati yi awọn tuples pada si ọna ti o rọrun fun isọdọkan atẹle. Awọn apẹẹrẹ nlo awọn boṣewa iṣẹ fun yi tomap. Dipo lilo tomap o le kọ iṣẹ ti ara rẹ. Fun apẹẹrẹ, a le fẹ lati yi aaye kan lorukọ name, maṣe kọja oko code ki o si fi aaye kan kun 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

Iwọn oju-iwe ti data abajade (nọmba awọn igbasilẹ ni apakan kan) jẹ ipinnu nipasẹ oniyipada page_size. Ni apẹẹrẹ, iye page_size jẹ 5. Ninu eto gidi, iwọn oju-iwe maa n ṣe pataki diẹ sii. O da lori iwọn apapọ ti tuple aaye. Iwọn oju-iwe ti o dara julọ le ṣe ipinnu ni agbara nipasẹ wiwọn akoko gbigbe data. Ti o tobi iwọn oju-iwe naa, o kere si nọmba awọn irin-ajo laarin awọn ẹgbẹ fifiranṣẹ ati gbigba. Ni ọna yii o le dinku akoko gbogbogbo fun awọn iyipada igbasilẹ. Bibẹẹkọ, ti iwọn oju-iwe ba tobi ju, a yoo lo gun ju lori olupin ni tẹlentẹle ayẹwo naa. Bi abajade, awọn idaduro le wa ni ṣiṣe awọn ibeere miiran ti nbọ si olupin naa. Paramita page_size le ti wa ni ti kojọpọ lati iṣeto ni faili. Fun aaye kọọkan ti a firanṣẹ, o le ṣeto iye tirẹ. Sibẹsibẹ, fun ọpọlọpọ awọn alafo iye aiyipada (fun apẹẹrẹ, 100) le dara.

Jẹ ki a mu iṣẹ naa ṣiṣẹ 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
...

Jẹ ki a gba iye aaye naa row_ver lati laini to kẹhin ki o pe iṣẹ naa lẹẹkansi:

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

Lekan si:

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

Bi o ti le rii, nigba lilo ni ọna yii, iṣẹ naa da pada gbogbo awọn igbasilẹ aaye ni oju-iwe goods. Oju-iwe ti o kẹhin ni atẹle nipasẹ yiyan ofo.

Jẹ ki a ṣe awọn ayipada si aaye:

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

A ti yi iye aaye pada name fun titẹ sii kan ati ṣafikun awọn titẹ sii tuntun meji.

Jẹ ki a tun ipe iṣẹ ti o kẹhin ṣe:

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

Iṣẹ naa pada awọn igbasilẹ ti o yipada ati fi kun. Nitorina iṣẹ naa get_goods gba ọ laaye lati gba data ti o ti yipada lati igba ipe ti o kẹhin, eyiti o jẹ ipilẹ ti ọna atunṣe labẹ ero.

A yoo lọ kuro ni ipinfunni ti awọn abajade nipasẹ HTTP ni irisi JSON ni ita aaye ti nkan yii. O le ka nipa eyi nibi: https://habr.com/ru/company/mailru/blog/272141/

Imuse ti ose / ẹrú apa

Jẹ ki a wo kini imuse ẹgbẹ gbigba dabi. Jẹ ki a ṣẹda aaye kan ni ẹgbẹ gbigba lati tọju data ti a gbasile:

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

Ilana ti aaye naa dabi ilana ti aaye ni orisun. Ṣugbọn niwọn igba ti a ko ni kọja data ti o gba nibikibi miiran, ọwọn naa row_ver ko si ni aaye ti olugba. Ni aaye id awọn idamọ orisun yoo gba silẹ. Nitorinaa, ni ẹgbẹ olugba ko si iwulo lati jẹ ki o pọ si laifọwọyi.

Ni afikun, a nilo aaye kan lati ṣafipamọ awọn iye 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
})

Fun aaye kọọkan ti kojọpọ (aaye space_name) a yoo fi awọn ti o kẹhin kojọpọ iye nibi row_ver (aaye value). Oju-iwe naa n ṣiṣẹ bi bọtini akọkọ space_name.

Jẹ ki a ṣẹda iṣẹ kan lati gbe data aaye kun goods nipasẹ HTTP. Lati ṣe eyi, a nilo ile-ikawe ti o ṣe imuse alabara HTTP kan. Laini atẹle n gbe ile-ikawe naa ati mu alabara HTTP lojukanna:

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

A tun nilo ile-ikawe kan fun isọdọtun json:

local json = require('json')

Eyi to lati ṣẹda iṣẹ ikojọpọ data kan:

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

Iṣẹ naa ṣe ibeere HTTP kan si adirẹsi url ati firanṣẹ row_ver bi paramita ati ki o pada deserialized esi ti awọn ìbéèrè.

Iṣẹ fun fifipamọ data ti o gba dabi eyi:

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

Ayika ti fifipamọ data si aaye goods gbe sinu idunadura kan (iṣẹ naa lo fun eyi box.atomic) lati dinku nọmba awọn iṣẹ disk.

Ni ipari, iṣẹ amuṣiṣẹpọ aaye agbegbe goods Pẹlu orisun kan o le ṣe bi eleyi:

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

Ni akọkọ a ka iye ti o ti fipamọ tẹlẹ row_ver fun aaye goods. Ti o ba nsọnu (akoko paṣipaarọ akọkọ), lẹhinna a mu bi row_ver odo. Nigbamii ninu ọna ti a ṣe igbasilẹ oju-iwe nipasẹ oju-iwe ti data ti o yipada lati orisun ni url ti a ti sọ tẹlẹ. Ni aṣetunṣe kọọkan, a fipamọ data ti o gba si aaye agbegbe ti o yẹ ati imudojuiwọn iye naa row_ver (ni aaye row_ver ati ninu oniyipada row_ver) - gba iye row_ver lati kẹhin ila ti kojọpọ data.

Lati daabobo lodi si looping lairotẹlẹ (ni ọran ti aṣiṣe ninu eto), lupu naa while le ti wa ni rọpo nipasẹ for:

for _ = 1, max_req do ...

Bi abajade ti ṣiṣe iṣẹ naa sync_goods aaye goods olugba yoo ni awọn ẹya tuntun ti gbogbo awọn igbasilẹ aaye goods ninu orisun.

O han ni, piparẹ data ko le ṣe ikede ni ọna yii. Ti iru iwulo ba wa, o le lo ami piparẹ kan. Fi kun si aaye goods aaye boolian is_deleted ati dipo ti ara piparẹ igbasilẹ kan, a lo imukuro ọgbọn - a ṣeto iye aaye is_deleted sinu itumo true. Nigba miiran dipo aaye boolian is_deleted o rọrun diẹ sii lati lo aaye naa deleted, eyi ti o tọju akoko-ọjọ ti imukuro ọgbọn ti igbasilẹ naa. Lẹhin ṣiṣe piparẹ ọgbọn kan, igbasilẹ ti samisi fun piparẹ yoo gbe lati orisun si opin irin ajo (gẹgẹbi ọgbọn ti a sọrọ loke).

Ọkọọkan row_ver le ṣee lo lati atagba data lati awọn aaye miiran: ko si ye lati ṣẹda kan lọtọ ọkọọkan fun kọọkan zqwq aaye.

A wo ọna ti o munadoko ti atunkọ data ipele giga ninu awọn ohun elo nipa lilo Tarantool DBMS.

awari

  1. Tarantool DBMS jẹ ohun ti o wuyi, ọja ti o ni ileri fun ṣiṣẹda awọn ohun elo fifuye giga.
  2. Atunse data ipele-giga ni nọmba awọn anfani lori isọdọtun ipele kekere.
  3. Ọna atunkọ-giga ti a jiroro ninu nkan n gba ọ laaye lati dinku iye ti data gbigbe nipasẹ gbigbe awọn igbasilẹ nikan ti o yipada lati igba paṣipaarọ ti o kẹhin.

orisun: www.habr.com

Fi ọrọìwòye kun