Ndewo, m na-emepụta ngwa maka DBMS bụ ikpo okwu nke Mail.ru Group mebere nke jikọtara DBMS dị elu yana ihe nkesa ngwa n'asụsụ Lua. A na-enweta ngwa ngwa dị elu nke ngwọta dabere na Tarantool, karịsịa, n'ihi nkwado maka ọnọdụ ebe nchekwa nke DBMS na ikike iji mebie azụmahịa azụmahịa ngwa n'otu oghere adreesị na data. N'otu oge ahụ, a na-ahụta nkwụsi ike data site na iji azụmahịa ACID (a na-edobe ndekọ WAL na diski). Tarantool nwere nkwado n'ime ya maka mmụgharị na nzacha. Malite na ụdị 2.1, a na-akwado ajụjụ n'asụsụ SQL. Tarantool bụ ebe mepere emepe ma nweta ikike n'okpuru ikikere BSD Simplified. Enwekwara ụdị ụlọ ọrụ azụmahịa.

Nwee mmetụta ike! (...aka enwe obi ụtọ na arụmọrụ)
Ihe niile dị n'elu na-eme ka Tarantool bụrụ ikpo okwu mara mma maka ịmepụta ngwa dị elu nke na-arụ ọrụ na ọdụ data. N'ime ngwa ndị dị otú ahụ, a na-enwekarị mkpa maka mmegharị data.
Dịka ekwuru n'elu, Tarantool nwere ntinye data arụnyere n'ime ya. Ụkpụrụ nke ọrụ ya bụ ime usoro n'usoro n'usoro azụmahịa niile dị na log log (WAL). Na-emekarị ụdị mmegharị ahụ (anyị ga-akpọ ya ọzọ obere ọkwa) a na-eji iji hụ na nnabata mmejọ ngwa na/ma ọ bụ kesaa ibu ọgụgụ n'etiti ọnụ ụyọkọ.

Osikapa. 1. Ntugharị n'ime ụyọkọ
Ihe atụ nke ihe atụ ọzọ ga-abụ ịnyefe data emepụtara n'otu nchekwa data gaa na nchekwa data ọzọ maka nhazi/nleba anya. N'okwu nke ikpeazụ, ngwọta dị mma karịa nwere ike ịbụ iji elu larịị replication - data mmụgharị na ngwa mgbagha larịị. Ndị ahụ. Anyị anaghị eji ngwọta emebere emebere n'ime DBMS, kama mejuputa n'onwe anyị n'ime ngwa anyị na-etolite. Ụzọ a nwere ma uru na ọghọm. Ka anyị depụta uru ọ bara.
1. Nchekwa okporo ụzọ:
- Ị nweghị ike ịnyefe data niile, ma ọ bụ naanị akụkụ ya (dịka ọmụmaatụ, ị nwere ike ịnyefe naanị tebụl ụfọdụ, ụfọdụ ogidi ha ma ọ bụ ihe ndekọ nke na-ezute ụfọdụ criterion);
- N'adịghị ka mmegharị ala dị ala, nke a na-eme na-aga n'ihu na asynchronous (nke etinyere na ụdị Tarantool ugbu a - 1.10) ma ọ bụ synchronous (a ga-emejuputa na ụdị Tarantool ndị na-esote), enwere ike ịme mmegharị ọkwa dị elu na nnọkọ (ya bụ, ngwa mbụ na-emekọrịta data - data nnọkọ mgbanwe, mgbe ahụ enwere nkwụsịtụ na mmegharị, mgbe nke ahụ gasịrị, nnọkọ mgbanwe ọzọ na-eme, wdg);
- Ọ bụrụ na ndekọ agbanweela ọtụtụ oge, ị nwere ike ịnyefe naanị ụdị ọhụrụ ya (n'adịghị ka mmegharị ala dị ala, nke a ga-akpọghachi mgbanwe niile emere na nna ukwu n'usoro n'usoro n'ụdị).
2. Enweghị ihe isi ike na mmejuputa mgbanwe HTTP, nke na-enye gị ohere ịmekọrịta ọdụ data dịpụrụ adịpụ.

Osikapa. 2. Ntugharị n'elu HTTP
3. Usoro nchekwa data dị n'etiti nke a na-ebufe data ekwesịghị ịbụ otu (ọkwa, n'ozuzu, ọ ga-ekwe omume iji DBMS dị iche iche, asụsụ mmemme, ikpo okwu, wdg).

Osikapa. 3. Ntugharị na sistemu dị iche iche
Ihe dị ala bụ na, na nkezi, mmemme siri ike / dị ọnụ karịa nhazi, na kama ịhazi ọrụ arụnyere, ị ga-emejuputa nke gị.
Ọ bụrụ na n'ọnọdụ gị uru ndị dị n'elu dị oke mkpa (ma ọ bụ ọnọdụ dị mkpa), mgbe ahụ ọ bụ ihe ezi uche dị na ya iji ngbanwe ọkwa dị elu. Ka anyị leba anya n'ọtụtụ ụzọ iji mejuputa ngbanwe data dị elu na Tarantool DBMS.
Mbelata okporo ụzọ
Ya mere, otu n'ime uru nke mmegharị ọkwa dị elu bụ nchekwa okporo ụzọ. Ka uru a wee mezuo n'ụzọ zuru ezu, ọ dị mkpa iji belata ọnụọgụ data a na-ebufe n'oge oge mgbanwe ọ bụla. N'ezie, anyị ekwesịghị ichefu na na njedebe nke nnọkọ ahụ, a ghaghị imekọrịta onye nata data na isi iyi (ma ọ dịkarịa ala maka akụkụ ahụ nke data na-etinye aka na nsụgharị).
Kedu ka esi ewelata ọnụọgụ data ebugharị n'oge mmegharị ọkwa dị elu? Ngwọta dị mfe nwere ike ịbụ ịhọrọ data site na ụbọchị na oge. Iji mee nke a, ịnwere ike iji mpaghara oge ụbọchị dị na tebụl (ọ bụrụ na ọ dị). Dịka ọmụmaatụ, akwụkwọ "ịtụ" nwere ike ịnwe mpaghara "oge mmezu iwu achọrọ" - delivery_time. Nsogbu na ngwọta a bụ na ụkpụrụ dị na mpaghara a ekwesịghị ịdị na usoro nke kwekọrọ na ịmepụta iwu. Yabụ na anyị enweghị ike icheta oke uru ubi delivery_time, bufere n'oge mgbanwe mgbanwe gara aga, na n'oge mgbanwe mgbanwe na-esote, họrọ ndekọ niile nwere uru ubi dị elu delivery_time. Enwere ike ịgbakwunye ndekọ nwere ọnụ ala ala n'etiti oge mgbanwe delivery_time. Ọzọkwa, iwu nwere ike ime mgbanwe, nke na-agbanyeghị emetụtaghị ubi delivery_time. N'okwu abụọ ahụ, a gaghị ebufe mgbanwe ndị ahụ site na isi iyi gaa na ebe a na-aga. Iji dozie nsogbu ndị a, anyị ga-achọ ịnyefe data "overlapping". Ndị ahụ. na oge mgbanwe ọ bụla anyị ga-ebufe data niile na uru ubi delivery_time, gafere oge ụfọdụ n'oge gara aga (dịka ọmụmaatụ, awa N site na oge ugbu a). Otú ọ dị, o doro anya na maka nnukwu usoro usoro a bụ nke a na-ejikarị eme ihe ma nwee ike ibelata ego nchekwa okporo ụzọ anyị na-agbalịsi ike ka ọ bụrụ ihe efu. Na mgbakwunye, tebụl a na-ebufe nwere ike ọ gaghị enwe ubi jikọtara ya na oge ụbọchị.
Ihe ngwọta ọzọ, dị mgbagwoju anya n'ihe gbasara mmejuputa, bụ ịnakwere nnata nke data. N'okwu a, n'oge nnọkọ mgbanwe ọ bụla, a na-ebufe data niile, nke onye nnata ekwenyebeghị nnata ya. Iji mejuputa nke a, ị ga-achọ ịgbakwunye kọlụm Boolean na tebụl isi mmalite (dịka ọmụmaatụ, is_transferred). Ọ bụrụ na onye nnata nabatara nnata ndekọ ahụ, mpaghara kwekọrọ na-ewere uru ahụ true, mgbe nke ahụ gasịrị ntinye adịghị etinye aka na mgbanwe. Nhọrọ mmejuputa a nwere ihe ọghọm ndị a. Nke mbụ, maka ndekọ ọ bụla bufee, a ga-ewepụtarịrị ma zipụ nkwenye. N'ikwu okwu n'ụzọ dị mfe, nke a nwere ike iji tụnyere okpukpu abụọ nke data ebufere ma na-eduga n'ime okpukpu abụọ nke ọnụọgụ njem. Nke abuo, enweghi ike izipu otu ndekọ ahụ na ọtụtụ ndị nnata (onye mbụ natara ga-akwado nnata maka onwe ya na ndị ọzọ niile).
Usoro nke na-enweghị ọghọm e nyere n'elu bụ ịgbakwunye kọlụm na tebụl bufere iji soro mgbanwe dị na ahịrị ya. Ụdị kọlụm dị otú ahụ nwere ike ịbụ nke ụdị oge-ụbọchị ma ga-edozi / melite ya site na ngwa ngwa ruo ugbu a oge ọ bụla agbakwunyere / gbanwee ndekọ (atomically na mgbakwunye / mgbanwe). Dịka ọmụmaatụ, ka anyị kpọọ kọlụm update_time. Site n'ichekwa oke uru ubi nke kọlụm a maka ndekọ ndị ebufetara, anyị nwere ike iji uru a malite nnọkọ mgbanwe ọzọ (họrọ ndekọ nwere uru ubi. update_time, gafere uru echekwara na mbụ). Nsogbu na ụzọ ikpeazụ bụ na mgbanwe data nwere ike ime na batches. N'ihi nke ubi ụkpụrụ na kọlụm update_time nwere ike ọ gaghị abụ ihe pụrụ iche. Ya mere, enweghị ike iji kọlụm a maka mpụta data ekesara (ibe-na ibe). Iji gosipụta ibe data site na ibe, ị ga-emepụta usoro ndị ọzọ nke ga-enwe ike ịrụ ọrụ dị ala (dịka ọmụmaatụ, iweghachite na nchekwa data niile nwere uru bara uru. update_time dị elu karịa nke enyere ma na-emepụta ọnụ ọgụgụ ụfọdụ nke ndekọ, na-amalite site na nkwụsị ụfọdụ site na mmalite nke ihe atụ).
Ị nwere ike melite arụmọrụ nke ịnyefe data site na imeziwanye ụzọ gara aga. Iji mee nke a, anyị ga-eji ụdị integer (ogologo integer) dị ka ụkpụrụ ubi kọlụm maka mgbanwe mgbanwe. Ka anyị kpọọ kọlụm ahụ row_ver. A ka ga-edozi/imelite uru ubi nke kọlụm a oge ọ bụla emepụtara/gbanwee ndekọ. Ma na nke a, a gaghị ekenye ubi ahụ oge-oge dị ugbu a, mana uru nke ụfọdụ counter, mụbara otu. N'ihi ya, kọlụm row_ver ga-enwe ụkpụrụ pụrụ iche ma enwere ike iji ya ọ bụghị naanị gosipụta data "delta" (data agbakwunyere / gbanwere kemgbe njedebe nke nnọkọ mgbanwe gara aga), kamakwa iji mebie ya nke ọma na ibe.
Usoro ikpeazụ a tụrụ aro iji belata ọnụọgụ data ebufe n'ime usoro mmegharị ọkwa dị elu yiri m nke kachasị mma na nke zuru ụwa ọnụ. Ka anyị lebakwuo anya na ya.
Na-agafe data site na iji akara ụdịdị ahịrị
Mmejuputa nke ihe nkesa / akụkụ ukwu
Na MS SQL Server, enwere ụdị kọlụm pụrụ iche iji mejuputa usoro a - rowversion. Ebe nchekwa data ọ bụla nwere counter nke na-abawanye site na otu oge ọ bụla agbakwunyere / gbanwee ndekọ na tebụl nwere kọlụm dị ka rowversion. A na-ekenye uru nke counter a na-akpaghị aka na mpaghara kọlụm a na ndekọ agbakwunyere / gbanwere. Tarantool DBMS enweghị usoro arụnyere n'ime ya. Agbanyeghị, na Tarantool ọ naghị esiri ike iji aka mejuputa ya. Ka anyị lee otú e si eme nke a.
Nke mbụ, ntakịrị okwu okwu: tebụl dị na Tarantool ka a na-akpọ oghere, na ndekọ na-akpọ tuples. Na Tarantool ị nwere ike ịmepụta usoro. Usoro abụghị ihe ọzọ karịa aha ndị na-emepụta ụkpụrụ integer ahaziri aha. Ndị ahụ. nke a bụ kpọmkwem ihe anyị chọrọ maka ebumnuche anyị. N'okpuru ebe a, anyị ga-emepụta usoro dị otú ahụ.
Tupu ịrụ ọrụ nchekwa data ọ bụla na Tarantool, ịkwesịrị ịme iwu a:
box.cfg{}
N'ihi ya, Tarantool ga-amalite ịde ihe ntanetị nchekwa data na ndekọ azụmahịa na ndekọ ugbu a.
Ka anyị mepụta usoro row_version:
box.schema.sequence.create('row_version',
{ if_not_exists = true })
Nhọrọ if_not_exists na-enye ohere ka e gbuo edemede okike ọtụtụ ugboro: ọ bụrụ na ihe ahụ dị, Tarantool agaghị anwa ịmepụta ya ọzọ. A ga-eji nhọrọ a na iwu DDL niile na-esote.
Ka anyị mepụta oghere dịka ọmụmaatụ.
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
})
N'ebe a, anyị debere aha oghere ahụ (goods), aha ubi na ụdị ha.
A na-emepụtakwa mpaghara na-abawanye na Tarantool site na iji usoro. Ka anyị mepụta igodo isi na-abawanye na akpaghị aka site na ubi 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 na-akwado ọtụtụ ụdị ndeksi. Ndekọ ndị a na-ejikarị eme ihe bụ ụdị TREE na HASH, bụ ndị gbadoro ụkwụ n'usoro dabara na aha ahụ. TREE bụ ụdị nrịbama na-agbanwe agbanwe. Ọ na-enye gị ohere iweghachite data n'usoro ahaziri ahazi. Mana maka nhọrọ nha nhata, HASH dabara adaba. N'ihi ya, ọ bụ ihe amamihe dị na ya iji HASH maka igodo mbụ (nke bụ ihe anyị mere).
Iji kọlụm row_ver iji nyefee data gbanwere, ịkwesịrị ijikọ ụkpụrụ usoro na mpaghara kọlụm a row_ver. Mana n'adịghị ka igodo isi, uru ubi kọlụm row_ver kwesịrị ịbawanye site na otu ọ bụghị naanị mgbe ị na-agbakwunye ndekọ ọhụrụ, kamakwa mgbe ị na-agbanwe ndị dị adị. Ị nwere ike iji ihe mkpali maka nke a. Tarantool nwere ụdị ihe abụọ na-akpalite oghere: before_replace и on_replace. A na-agbapụ ihe ndị na-akpali akpali mgbe ọ bụla data dị na oghere na-agbanwe (maka tuple ọ bụla mgbanwe ndị ahụ na-emetụta, a na-arụ ọrụ na-akpalite). N'adịghị ka on_replace, before_replace-triggers na-enye gị ohere ịgbanwe data nke tuple nke e gburu akpalite. N'ihi ya, ụdị nke ikpeazụ nke na-akpali akpali dabara anyị.
box.space.goods:before_replace(function(old, new)
return box.tuple.new({new[1], new[2], new[3],
box.sequence.row_version:next()})
end)
Ihe mkpalite na-esote dochie uru ubi row_ver echekwara tuple na uru na-esote nke usoro row_version.
Ka ị nwee ike wepụ data na oghere goods site na kọlụm row_ver, ka anyị mepụta ndeksi:
box.space.goods:create_index('row_ver', {
parts = { 'row_ver' },
unique = true,
type = 'TREE',
if_not_exists = true
})
Ụdị index - osisi (TREE), n'ihi na anyị ga-mkpa wepụ data na rịgoro n'usoro nke ụkpụrụ na kọlụm row_ver.
Ka anyị tinye ụfọdụ data na oghere:
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}
N'ihi na Ogige mbụ bụ counter na-abawanye akpaaka; anyị gafere nil kama. Tarantool ga-eji dochie uru na-esote ozugbo. N'otu aka ahụ, dị ka uru nke ngalaba kọlụm row_ver ị nwere ike ịgafe nil - ma ọ bụ ghara ịkọwa uru ọ bụla, n'ihi na kọlụm a na-ejide ọnọdụ ikpeazụ na oghere.
Ka anyị lelee nsonaazụ ntinye:
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]
...
Dị ka ị pụrụ ịhụ, nke mbụ na nke ikpeazụ na-ejupụta na-akpaghị aka. Ugbu a ọ ga-adị mfe ide ọrụ maka ibugo ibe site na ibe nke mgbanwe oghere 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
Ọrụ ahụ na-ewere dị ka oke uru row_ver, malite na nke ọ dị mkpa iji budata mgbanwe, ma weghachite akụkụ nke data gbanwere.
A na-eme nlele data na Tarantool site na ndeksi. Ọrụ get_goods na-eji iterator site index row_ver ịnata data gbanwere. Ụdị ntugharị bụ GT (Karị, ka ukwuu). Nke a pụtara na iterator ga-eso usoro ga-agafe ụkpụrụ index na-amalite site na igodo gafere (uru ubi. row_ver).
Onye nrụpụta na-eweghachite tuples. Ka emesia nwee ike ịnyefe data site na HTTP, ọ dị mkpa iji tọghata tuples ka ọ bụrụ usoro dabara adaba maka nhazi usoro. Ihe atụ na-eji ọrụ ọkọlọtọ maka nke a tomap. Kama iji tomap ị nwere ike dee ọrụ nke gị. Dịka ọmụmaatụ, anyị nwere ike ịchọgharị ubi aha name, agabigala ubi code ma tinye ubi 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
Ọnụ ọgụgụ ibe nke data mmepụta (ọnụọgụ nke ndekọ na otu akụkụ) na-ekpebi site na mgbanwe page_size. Na ihe atụ uru page_size bụ 5. Na ezigbo mmemme, ibe peeji na-adịkarị mkpa karịa. Ọ dabere na nkezi nha nke tuple oghere. Enwere ike ikpebi nha ihu akwụkwọ kacha mma site n'ịtụ oge mbufe data. Ka ibe peeji ahụ buru ibu, ọnụ ọgụgụ nke njem okirikiri dị ntakịrị n'etiti izipu na akụkụ nnabata. N'ụzọ dị otú a, ị nwere ike belata mkpokọta oge maka nbudata mgbanwe. Otú ọ dị, ọ bụrụ na ibe ibe ahụ buru ibu, anyị ga-anọ ogologo oge na ihe nkesa na-edepụta ihe nlele ahụ. N'ihi ya, enwere ike ịnwe igbu oge na nhazi arịrịọ ndị ọzọ na-abịa na nkesa. Oke page_size enwere ike ibunye ya na faịlụ nhazi. Maka oghere ọ bụla ebugharị, ị nwere ike ịtọ uru nke ya. Agbanyeghị, maka ọtụtụ oghere uru ndabara (dịka ọmụmaatụ, 100) nwere ike dabara.
Ka anyị rụọ ọrụ ahụ 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
...
Ka anyị were uru ubi row_ver site na ahịrị ikpeazụ wee kpọọ ọrụ ahụ ọzọ:
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
...
Ọzọkwa:
tarantool> get_goods(8)
---
- []
...
Dịka ị na-ahụ, mgbe ejiri otu a, ọrụ ahụ na-eweghachi ibe ndekọ ohere niile site na ibe goods. Nhọrọ efu na-esote ibe ikpeazụ.
Ka anyị mee mgbanwe na oghere:
box.space.goods:update(4, {{'=', 6, 'copybook'}})
box.space.goods:insert{nil, 'clip', 234}
box.space.goods:insert{nil, 'folder', 432}
Anyị agbanweela uru ubi name maka otu ntinye wee tinye ndenye ọhụrụ abụọ.
Ka anyị kwugharịa oku ọrụ ikpeazụ:
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
...
Ọrụ ahụ weghachiri ndekọ ndị gbanwere ma gbakwunyere. Ya mere, ọrụ get_goods na-enye gị ohere ịnweta data nke gbanwere kemgbe oku ikpeazụ ya, nke bụ ihe ndabere nke usoro mmegharị ahụ a na-atụle.
Anyị ga-ahapụ iwepụta nsonaazụ site na HTTP n'ụdị JSON na-abụghị akụkụ nke edemede a. Ị nwere ike ịgụ gbasara nke a ebe a:
Mmejuputa akụkụ nke ndị ahịa / ohu
Ka anyị leba anya n'ihe mmejuputa akụkụ nke nnabata dị ka. Ka anyị mepụta oghere n'akụkụ nnabata iji chekwaa data ebudatara:
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
})
Ọdịdị nke oghere ahụ yiri nhazi nke oghere na isi iyi. Ma ebe ọ bụ na anyị agaghị agafe data natara n'ebe ọ bụla ọzọ, kọlụm row_ver anọghị na oghere onye nnata. N'ọhịa id A ga-edekọ ihe nchọpụta isi mmalite. Ya mere, n'akụkụ nke nnata ọ dịghị mkpa ka ọ na-eme ka ọ na-emewanyewanye onwe ya.
Na mgbakwunye, anyị chọrọ oghere iji chekwaa ụkpụrụ 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
})
Maka oghere ọ bụla eburu (ubi space_name) anyị ga-echekwa uru eburu ikpeazụ ebe a row_ver (ubi value). Kọlụm ahụ na-arụ ọrụ dị ka isi igodo space_name.
Ka anyị mepụta ọrụ iji buo data oghere goods site na HTTP. Iji mee nke a, anyị chọrọ ọbá akwụkwọ na-emejuputa onye ahịa HTTP. Ahịrị ndị a na-ebunye ọba akwụkwọ ahụ wee mee ka onye ahịa HTTP ozugbo:
local http_client = require('http.client').new()
Anyị chọkwara ụlọ akwụkwọ maka mwepu json:
local json = require('json')
Nke a zuru ezu iji mepụta ọrụ nbudata data:
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
Ọrụ a na-eme arịrịọ HTTP na adreesị url wee zipụ ya row_ver dị ka oke ma weghachi nsonaazụ deserialized nke arịrịọ ahụ.
Ọrụ maka ịchekwa data anatara dị ka nke a:
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
Usoro nke ịchekwa data na oghere goods etinyere na azụmahịa (a na-eji ọrụ ahụ maka nke a box.atomic) iji belata ọnụ ọgụgụ nke arụmọrụ diski.
N'ikpeazụ, ọrụ mmekọrịta oghere mpaghara goods site na isi mmalite ị nwere ike mejuputa ya dị ka nke a:
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
Mbụ anyị gụrụ uru echekwara na mbụ row_ver maka oghere goods. Ọ bụrụ na ọ na-efu (nke mbụ mgbanwe nnọkọ), mgbe ahụ, anyị na-ewere ya dị ka row_ver efu. Na-esote na okirikiri, anyị na-eme nbudata data gbanwere site na ibe na ibe na url akọwapụtara. N'oge mmegharị ọ bụla, anyị na-echekwa data enwetara na oghere mpaghara kwesịrị ekwesị ma melite uru row_ver (na oghere row_ver na na mgbanwe row_ver) - were uru row_ver site na ahịrị ikpeazụ nke eburu data.
Iji chebe megide looping mberede (ọ bụrụ na njehie dị na mmemme), loop while enwere ike dochie ya for:
for _ = 1, max_req do ...
N'ihi ịrụ ọrụ ahụ sync_goods oghere goods onye nnata ga-enwe ụdị ndekọ ohere niile kachasị ọhụrụ goods na isi iyi.
N'ụzọ doro anya, enweghị ike ihichapụ data data n'ụzọ dị otú a. Ọ bụrụ na mkpa dị otú ahụ dị, ịnwere ike iji akara nhichapụ. Tinye na oghere goods ubi boolean is_deleted na kama ihichapụ ndekọ anụ ahụ, anyị na-eji ihichapụ ezi uche - anyị na-edobe uru ubi is_deleted n'ime ihe pụtara true. Mgbe ụfọdụ kama ubi boolean is_deleted ọ ka mma iji ubi deleted, nke na-echekwa ụbọchị-oge nke ezi uche ihichapụ nke ndekọ. Mgbe emechara ihichapụ ezi uche, a ga-ebufe ndekọ ahụ akara maka ihichapụ site na isi mmalite gaa na ebe a na-aga (dị ka mgbagha a tụlere n'elu).
Usoro row_ver enwere ike iji nyefee data site na oghere ndị ọzọ: ọ dịghị mkpa ịmepụta usoro dị iche iche maka oghere ọ bụla a na-ebufe.
Anyị lere anya n'ụzọ dị irè nke mmegharị data dị elu na ngwa na-eji Tarantool DBMS.
Nchoputa
- Tarantool DBMS bụ ngwaahịa na-adọrọ adọrọ, na-ekwe nkwa maka ịmepụta ngwa dị elu.
- Ntugharị data dị elu nwere ọtụtụ uru karịa ngbanwe dị ala.
- Usoro ntụgharị ọkwa dị elu nke a tụlere n'isiokwu ahụ na-enye gị ohere ibelata ọnụọgụ data ebugharị site na ịnyefe naanị ihe ndekọ ndị gbanwere kemgbe oge mgbanwe ikpeazụ.
isi: www.habr.com
