Maimaita babban matakin a cikin Tarantool DBMS

Sannu, Ina ƙirƙirar aikace-aikace don DBMS Tarantool wani dandali ne wanda Rukunin Mail.ru ya haɓaka wanda ya haɗa babban DBMS da sabar aikace-aikace a cikin yaren Lua. Ana samun babban saurin mafita dangane da Tarantool, musamman, saboda goyan baya ga yanayin ƙwaƙwalwar ajiya na DBMS da ikon aiwatar da dabarun kasuwanci na aikace-aikacen a cikin sarari adireshi ɗaya tare da bayanai. A lokaci guda, ana tabbatar da dagewar bayanai ta amfani da ma'amalar ACID (ana kiyaye log ɗin WAL akan faifai). Tarantool yana da ginanniyar tallafi don kwafi da sharding. An fara daga sigar 2.1, ana goyan bayan tambayoyi a cikin yaren SQL. Tarantool buɗaɗɗen tushe ne kuma yana da lasisi ƙarƙashin Sauƙaƙe lasisin BSD. Akwai kuma sigar Kasuwancin Kasuwanci.

Maimaita babban matakin a cikin Tarantool DBMS
Ji iko! (...aka ji dadin wasan kwaikwayon)

Duk abin da ke sama yana sa Tarantool ya zama dandamali mai ban sha'awa don ƙirƙirar aikace-aikace masu nauyi waɗanda ke aiki tare da bayanan bayanai. A irin waɗannan aikace-aikacen, galibi ana buƙatar kwafin bayanai.

Kamar yadda aka ambata a sama, Tarantool yana da ginanniyar kwafin bayanai. Ka'idar aikinsa ita ce aiwatar da bi-bi-da-bi akan kwafi duk ma'amaloli da ke ƙunshe a cikin babban log (WAL). Yawancin lokaci irin wannan maimaitawa (za mu ƙara kira shi ƙananan matakin) ana amfani da shi don tabbatar da haƙurin kuskuren aikace-aikacen da/ko don rarraba nauyin karatu tsakanin nodes ɗin tari.

Maimaita babban matakin a cikin Tarantool DBMS
Shinkafa 1. Maimaituwa a cikin tari

Misali na madadin yanayin zai kasance canja wurin bayanan da aka ƙirƙira a cikin rumbun adana bayanai ɗaya zuwa wani rumbun adana bayanai don sarrafawa/sa idanu. A cikin yanayin ƙarshe, mafi dacewa mafita na iya zama don amfani babban matakin kwafi - kwafin bayanai a matakin dabaru na kasuwanci na aikace-aikacen. Wadancan. Ba ma amfani da ingantaccen bayani da aka gina a cikin DBMS, amma aiwatar da kwafi da kanmu a cikin aikace-aikacen da muke haɓakawa. Wannan hanya tana da fa'ida da rashin amfani. Bari mu lissafa fa'idodin.

1. Tattalin arziki:

  • Ba za ku iya canja wurin duk bayanan ba, amma kawai wani ɓangare na shi (misali, za ku iya canja wurin wasu tebur kawai, wasu ginshiƙai ko bayanan da suka dace da wani ma'auni);
  • Ba kamar ƙaramin matakin kwafi ba, wanda ake ci gaba da yin shi a cikin asynchronous (an aiwatar da shi a cikin sigar Tarantool na yanzu - 1.10) ko daidaitawa (wanda za'a aiwatar dashi a cikin sigogin Tarantool masu zuwa), ana iya yin kwafi mai girma a cikin zaman (watau, aikace-aikace na farko yana daidaita bayanai - bayanan zaman musayar, sannan akwai dakatarwa a cikin maimaitawa, bayan haka zaman musayar na gaba yana faruwa, da sauransu);
  • idan rikodin ya canza sau da yawa, zaku iya canja wurin sabon sigar sa kawai (ba kamar kwafi na ƙananan matakin ba, wanda duk canje-canjen da aka yi akan maigida za a sake kunna su a jere akan kwafi).

2. Babu matsaloli tare da aiwatar da musayar HTTP, wanda ke ba ku damar aiki tare da bayanan nesa.

Maimaita babban matakin a cikin Tarantool DBMS
Shinkafa 2. Maimaita akan HTTP

3. Tsarin tsarin bayanai tsakanin abin da aka canja wurin bayanai ba dole ba ne ya zama iri ɗaya (Bugu da ƙari, a cikin yanayin gabaɗaya, yana yiwuwa ma a yi amfani da DBMS daban-daban, harsunan shirye-shirye, dandamali, da sauransu).

Maimaita babban matakin a cikin Tarantool DBMS
Shinkafa 3. Maimaituwa a cikin tsarin iri-iri

Ƙarƙashin ƙasa shine, a matsakaici, shirye-shirye ya fi wahala / tsada fiye da daidaitawa, kuma maimakon daidaita ayyukan da aka gina, dole ne ku aiwatar da naku.

Idan a cikin halin da ake ciki fa'idodin da ke sama suna da mahimmanci (ko kuma yanayin zama dole), to yana da ma'ana don amfani da kwafi mai girma. Bari mu kalli hanyoyi da yawa don aiwatar da kwafin bayanai masu girma a cikin Tarantool DBMS.

Rage zirga-zirga

Don haka, ɗaya daga cikin fa'idodin babban kwafi shine tanadin zirga-zirga. Domin wannan fa'ida ta tabbata sosai, ya zama dole don rage yawan adadin bayanan da aka canjawa wuri yayin kowane zaman musayar. Tabbas, kada mu manta cewa a ƙarshen zaman, dole ne a daidaita mai karɓar bayanai tare da tushen (akalla don wannan ɓangaren bayanan da ke cikin kwafi).

Yadda za a rage girman adadin bayanan da aka canjawa wuri yayin babban matakin kwafi? Madaidaicin bayani zai iya zama zaɓin bayanai ta kwanan wata da lokaci. Don yin wannan, zaku iya amfani da filin kwanan kwanan wata da ya riga ya kasance a cikin tebur (idan akwai). Misali, takardar “oda” na iya samun filin “lokacin aiwatar da oda da ake buƙata” - delivery_time. Matsalar wannan mafita ita ce, ƙimar da ke cikin wannan filin ba dole ba ne su kasance cikin jerin abubuwan da suka dace da ƙirƙirar umarni. Don haka ba za mu iya tuna matsakaicin ƙimar filin ba delivery_time, wanda aka watsa yayin zaman musayar da ya gabata, kuma yayin zaman musayar na gaba zaɓi duk bayanan da ƙimar filin mafi girma delivery_time. Ƙila an ƙara bayanan da ke da ƙananan ƙimar filin tsakanin zaman musayar delivery_time. Hakanan, odar na iya yin canje-canje, wanda duk da haka bai shafi filin ba delivery_time. A cikin duka biyun, ba za a canza canje-canje daga tushen zuwa wurin da aka nufa ba. Don magance waɗannan matsalolin, muna buƙatar canja wurin bayanai "zubawa". Wadancan. a kowane zaman musayar za mu canja wurin duk bayanai tare da ƙimar filin delivery_time, wuce wani matsayi a baya (misali, N hours daga halin yanzu). Duk da haka, a bayyane yake cewa ga manyan tsarin wannan tsarin yana da wuyar gaske kuma yana iya rage yawan ajiyar zirga-zirgar da muke ƙoƙari don komai. Bugu da kari, teburin da ake canjawa wuri bazai sami filin da ke da alaƙa da lokacin kwanan wata ba.

Wani bayani, mafi rikitarwa dangane da aiwatarwa, shine amincewa da karɓar bayanai. A wannan yanayin, yayin kowane zaman musayar, ana watsa duk bayanan, wanda mai karɓa bai tabbatar da karɓar sa ba. Don aiwatar da wannan, kuna buƙatar ƙara ginshiƙi na Boolean zuwa teburin tushe (misali, is_transferred). Idan mai karɓa ya yarda da karɓar rikodin, filin da ya dace yana ɗaukar ƙimar true, bayan haka shigarwa baya shiga cikin musayar. Wannan zaɓin aiwatarwa yana da lahani masu zuwa. Da farko, ga kowane rikodin da aka canjawa wuri, dole ne a samar da sanarwa kuma a aika. Kusan magana, wannan na iya zama kwatankwacin ninka adadin bayanan da aka canjawa wuri kuma yana haifar da ninka adadin tafiye-tafiye. Abu na biyu, babu yiwuwar aika rikodin iri ɗaya zuwa masu karɓa da yawa (mai karɓa na farko da za a karɓa zai tabbatar da samun kansa da sauran sauran).

Hanyar da ba ta da lahani da aka bayar a sama ita ce ƙara ginshiƙi zuwa teburin da aka watsa don bin sauye-sauye a cikin layukansa. Irin wannan ginshiƙi na iya zama nau'in lokaci na kwanan wata kuma dole ne a saita/sabunta ta aikace-aikacen zuwa lokaci na yanzu duk lokacin da aka ƙara / canzawa (atomically tare da ƙari/canji). A matsayin misali, bari mu kira shafi update_time. Ta hanyar adana matsakaicin ƙimar filin wannan ginshiƙi don bayanan da aka canjawa wuri, za mu iya fara zaman musanya na gaba tare da wannan ƙimar (zaɓi rikodin tare da ƙimar filin. update_time, wuce ƙimar da aka adana a baya). Matsalar ta ƙarshe ita ce canje-canjen bayanai na iya faruwa a batches. Sakamakon ƙimar filin a cikin ginshiƙi update_time maiyuwa ba zai zama na musamman ba. Don haka, ba za a iya amfani da wannan ginshiƙi don fitar da bayanai da aka raba (shafi-bi-shafi) ba. Don nuna bayanan shafi zuwa shafi, dole ne ku ƙirƙira ƙarin hanyoyin da za su iya samun ƙarancin inganci sosai (misali, maidowa daga rumbun adana bayanan duk bayanan tare da ƙima. update_time sama da wanda aka ba da kuma samar da takamaiman adadin bayanai, farawa daga wani ɓata lokaci daga farkon samfurin).

Kuna iya haɓaka ingancin canja wurin bayanai ta ɗan inganta tsarin da ya gabata. Don yin wannan, za mu yi amfani da nau'in lamba (dogon lamba) azaman ƙimar filin shafi don bin canje-canje. Bari mu sanya sunan shafi row_ver. Dole ne har yanzu a saita/sabunta darajar filin wannan ginshiƙi duk lokacin da aka ƙirƙiri/gyara rikodi. Amma a wannan yanayin, ba za a sanya filin kwanan kwanan wata ba, amma ƙimar wasu ƙididdiga, ƙara da ɗaya. A sakamakon haka, shafi row_ver zai ƙunshi ƙima na musamman kuma ana iya amfani dashi ba kawai don nuna bayanan "delta" (bayanan da aka ƙara / canza tun ƙarshen zaman musayar da ya gabata), amma kuma don sauƙaƙe kuma yadda ya kamata ya rushe cikin shafuka.

Hanya na ƙarshe da aka yi niyya don rage adadin bayanan da aka canjawa wuri a cikin tsarin babban kwafi a gare ni alama ce mafi kyau kuma ta duniya. Bari mu duba dalla-dalla.

Canja wurin Bayanai Ta Amfani da Ma'aunin Sigar Layi

Aiwatar da uwar garken / babban ɓangaren

A cikin MS SQL Server, akwai nau'in shafi na musamman don aiwatar da wannan hanyar - rowversion. Kowane rumbun adana bayanai yana da ma'auni wanda ke ƙaruwa da ɗaya a duk lokacin da aka ƙara / canza rikodin a cikin tebur mai ginshiƙi kamar rowversion. Ana sanya ƙimar wannan ƙididdiga ta atomatik zuwa filin wannan ginshiƙi a cikin ƙara/canza rikodin. Tarantool DBMS ba shi da injin ginanni irin na ciki. Koyaya, a cikin Tarantool ba shi da wahala a aiwatar da shi da hannu. Bari mu ga yadda ake yin hakan.

Na farko, ɗan ƙaramin kalmomi: tebur a cikin Tarantool ana kiran su sarari, kuma ana kiran rikodin tuples. A cikin Tarantool zaka iya ƙirƙirar jeri. Jeri ba kome ba ne illa masu janareta masu ƙima da ƙima. Wadancan. wannan shine ainihin abin da muke buƙata don manufofinmu. A ƙasa za mu ƙirƙiri irin wannan jerin.

Kafin yin kowane aiki na bayanai a cikin Tarantool, kuna buƙatar gudanar da umarni mai zuwa:

box.cfg{}

Sakamakon haka, Tarantool zai fara rubuta bayanan bayanan bayanan da bayanan ma'amala zuwa kundin adireshi na yanzu.

Bari mu ƙirƙiri jeri row_version:

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

Zaɓi if_not_exists yana ba da damar aiwatar da rubutun ƙirƙira sau da yawa: idan abu ya kasance, Tarantool ba zai sake ƙoƙarin ƙirƙirar shi ba. Za a yi amfani da wannan zaɓi a duk umarnin DDL na gaba.

Bari mu haifar da sarari a matsayin misali.

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

Anan muka saita sunan sararin samaniya (goods), sunayen filin da nau'in su.

Ana kuma ƙirƙira filayen haɓaka ta atomatik a cikin Tarantool ta amfani da jeri. Bari mu ƙirƙiri maɓalli na farko da ke ƙara kai tsaye ta filin 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 yana goyan bayan nau'ikan fihirisa da yawa. Fihirisar da aka fi amfani da su sune nau'ikan TREE da HASH, waɗanda suka dogara da tsarin da ya dace da sunan. TREE ita ce nau'in fihirisar da ta fi dacewa. Yana ba ku damar dawo da bayanai a cikin tsari. Amma don zaɓin daidaito, HASH ya fi dacewa. Saboda haka, yana da kyau a yi amfani da HASH don maɓallin farko (wanda shine abin da muka yi).

Don amfani da ginshiƙi row_ver don canja wurin bayanan da aka canza, kuna buƙatar ɗaure ƙimar jeri zuwa filayen wannan shafi row_ver. Amma ba kamar maɓalli na farko ba, ƙimar filin shafi row_ver ya kamata ya karu da ɗaya ba kawai lokacin ƙara sabon rikodin ba, har ma lokacin canza waɗanda suke. Kuna iya amfani da maƙarƙashiya don wannan. Tarantool yana da nau'ikan abubuwan jan hankali iri biyu: before_replace и on_replace. Ana korar masu tayar da hankali a duk lokacin da bayanan da ke cikin sararin ya canza (ga kowane tuple da canje-canjen ya shafa, ana ƙaddamar da aikin faɗakarwa). Sabanin on_replace, before_replace-triggers ba ka damar canza bayanan tuple wanda aka aiwatar da abin da ake kashewa. Dangane da haka, nau'in abubuwan motsa jiki na ƙarshe sun dace da mu.

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

Mai kunnawa mai zuwa yana maye gurbin ƙimar filin row_ver adana tuple zuwa ƙimar na gaba na jerin row_version.

Domin samun damar fitar da bayanai daga sararin samaniya goods ta shafi row_ver, bari mu ƙirƙiri fihirisa:

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

Nau'in Index - itace (TREE), saboda za mu buƙaci cire bayanan a cikin tsarin hawan hawan dabi'u a cikin shafi row_ver.

Bari mu ƙara wasu bayanai zuwa sararin samaniya:

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}

Domin Filin farko shine na'ura mai haɓakawa ta atomatik; mun wuce nil maimakon. Tarantool zai canza ƙima ta gaba ta atomatik. Hakazalika, azaman darajar filayen shafi row_ver za ku iya wuce nil - ko ba ku tantance darajar kwata-kwata, saboda wannan shafi yana ɗaukar matsayi na ƙarshe a cikin sarari.

Mu duba sakamakon sakawa:

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

Kamar yadda kake gani, ana cika filayen farko da na ƙarshe ta atomatik. Yanzu zai zama da sauƙi a rubuta aiki don ɗaukan shafi-bi-shafu na canje-canjen sarari 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

Ayyukan yana ɗauka azaman siga ƙimar row_ver, farawa daga abin da ya zama dole don sauke canje-canje, kuma ya dawo da wani yanki na bayanan da aka canza.

Samfuran bayanai a cikin Tarantool ana yin ta ta fihirisa. Aiki get_goods yana amfani da maimaitawa ta hanyar index row_ver don karɓar bayanan da aka canza. Nau'in mai maimaitawa shine GT (Mafi Girma, Yafi girma). Wannan yana nufin cewa mai ƙididdigewa zai bibiyi dabi'u masu ƙima waɗanda ke farawa daga maɓallin da aka wuce (ƙimar filin. row_ver).

Mai maimaitawa ya dawo tuples. Domin samun damar canja wurin bayanai ta hanyar HTTP daga baya, dole ne a canza tuples zuwa tsarin da ya dace da jeri na gaba. Misali yana amfani da daidaitaccen aikin don wannan tomap. Maimakon amfani tomap zaka iya rubuta aikinka. Misali, ƙila mu so mu sake sunan filin name, kar a wuce filin code kuma ƙara fili 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

Girman shafi na bayanan fitarwa (yawan rikodin a cikin yanki ɗaya) an ƙaddara ta mai canzawa page_size. A cikin misali darajar page_size shine 5. A cikin ainihin shirin, girman shafin yawanci yana da mahimmanci. Ya dogara da matsakaicin girman tuple sarari. Za'a iya tantance madaidaicin girman shafin ta hanyar auna lokacin canja wurin bayanai. Girman girman shafin, ƙaramin adadin tafiye-tafiye tsakanin sassan aikawa da karɓa. Ta wannan hanyar za ku iya rage yawan lokaci don zazzage canje-canje. Duk da haka, idan girman shafin ya yi girma, za mu yi tsayi da yawa a kan uwar garke don tsara samfurin. Sakamakon haka, ana iya samun jinkiri wajen aiwatar da wasu buƙatun da ke zuwa ga uwar garken. Siga page_size za a iya lodawa daga fayil ɗin sanyi. Ga kowane sarari da aka watsa, zaku iya saita ƙimar sa. Koyaya, ga mafi yawan sarari ƙimar tsoho (misali, 100) na iya dacewa.

Bari mu aiwatar da aikin 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
...

Mu dauki darajar filin row_ver daga layin karshe kuma sake kiran aikin:

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

Har yanzu:

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

Kamar yadda kake gani, lokacin amfani da wannan hanya, aikin yana mayar da duk bayanan sararin samaniya shafi zuwa shafi goods. Shafi na ƙarshe yana biye da zaɓi mara kyau.

Bari mu yi canje-canje ga sararin samaniya:

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

Mun canza darajar filin name don shigarwa ɗaya kuma ƙara sabbin shigarwar guda biyu.

Mu maimaita kiran aikin ƙarshe:

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

Ayyukan sun dawo da canje-canjen da aka ƙara. Don haka aikin get_goods yana ba ku damar karɓar bayanan da suka canza tun bayan kiransa na ƙarshe, wanda shine tushen hanyar kwafi da ake la'akari.

Za mu bar fitowar sakamako ta hanyar HTTP a cikin hanyar JSON a waje da iyakar wannan labarin. Kuna iya karanta game da wannan anan: https://habr.com/ru/company/mailru/blog/272141/

Aiwatar da bangaren abokin ciniki / bawa

Bari mu dubi yadda aiwatar da bangaren karba yayi kama. Bari mu ƙirƙiri sarari a gefen karɓa don adana bayanan da aka sauke:

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

Tsarin sararin samaniya yayi kama da tsarin sararin samaniya a cikin tushen. Amma tunda ba za mu wuce bayanan da aka karɓa a ko'ina ba, shafi row_ver baya cikin sarari mai karɓa. A cikin filin id Za a rubuta masu gano tushen tushe. Saboda haka, a gefen mai karɓa babu buƙatar yin shi ta atomatik.

Bugu da kari, muna buƙatar sarari don adana ƙima 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
})

Ga kowane sarari da aka ɗora (filin space_name) za mu adana ƙimar da aka ɗorawa ta ƙarshe a nan row_ver (filin value). Rukunin yana aiki azaman maɓalli na farko space_name.

Bari mu ƙirƙiri aiki don loda bayanan sarari goods ta hanyar HTTP. Don yin wannan, muna buƙatar ɗakin karatu wanda ke aiwatar da abokin ciniki na HTTP. Layi mai zuwa yana loda ɗakin karatu kuma yana ɗaukar abokin ciniki na HTTP:

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

Muna kuma buƙatar ɗakin karatu don lalata json:

local json = require('json')

Wannan ya isa don ƙirƙirar aikin loda bayanai:

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

Ayyukan yana aiwatar da buƙatun HTTP zuwa adireshin url kuma aika shi row_ver a matsayin ma'auni kuma yana dawo da sakamakon buƙatun.

Aikin adana bayanan da aka karɓa yayi kama da haka:

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

Zagayen adana bayanai zuwa sarari goods sanya a cikin ma'amala (ana amfani da aikin don wannan box.atomic) don rage yawan ayyukan diski.

A ƙarshe, aikin daidaita sararin samaniya na gida goods tare da tushen za ku iya aiwatar da shi kamar haka:

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

Da farko mun karanta ƙimar da aka ajiye a baya row_ver don sarari goods. Idan ya ɓace (zaman musayar farko), to, muna ɗaukar shi azaman row_ver sifili. Na gaba a cikin zagayowar muna yin zazzagewar shafi-bi-shafi na bayanan da aka canza daga tushen a ƙayyadadden url. A kowane juzu'i, muna adana bayanan da aka karɓa zuwa sararin gida da ya dace kuma muna sabunta ƙimar row_ver (a cikin sarari row_ver kuma a cikin m row_ver) - dauki darajar row_ver daga layin karshe na bayanan da aka ɗora.

Don kare kariya daga madauki na bazata (idan akwai kuskure a cikin shirin), madauki while za a iya maye gurbinsu da for:

for _ = 1, max_req do ...

Sakamakon aiwatar da aikin sync_goods sarari goods mai karɓar zai ƙunshi sabbin sigogin duk bayanan sararin samaniya goods a cikin tushen.

Babu shakka, ba za a iya watsa bayanan share bayanai ta wannan hanyar ba. Idan irin wannan buƙatar ta kasance, zaku iya amfani da alamar gogewa. Ƙara zuwa sarari goods filin boolean is_deleted kuma maimakon share rikodin ta jiki, muna amfani da gogewar ma'ana - muna saita ƙimar filin is_deleted cikin ma'ana true. Wani lokaci maimakon filin boolean is_deleted ya fi dacewa don amfani da filin deleted, wanda ke adana lokacin kwanan wata na share ma'ana na rikodin. Bayan yin share ma'ana, rikodin da aka yiwa alama don gogewa za a canza shi daga tushen zuwa mak'aci (bisa ga dabaru da aka tattauna a sama).

Daidaitawa row_ver za a iya amfani da shi don watsa bayanai daga wasu wurare: babu buƙatar ƙirƙirar jeri daban don kowane sarari da aka watsa.

Mun kalli ingantacciyar hanya ta babban matakin kwafin bayanai a aikace-aikace ta amfani da Tarantool DBMS.

binciken

  1. Tarantool DBMS samfuri ne mai ban sha'awa, mai ban sha'awa don ƙirƙirar aikace-aikace masu ɗaukar nauyi.
  2. Maimaita bayanai na babban matakin yana da fa'idodi da yawa akan kwafin ƙananan matakin.
  3. Hanyar maimaita babban matakin da aka tattauna a cikin labarin yana ba ku damar rage yawan adadin bayanan da aka canjawa wuri ta hanyar canja wurin waɗancan bayanan da suka canza tun lokacin musayar ƙarshe.

source: www.habr.com

Add a comment