Aloha, ke hana nei au i nā noi no 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.
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.
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).
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:
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
- ʻO Tarantool DBMS kahi huahana maikaʻi a hoʻohiki no ka hana ʻana i nā noi kiʻekiʻe.
- 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.
- ʻ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