Hoʻopili kiʻekiʻe ma Tarantool DBMS

Aloha, ke hana nei au i nā noi no DBMS Tarantool he kahua i hoʻomohala ʻia e Mail.ru Group e hoʻohui i kahi DBMS hana kiʻekiʻe a me kahi kikowaena noi ma ka ʻōlelo Lua. Loaʻa ka wikiwiki kiʻekiʻe o nā hoʻonā e pili ana iā Tarantool, ma muli o ke kākoʻo ʻana i ke ʻano hoʻomanaʻo o ka DBMS a me ka hiki ke hoʻokō i ka loiloi ʻoihana noiʻi ma kahi wahi kikoʻī me ka ʻikepili. I ka manawa like, hōʻoia ʻia ka hoʻomau ʻana o ka ʻikepili me ka hoʻohana ʻana i nā kālepa ACID (ua mālama ʻia kahi log WAL ma ka disk). Ua kākoʻo ʻia ʻo Tarantool no ka hoʻopili hou ʻana a me ka sharding. E hoʻomaka ana mai ka mana 2.1, kākoʻo ʻia nā nīnau ma ka ʻōlelo SQL. He kumu wehe ʻo Tarantool a laikini ʻia ma lalo o ka laikini BSD Simplified. Aia kekahi mana ʻoihana ʻoihana.

Hoʻopili kiʻekiʻe ma Tarantool DBMS
Manaʻo i ka mana! (…ʻoliʻoli i ka hana)

ʻO nā mea a pau i luna nei e hana ʻo Tarantool i kahua hoʻonaninani no ka hana ʻana i nā noi haʻahaʻa kiʻekiʻe e hana pū me nā ʻikepili. Ma ia mau noi, pono pinepine no ka hoʻopili hou ʻana i ka ʻikepili.

E like me ka mea i ʻōlelo ʻia ma luna, ua kūkulu ʻia ʻo Tarantool i ka replication data. ʻO ke kumu o kāna hana, ʻo ia ka hoʻokō ʻana i nā replicas i nā hana āpau i loko o ka log master (WAL). ʻO ka maʻamau ka hoʻopiʻi ʻana (e kapa hou mākou iā ia pae haʻahaʻa) ua hoʻohana ʻia e hōʻoia i ka hoʻomanawanui hewa a/a i ʻole e puʻunaue i ka ukana heluhelu ma waena o nā node cluster.

Hoʻopili kiʻekiʻe ma Tarantool DBMS
Laiki. 1. Hoʻopili hou i loko o kahi pūʻulu

ʻO kahi laʻana o kahi hiʻohiʻona ʻē aʻe ʻo ka hoʻoili ʻana i ka ʻikepili i hana ʻia i loko o kahi waihona i kahi waihona ʻē aʻe no ka hana ʻana/ka nānā ʻana. I ka hihia hope, ʻoi aku ka maʻalahi o ka hoʻohana ʻana pae kiʻekiʻe hoʻopiʻi - hoʻopiʻi ʻikepili ma ka pae loiloi ʻoihana noi. ʻO kēlā mau mea. ʻAʻole mākou e hoʻohana i kahi hoʻonā mākaukau i kūkulu ʻia i loko o ka DBMS, akā e hoʻokō i ka hoʻopiʻi ʻana iā mākou iho i loko o ka noi a mākou e hoʻomohala nei. Loaʻa i kēia ala nā pono a me nā hemahema. E papa inoa i nā pono.

1. Mālama kaʻa kaʻa:

  • ʻAʻole hiki iā ʻoe ke hoʻololi i nā ʻikepili a pau, akā he hapa wale nō ia (e laʻa, hiki iā ʻoe ke hoʻololi i kekahi mau papa, kekahi o kā lākou kolamu a i ʻole nā ​​moʻolelo e kū ana i kekahi mau koi);
  • ʻAʻole like me ka hoʻopiʻi haʻahaʻa haʻahaʻa, i hana mau ʻia i ka asynchronous (i hoʻokō ʻia i ka mana o Tarantool - 1.10) a i ʻole synchronous (e hoʻokō ʻia i nā mana hope o Tarantool), hiki ke hana ʻia ka hoʻopiʻi kiʻekiʻe i nā kau (ʻo ia hoʻi, ka Hoʻopili mua ka noi i ka ʻikepili - kahi ʻikepili hui hoʻololi, a laila aia kahi hoʻomaha i ka hoʻopiʻi ʻana, ma hope o ke kau ʻana o ka hālāwai hoʻololi aʻe, etc.);
  • inā ua loli pinepine ka mooolelo, hiki iā ʻoe ke hoʻololi i kāna mana hou loa (ʻaʻole e like me ka hoʻopiʻi haʻahaʻa haʻahaʻa, kahi e hoʻokani ʻia ai nā hoʻololi āpau i hana ʻia ma ka haku ma nā replicas).

2. ʻAʻohe pilikia me ka hoʻokō ʻana i ka hoʻololi HTTP, kahi e hiki ai iā ʻoe ke hoʻonohonoho i nā ʻikepili mamao.

Hoʻopili kiʻekiʻe ma Tarantool DBMS
Laiki. 2. Hoʻopili hou ma luna o HTTP

3. ʻAʻole pono e like nā hale waihona waihona ma waena o ka hoʻoili ʻia ʻana o ka ʻikepili (eia hoʻi, ma ka hihia maʻamau, hiki ke hoʻohana i nā DBMS like ʻole, nā ʻōlelo hoʻonohonoho, nā paepae, a me nā mea ʻē aʻe).

Hoʻopili kiʻekiʻe ma Tarantool DBMS
Laiki. 3. Hoʻopili hou i nā ʻōnaehana heterogeneous

ʻO ka haʻahaʻa, ma ka awelika, ʻoi aku ka paʻakikī o ka hoʻolālā ʻana ma mua o ka hoʻonohonoho ʻana, a ma kahi o ka hana ʻana i ka hana i kūkulu ʻia, pono ʻoe e hoʻokō i kāu ponoʻī.

Inā ma kou kūlana he mea koʻikoʻi nā pōmaikaʻi i luna (a i ʻole he kūlana kūpono), a laila kūpono ke hoʻohana ʻana i ka replication kiʻekiʻe. E nānā i kekahi mau ala e hoʻokō ai i ka hoʻopiʻi ʻikepili kiʻekiʻe ma ka Tarantool DBMS.

Hoʻemi kaʻaahi

No laila, ʻo kekahi o nā pōmaikaʻi o ka hoʻopiʻi kiʻekiʻe kiʻekiʻe ʻo ia ka mālama ʻana i nā kaʻa. I mea e hoʻokō pono ai kēia pono, pono e hoʻemi i ka nui o ka ʻikepili i hoʻoili ʻia i kēlā me kēia kau hoʻololi. ʻOiaʻiʻo, ʻaʻole pono mākou e poina i ka pau ʻana o ke kau, pono e hoʻonohonoho ʻia ka mea lawe ʻikepili me ke kumu (ma ka liʻiliʻi loa no kēlā ʻāpana o ka ʻikepili e pili ana i ka replication).

Pehea e hōʻemi ai i ka nui o ka ʻikepili i hoʻoili ʻia i ka wā hoʻopiʻi kiʻekiʻe? Hiki ke koho i ka ʻikepili ma ka lā a me ka manawa. No ka hana ʻana i kēia, hiki iā ʻoe ke hoʻohana i ka māla lā-manawa i loaʻa i ka pākaukau (inā loaʻa). No ka laʻana, loaʻa i kahi palapala "kauoha" kahi kahua "manawa hoʻokō kauoha pono" - delivery_time. ʻO ka pilikia me kēia hoʻonā, ʻaʻole pono nā waiwai o kēia kahua i ke kaʻina e pili ana i ka hana ʻana o nā kauoha. No laila ʻaʻole hiki iā mākou ke hoʻomanaʻo i ka nui o ka waiwai kahua delivery_time, hoʻouna ʻia i ka wā hoʻololi i hala, a i ka wā hoʻololi e hiki mai ana e koho i nā moʻolelo āpau me ka waiwai o ke kahua kiʻekiʻe delivery_time. Ua hoʻohui ʻia paha nā moʻolelo me ka waiwai kahua haʻahaʻa ma waena o nā kau hoʻololi delivery_time. Eia kekahi, hiki ke hoʻololi ʻia ke kauoha, ʻaʻole naʻe i pili i ke kahua delivery_time. Ma nā hihia ʻelua, ʻaʻole e hoʻoneʻe ʻia nā hoʻololi mai ke kumu i kahi e hele ai. No ka hoʻoponopono i kēia mau pilikia, pono mākou e hoʻoili i ka ʻikepili "overlapping". ʻO kēlā mau mea. i kēlā me kēia kau hoʻololi e hoʻoili mākou i nā ʻikepili āpau me ka waiwai kahua delivery_time, ʻoi aku ma mua o kekahi manawa i hala (no ka laʻana, N mau hola mai kēia manawa). Eia nō naʻe, ʻike maopopo ʻia no nā ʻōnaehana nui, ʻoi aku ka nui o kēia ala a hiki ke hōʻemi i ka mālama kālā a mākou e hoʻoikaika nei no ka mea ʻole. Eia kekahi, ʻaʻohe kahua e pili ana i ka pākaukau e hoʻoili ʻia me kahi lā-manawa.

ʻO kahi hopena ʻē aʻe, ʻoi aku ka paʻakikī o ka hoʻokō ʻana, ʻo ia ka ʻae ʻana i ka loaʻa ʻana o ka ʻikepili. I kēia hihia, i kēlā me kēia kau hoʻololi, hoʻouna ʻia nā ʻikepili āpau, ʻaʻole i hōʻoia ʻia ka loaʻa ʻana e ka mea loaʻa. No ka hoʻokō ʻana i kēia, pono ʻoe e hoʻohui i kahi kolamu Boolean i ka papa kumu (no ka laʻana, is_transferred). Inā ʻae ka mea hoʻokipa i ka loaʻa ʻana o ka moʻolelo, e lawe ke kahua pili i ka waiwai true, ma hope o ke komo ʻana ʻaʻole i komo hou i ka hoʻololi. Loaʻa i kēia koho hoʻokō nā hemahema. ʻO ka mea mua, no kēlā me kēia moʻolelo i hoʻoili ʻia, pono e hana a hoʻouna ʻia kahi hōʻoia. ʻO ka ʻōlelo koʻikoʻi, hiki ke hoʻohālikelike ʻia kēia me ka pālua ʻana i ka nui o ka ʻikepili i hoʻoili ʻia a alakaʻi i ka pālua ʻana i ka helu o nā huakaʻi hele. ʻO ka lua, ʻaʻohe hiki ke hoʻouna i ka moʻolelo like i kekahi mau mea hoʻokipa (ʻo ka mea loaʻa mua e hōʻoia i ka loaʻa nona iho a no nā mea ʻē aʻe a pau).

ʻO kahi ala i loaʻa ʻole nā ​​hemahema i hāʻawi ʻia ma luna nei e hoʻohui i kahi kolamu i ka papa i hoʻouna ʻia e nānā i nā loli i kāna mau lālani. Hiki i ia kolamu ke ʻano lā-manawa a pono e hoʻonohonoho/hōʻano hou ʻia e ka noi i ka manawa o kēia manawa i kēlā me kēia manawa i hoʻohui ʻia ai nā moʻolelo (atomically me ka hoʻohui/hoʻololi). E like me ka laʻana, e kāhea kākou i ke kolamu update_time. Ma ka mālama ʻana i ka waiwai nui o kēia kolamu no nā moʻolelo i hoʻoili ʻia, hiki iā mākou ke hoʻomaka i ke kau hoʻololi aʻe me kēia waiwai (koho i nā moʻolelo me ka waiwai kahua. update_time, ma mua o ka waiwai i mālama mua ʻia). ʻO ka pilikia me ke ala hope, hiki ke hoʻololi i ka ʻikepili i nā pūʻulu. I ka hopena o nā waiwai kahua i ke kolamu update_time ʻaʻole paha he ʻokoʻa. No laila, ʻaʻole hiki ke hoʻohana ʻia kēia kolamu no ka puka ʻana o ka ʻikepili i māhele ʻia (ʻaoʻao-ʻaoʻao). No ka hōʻike ʻana i ka ʻaoʻao ʻikepili ma ka ʻaoʻao, pono ʻoe e noʻonoʻo i nā mīkini ʻē aʻe e haʻahaʻa loa ka maikaʻi (e like me ka lawe ʻana mai ka waihona i nā moʻolelo āpau me ka waiwai. update_time kiʻekiʻe ma mua o ka mea i hāʻawi ʻia a hana i kekahi helu o nā moʻolelo, e hoʻomaka ana mai kahi offset mai ka hoʻomaka ʻana o ka hāpana).

Hiki iā ʻoe ke hoʻomaikaʻi i ka maikaʻi o ka hoʻoili ʻikepili ma o ka hoʻomaikaʻi iki ʻana i ke ala mua. No ka hana ʻana i kēia, e hoʻohana mākou i ke ʻano integer (long integer) e like me ke kolamu kolamu waiwai no ka huli ʻana i nā loli. E inoa kākou i ke kolamu row_ver. Pono e hoʻonohonoho/hōʻano hou ʻia ka waiwai kahua o kēia kolamu i kēlā me kēia manawa i hana ʻia ai kahi moʻolelo. Akā i kēia hihia, ʻaʻole e hāʻawi ʻia ke kahua i ka lā-manawa o kēia manawa, akā ʻo ka waiwai o kekahi counter, hoʻonui ʻia e hoʻokahi. ʻO ka hopena, ke kolamu row_ver e loaʻa nā waiwai kūʻokoʻa a hiki ke hoʻohana ʻia ʻaʻole wale e hōʻike i ka ʻikepili "delta" (ʻikepili i hoʻohui ʻia / hoʻololi ʻia mai ka hopena o ke kau hoʻololi mua), akā no ka hoʻokaʻawale maʻalahi a me ka pono i nā ʻaoʻao.

ʻO ke ala hope i manaʻo ʻia no ka hōʻemi ʻana i ka nui o ka ʻikepili i hoʻoili ʻia i loko o ke ʻano o ka hoʻopiʻi kiʻekiʻe kiʻekiʻe i koʻu manaʻo ʻo ia ka mea maikaʻi loa a puni. E nānā hou aku kākou.

Kaʻa ʻana i ka ʻikepili me ka hoʻohana ʻana i kahi helu helu lālani

Ka hoʻokō ʻana i ka ʻāpana kikowaena / haku

Ma MS SQL Server, aia kahi ʻano kolamu kūikawā e hoʻokō i kēia ala - rowversion. Loaʻa i kēlā me kēia waihona kahi counter e hoʻonui i hoʻokahi i kēlā me kēia manawa i hoʻohui ʻia / hoʻololi ʻia kahi moʻolelo i kahi papa i loaʻa ke kolamu like rowversion. Hāʻawi ʻia ka waiwai o kēia counter i ke kahua o kēia kolamu ma ka moʻolelo i hoʻohui ʻia. ʻAʻole i loaʻa i ka Tarantool DBMS kahi hana i kūkulu ʻia. Eia naʻe, ma Tarantool ʻaʻole paʻakikī ke hoʻokō me ka lima. E nānā kākou i ka hana ʻana o kēia.

ʻO ka mea mua, he mau huaʻōlelo liʻiliʻi: ua kapa ʻia nā papa ma Tarantool i nā hakahaka, a ua kapa ʻia nā moʻolelo he tuples. Ma Tarantool hiki iā ʻoe ke hana i nā kaʻina. ʻAʻole ʻē aʻe nā kaʻina hana ma mua o nā mea hoʻomohala i hoʻopaʻa ʻia i nā waiwai integer i kauoha ʻia. ʻO kēlā mau mea. ʻo kēia ka mea e pono ai mākou no kā mākou hana. Ma lalo e hana mākou i kahi ʻano like.

Ma mua o ka hana ʻana i kahi hana waihona ma Tarantool, pono ʻoe e holo i kēia kauoha:

box.cfg{}

ʻO ka hopena, e hoʻomaka ʻo Tarantool e kākau i nā snapshot database a me nā moʻolelo kālepa i ka papa kuhikuhi o kēia manawa.

E hana kākou i kaʻina row_version:

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

Koho if_not_exists hiki ke hoʻokō ʻia ka palapala hana i nā manawa he nui: inā loaʻa ka mea, ʻaʻole e hoʻāʻo ʻo Tarantool e hana hou. E hoʻohana ʻia kēia koho i nā kauoha DDL a pau.

E hana kākou i kahi ākea i laʻana.

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

Maanei mākou e kau ai i ka inoa o ka hakahaka (goods), inoa kahua a me ko lākou ʻano.

Hoʻokumu pū ʻia nā kahua hoʻonui auto-incrementing ma Tarantool me ka hoʻohana ʻana i nā kaʻina. E hana kāua i kahi kī mua hoʻonui ʻakomi ma ke kahua 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
})

Kākoʻo ʻo Tarantool i nā ʻano kuhikuhi. ʻO nā ʻano kuhikuhi maʻamau i hoʻohana ʻia ʻo TREE a me HASH, i hoʻokumu ʻia ma nā hale e pili ana i ka inoa. ʻO TREE ka ʻano kuhikuhi nui loa. Hāʻawi ia iā ʻoe e kiʻi i ka ʻikepili ma kahi ʻano hoʻonohonoho. Akā no ke koho kaulike, ʻoi aku ka maikaʻi o HASH. No laila, pono e hoʻohana i ka HASH no ke kī mua (ʻo ia kā mākou i hana ai).

E hoʻohana i ke kolamu row_ver e hoʻololi i ka ʻikepili i hoʻololi ʻia, pono ʻoe e hoʻopaʻa i nā koina kaʻina i nā kahua o kēia kolamu row_ver. Akā ʻaʻole like me ke kī mua, ka waiwai kahua kolamu row_ver pono e hoʻonui i hoʻokahi ʻaʻole wale i ka hoʻohui ʻana i nā moʻolelo hou, akā i ka wā e hoʻololi ai i nā moʻolelo i loaʻa. Hiki iā ʻoe ke hoʻohana i nā mea hoʻoiho no kēia. Loaʻa i ʻelua ʻano o nā ʻano mea hoʻokalakupua o Tarantool: before_replace и on_replace. Hoʻopau ʻia nā mea hoʻoheheʻe i ka wā e hoʻololi ai ka ʻikepili i ka hakahaka (no kēlā me kēia tuple i hoʻopili ʻia e nā loli, hoʻomaka ʻia kahi hana trigger). ʻAʻole like on_replace, before_replace-ʻae nā triggers iā ʻoe e hoʻololi i ka ʻikepili o ka tuple kahi i hoʻokō ʻia ai ka trigger. No laila, kūpono ke ʻano o nā mea hoʻowalewale iā mākou.

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

Hoʻololi ka mea hoʻomaka i ka waiwai kahua row_ver mālama ʻia ka tuple i ka waiwai aʻe o ke kaʻina row_version.

I mea e hiki ai ke unuhi i ka ʻikepili mai ka lewa goods ma ke kolamu row_ver, e hana kākou i index:

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

ʻAno papa kuhikuhi - lāʻau (TREE), no ka mea pono mākou e unuhi i ka ʻikepili i ka piʻi ʻana o nā waiwai i ke kolamu row_ver.

E hoʻohui i kekahi mau ʻikepili i ka hakahaka:

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}

No ka mea ʻO ke kahua mua he pākuʻi hoʻonui ʻokoʻa; ua hala mākou i ka nil. E hoʻololi koke ʻo Tarantool i ka waiwai aʻe. Pēlā nō, e like me ka waiwai o nā kahua kolamu row_ver hiki iā ʻoe ke hele i ka nil - a i ʻole e kuhikuhi i ka waiwai, no ka mea noho kēia kolamu i ke kūlana hope loa ma ke ākea.

E nānā kākou i ka hopena hoʻokomo:

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 like me kāu e ʻike ai, hoʻopiha ʻia nā kahua mua a me ka hope. I kēia manawa e maʻalahi ke kākau i kahi hana no ka hoʻouka ʻana i kēlā me kēia ʻaoʻao i nā loli wahi 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

Lawe ka hana i mea hoʻohālikelike i ka waiwai row_ver, e hoʻomaka ana mai kahi e pono ai e wehe i nā loli, a hoʻihoʻi i kahi hapa o ka ʻikepili i hoʻololi ʻia.

Hana ʻia ka laʻana ʻikepili ma Tarantool ma o nā kuhikuhi. Hana get_goods hoʻohana i ka iterator ma ka index row_ver e loaʻa i ka ʻikepili i hoʻololi ʻia. ʻO GT ke ʻano Iterator (ʻoi aku ma mua, ʻoi aku ma mua o). ʻO ia ke ʻano o ka mea ʻike e hoʻohele i nā helu helu e hoʻomaka ana mai ke kī i hala (ke kahua waiwai. row_ver).

Hoʻihoʻi ka mea hana i nā tuple. I mea e hiki ai ke hoʻololi i ka ʻikepili ma o HTTP, pono e hoʻololi i nā tuple i kahi hale kūpono no ka serialization ma hope. Hoʻohana ka laʻana i ka hana maʻamau no kēia tomap. Ma kahi o ka hoʻohana ʻana tomap hiki iā ʻoe ke kākau i kāu hana ponoʻī. No ka laʻana, makemake paha mākou e inoa hou i kahi kahua name, mai hala i ke kula code a hoʻohui i kahi kahua 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

Hoʻoholo ʻia ka nui o ka ʻaoʻao o ka ʻikepili puka (ka helu o nā moʻolelo i hoʻokahi ʻāpana) e ka mea hoʻololi page_size. Ma ka laʻana ka waiwai page_size ʻo 5. Ma kahi papahana maoli, ʻoi aku ka nui o ka nui o ka ʻaoʻao. Pili ia i ka nui awelika o ka tuple space. Hiki ke hoʻoholo ʻia ka nui o ka ʻaoʻao maikaʻi loa ma ke ana ʻana i ka manawa hoʻoili ʻikepili. ʻO ka nui o ka nui o ka ʻaoʻao, ʻoi aku ka liʻiliʻi o ka helu o nā huakaʻi hele ma waena o nā ʻaoʻao hoʻouna a loaʻa. Ma kēia ala hiki iā ʻoe ke hōʻemi i ka manawa holoʻokoʻa no ka hoʻoiho ʻana i nā loli. Eia nō naʻe, inā ʻoi aku ka nui o ka ʻaoʻao, e lōʻihi loa mākou ma ke kikowaena e hoʻolaha ana i ka hāpana. ʻO ka hopena, hiki ke lohi i ka hana ʻana i nā noi ʻē aʻe e hele mai ana i ke kikowaena. ʻĀpana page_size hiki ke hoʻouka ʻia mai ka faila hoʻonohonoho. No kēlā me kēia wahi i hoʻouna ʻia, hiki iā ʻoe ke hoʻonohonoho i kona waiwai ponoʻī. Eia naʻe, no ka hapa nui o nā hakahaka, kūpono paha ka waiwai paʻamau (no ka laʻana, 100).

E hoʻokō kākou i ka hana 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
...

E lawe kākou i ka waiwai kahua row_ver mai ka laina hope a kāhea hou i ka hana:

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

Kekahi manawa hou:

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

E like me kāu e ʻike ai, ke hoʻohana ʻia i kēia ala, hoʻihoʻi ka hana i nā moʻolelo āpau āpau ma ka ʻaoʻao goods. Hoʻopili ʻia ka ʻaoʻao hope me kahi koho hakahaka.

E hoʻololi kākou i ka hakahaka:

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

Ua hoʻololi mākou i ka waiwai kahua name no hoʻokahi komo ʻana a hoʻohui i ʻelua mau mea hou.

E hana hou kākou i ke kelepona hana hope loa:

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

Ua hoʻihoʻi ka hana i nā moʻolelo i hoʻololi a hoʻohui ʻia. No laila ka hana get_goods hiki iā ʻoe ke loaʻa ka ʻikepili i hoʻololi ʻia mai kona kāhea hope ʻana, ʻo ia ke kumu o ke ʻano replication e noʻonoʻo nei.

E haʻalele mākou i ka hoʻopuka ʻana o nā hopena ma o HTTP ma ke ʻano o JSON ma waho o ke kiko o kēia ʻatikala. Hiki iā ʻoe ke heluhelu e pili ana i kēia ma aneʻi: https://habr.com/ru/company/mailru/blog/272141/

Ka hoʻokō ʻana i ka ʻāpana o ka mea kūʻai aku / kauā

E nānā kākou i ke ʻano o ka hoʻokō ʻana o ka ʻaoʻao e loaʻa ana. E hana kāua i wahi ma ka ʻaoʻao e hoʻopaʻa i ka ʻikepili i hoʻoiho ʻia:

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 ke ʻano o ke ākea e like me ke ʻano o ke ākea i ke kumu. Akā no ka mea ʻaʻole mākou e hele i ka ʻikepili i loaʻa ma kahi ʻē aʻe, ʻo ke kolamu row_ver ʻaʻole ma kahi o ka mea loaʻa. Ma ke kula id e hoʻopaʻa ʻia nā mea ʻike kumu. No laila, ma ka ʻaoʻao hoʻokipa ʻaʻole pono e hoʻonui i ka auto-incrementing.

Eia hou, pono mākou i kahi e mālama ai i nā waiwai 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
})

No kēlā me kēia wahi i hoʻouka ʻia (field space_name) e mālama mākou i ka waiwai hoʻoili hope loa ma aneʻi row_ver ( kahua value). ʻO ke kolamu ke kī mua space_name.

E hana kākou i hana e hoʻouka i ka ʻikepili lewa goods ma o HTTP. No ka hana ʻana i kēia, pono mākou i kahi waihona e hoʻokō i kahi mea kūʻai aku HTTP. Hoʻouka ka laina aʻe i ka waihona a hoʻomaka koke i ka mea kūʻai aku HTTP:

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

Pono mākou i kahi waihona no ka deserialization json:

local json = require('json')

Ua lawa kēia e hana i kahi hana hoʻoili ʻikepili:

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

Hoʻokō ka hana i kahi noi HTTP i ka helu url a hoʻouna iā ia row_ver ma ke ʻano he ʻāpana a hoʻihoʻi i ka hopena deserialized o ka noi.

ʻO ka hana no ka mālama ʻana i ka ʻikepili i loaʻa e like me kēia:

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

Ka pōʻaiapuni o ka mālama ʻana i ka ʻikepili i ka lewa goods hoʻokomo ʻia i kahi kālepa (hoʻohana ʻia ka hana no kēia box.atomic) e hoemi i ka nui o na hana diski.

ʻO ka hope, ka hana hoʻonohonoho hoʻonohonoho kūloko goods me kahi kumu hiki iā ʻoe ke hoʻokō e like me kēia:

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

Heluhelu mua mākou i ka waiwai i mālama mua ʻia row_ver no ka hakahaka goods. Inā nalo (ka hālāwai hoʻololi mua), a laila lawe mākou e like me row_ver ʻole. Ma hope o ka pōʻai, hana mākou i ka hoʻoiho ʻana i ka ʻaoʻao ma ka ʻaoʻao o ka ʻikepili i hoʻololi ʻia mai ke kumu ma ka url i kuhikuhi ʻia. I kēlā me kēia hoʻololi, mālama mākou i ka ʻikepili i loaʻa i kahi kikowaena kūloko kūpono a hoʻonui i ka waiwai row_ver (i ka lewa row_ver a ma ka hoololi row_ver) - lawe i ka waiwai row_ver mai ka laina hope o ka ʻikepili i hoʻouka ʻia.

No ka pale ʻana i ka looping pōʻino (inā he hewa i ka papahana), ʻo ka loop while hiki ke pani ia e for:

for _ = 1, max_req do ...

Ma muli o ka hoʻokō ʻana i ka hana sync_goods ākea goods e loaʻa i ka mea hoʻokipa nā mana hou loa o nā moʻolelo āpau āpau goods i ke kumu.

ʻIke loa, ʻaʻole hiki ke hoʻolaha ʻia ka holoi ʻana i ka ʻikepili ma kēia ʻano. Inā loaʻa kēlā pono, hiki iā ʻoe ke hoʻohana i kahi hōʻailona holoi. Hoʻohui i kahi ākea goods kahua boolean is_deleted a ma kahi o ka holoi kino ʻana i kahi moʻolelo, hoʻohana mākou i ka holoi pono - hoʻonoho mākou i ka waiwai kahua is_deleted i ke ano true. I kekahi manawa ma kahi o kahi kahua boolean is_deleted ʻoi aku ka maʻalahi o ka hoʻohana ʻana i ke kahua deleted, e mālama ana i ka lā-manawa o ka holoi pono ʻana o ka moʻolelo. Ma hope o ka hana ʻana i kahi holoi pono, e hoʻoneʻe ʻia ka moʻolelo i hōʻailona ʻia no ka holoi ʻana mai ke kumu a i kahi e hele ai (e like me ka loiloi i kūkākūkā ʻia ma luna).

ʻĀina row_ver hiki ke hoʻohana ʻia e hoʻouna i nā ʻikepili mai nā wahi ʻē aʻe: ʻaʻohe pono e hana i kahi kaʻina kaʻawale no kēlā me kēia wahi i hoʻouna ʻia.

Ua nānā mākou i kahi ala kūpono o ka hoʻopili ʻana i ka ʻikepili kiʻekiʻe i nā noi me ka hoʻohana ʻana i ka Tarantool DBMS.

haʻina

  1. ʻO Tarantool DBMS kahi huahana maikaʻi a hoʻohiki no ka hana ʻana i nā noi kiʻekiʻe.
  2. Loaʻa i ka hoʻopiʻi ʻikepili pae kiʻekiʻe ka nui o nā pono ma mua o ka hoʻopiʻi haʻahaʻa.
  3. ʻO ke ʻano hana hoʻopiʻi kiʻekiʻe i kūkākūkā ʻia ma ka ʻatikala e hiki ai iā ʻoe ke hōʻemi i ka nui o ka ʻikepili i hoʻoili ʻia ma ka hoʻoili ʻana i kēlā mau moʻolelo i hoʻololi ʻia mai ke kau hoʻololi hope.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka