Famerenana avo lenta amin'ny Tarantool DBMS

Salama, mamorona fampiharana ho an'ny DBMS aho Tarantool dia sehatra novolavolain'ny Vondrona Mail.ru izay manambatra ny DBMS mahomby sy ny lohamilina fampiharana amin'ny fiteny Lua. Ny hafainganam-pandehan'ny vahaolana mifototra amin'ny Tarantool dia tratra, indrindra indrindra, noho ny fanohanana ny fomba fitadidiana ny DBMS sy ny fahafahana manatanteraka ny lojika fandraharahana amin'ny sehatra adiresy tokana miaraka amin'ny data. Mandritra izany fotoana izany, ny faharetan'ny angon-drakitra dia azo antoka amin'ny alΓ lan'ny fifanakalozana ACID (voatahiry ao anaty kapila ny log WAL). Tarantool dia manana fanohanana namboarina ho an'ny replication sy sharding. Manomboka amin'ny version 2.1, ny fanontaniana amin'ny fiteny SQL dia tohanana. Tarantool dia loharano misokatra ary nahazo alalana tamin'ny fahazoan-dΓ lana BSD Simplified. Misy ihany koa ny dikan-teny Enterprise ara-barotra.

Famerenana avo lenta amin'ny Tarantool DBMS
Mahatsapa ny hery! (…aka ankafizo ny fampisehoana)

Ireo rehetra voalaza etsy ambony ireo dia mahatonga an'i Tarantool ho sehatra manintona amin'ny famoronana rindranasa be entana izay miasa miaraka amin'ny angon-drakitra. Amin'ny fampiharana toy izany, matetika dia ilaina ny famerenana data.

Araka ny voalaza etsy ambony, Tarantool dia manana replication angon-drakitra. Ny fitsipiky ny fampandehanan-draharaha dia ny fanatanterahana ny replicas ny fifampiraharahana rehetra voarakitra ao amin'ny log master (WAL). Matetika ny replication toy izany (miantso azy bebe kokoa isika Low lenta) dia ampiasaina hiantohana ny fandeferana ny fahadisoana amin'ny fampiharana sy/na hizarana ny enta-mamaky eo anelanelan'ny node cluster.

Famerenana avo lenta amin'ny Tarantool DBMS
vary. 1. Replication ao anaty cluster

Ohatra iray amin'ny scenario hafa dia ny famindrana angon-drakitra noforonina ao anaty angona iray mankany amin'ny angona hafa ho an'ny fanodinana/fanaraha-maso. Amin'ity tranga farany ity, ny vahaolana mety kokoa dia ny fampiasana azy avo lenta replication - replication ny angon-drakitra amin'ny sehatry ny lojika fandraharahana fampiharana. Ireo. Tsy mampiasa vahaolana efa vita natsangana ao amin'ny DBMS izahay, fa manatanteraka replication amin'ny tenanay ao anatin'ny fampiharana novolavolainay. Ity fomba fiasa ity dia manana tombony sy fatiantoka. Andeha hotanisaintsika ny tombony.

1. Mitsitsy fifamoivoizana:

  • Tsy afaka mamindra ny angon-drakitra rehetra ianao, fa ampahany amin'izany ihany (ohatra, azonao atao ny mamindra tabilao sasantsasany, ny tsanganany na ny firaketany izay mahafeno fepetra iray);
  • Tsy toy ny replication ambany ambany, izay atao tsy tapaka amin'ny asynchronous (ampiharina amin'ny dikan-teny ankehitriny Tarantool - 1.10) na synchronous (ampiharina amin'ny dikan-teny Tarantool manaraka), ny replication avo lenta dia azo atao amin'ny fivoriana (izany hoe, ny Ny fampiharana voalohany dia mampifanaraka ny angon-drakitra - angon-drakitra fifanakalozan-dresaka, avy eo misy fiatoana amin'ny replication, aorian'izay dia misy ny fivoriana fifanakalozana manaraka, sns.);
  • raha niova imbetsaka ny rakitra iray, dia azonao atao ny mamindra ny dikan-teny farany indrindra (tsy toy ny replication ambany, izay haverina misesy ao amin'ny replicas ny fanovana rehetra natao tamin'ny master).

2. Tsy misy fahasarotana amin'ny fampiharana ny fifanakalozana HTTP, izay ahafahanao mampifanaraka ny angon-drakitra lavitra.

Famerenana avo lenta amin'ny Tarantool DBMS
vary. 2. Replication amin'ny HTTP

3. Tsy voatery hitovy ny firafitry ny angona ifindran'ny angona (ankoatra izany, amin'ny ankapobeny, azo atao mihitsy aza ny mampiasa DBMS, fiteny fandaharana, sehatra, sns.).

Famerenana avo lenta amin'ny Tarantool DBMS
vary. 3. Replication amin'ny rafitra heterogène

Ny lafy ratsiny dia ny hoe, amin'ny ankapobeny, ny fandaharana dia sarotra kokoa / lafo kokoa noho ny fanamafisana, ary raha tokony hanamboatra ny fampiasa ao anatiny ianao dia tsy maintsy mampihatra ny anao manokana.

Raha eo amin'ny toe-javatra misy anao ireo tombony etsy ambony dia tena ilaina (na fepetra ilaina), dia misy dikany ny mampiasa replication avo lenta. Andeha hojerentsika ny fomba maro hampiharana ny replication angona avo lenta ao amin'ny Tarantool DBMS.

Fampihenana ny fifamoivoizana

Noho izany, ny iray amin'ireo tombony amin'ny replication avo lenta dia ny fitsitsiana fifamoivoizana. Mba hahatanteraka an'io tombony io dia ilaina ny manamaivana ny habetsaky ny angon-drakitra alefa mandritra ny fotoam-pifanakalozana tsirairay. Mazava ho azy fa tsy tokony hohadinointsika fa amin'ny faran'ny fotoam-pivoriana dia tsy maintsy ampifandraisina amin'ny loharano ny mpandray data (farafaharatsiny ho an'io ampahany amin'ny angon-drakitra tafiditra amin'ny replication).

Ahoana no hanamaivanana ny habetsaky ny angona nafindra nandritra ny replication avo lenta? Ny vahaolana tsotra dia ny fisafidianana data amin'ny daty sy ny ora. Mba hanaovana izany dia azonao atao ny mampiasa ny saha-daty efa misy eo amin'ny latabatra (raha misy izany). Ohatra, ny antontan-taratasy "baiko" dia mety manana saha "fotoana hanatanterahana ny baiko ilaina" - delivery_time. Ny olana amin'ity vahaolana ity dia ny sanda amin'ity sehatra ity dia tsy voatery ho amin'ny filaharana mifanaraka amin'ny famoronana baiko. Noho izany dia tsy tadidintsika ny sandan'ny saha ambony indrindra delivery_time, ampitaina mandritra ny fotoam-pifanakalozana teo aloha, ary mandritra ny fotoam-pifanakalozana manaraka dia fidio ny firaketana rehetra manana sanda ambony kokoa delivery_time. Mety nampidirina teo anelanelan'ny fotoam-pifanakalozana ireo rakitsoratra misy sandan'ny saha ambany kokoa delivery_time. Ary koa, mety ho nisy fiovana ny baiko, izay tsy nisy fiantraikany teo amin'ny saha delivery_time. Amin'ireo tranga roa ireo, ny fanovana dia tsy hafindra avy amin'ny loharano mankany amin'ny toerana haleha. Mba hamahana ireo olana ireo dia mila mamindra data "mifanindry". Ireo. isaky ny fivoriana fifanakalozana dia hamindra ny angona rehetra miaraka amin'ny sandan'ny saha delivery_time, mihoatra ny teboka iray taloha (ohatra, N ora manomboka amin'izao fotoana izao). Na izany aza, hita miharihary fa ho an'ny rafitra lehibe ity fomba fiasa ity dia tsy dia misy dikany loatra ary mety hampihena ny fitsitsiana fifamoivoizana izay iezahanay ho tsinontsinona. Fanampin'izany, mety tsy misy saha mifandray amin'ny ora daty ny latabatra afindra.

Vahaolana iray hafa, sarotra kokoa amin'ny fampiharana, dia ny fanekena ny fandraisana ny angona. Amin'ity tranga ity, mandritra ny fotoam-pifanakalozana tsirairay, dia alefa ny angon-drakitra rehetra, izay tsy nohamafisin'ny mpandray ny fandraisana azy. Mba hampiharana izany dia mila manampy tsanganana Boolean amin'ny latabatra loharano ianao (ohatra, is_transferred). Raha manaiky ny fandraisana ny firaketana an-tsoratra ny mpandray dia mandray ny sandany ny saha mifanaraka amin'izany true, aorian'izay dia tsy tafiditra amin'ny fifanakalozana intsony ny fidirana. Ity safidy fampiharana ity dia manana ireto fatiantoka manaraka ireto. Voalohany, ho an'ny rakitra tsirairay nafindra dia tsy maintsy avoaka sy alefa ny fanekena. Raha lazaina amin'ny teny tsotra dia azo ampitahaina amin'ny fampitomboana avo roa heny ny habetsaky ny angon-drakitra nafindra ary mitarika ho avo roa heny ny isan'ny dia miverina. Faharoa, tsy azo atao ny mandefa rakitra mitovy amin'ny mpandray maromaro (ny mpandray voalohany mandray dia hanamafy ny fandraisana ho azy sy ho an'ny hafa rehetra).

Ny fomba iray tsy manana ny fatiantoka omena etsy ambony dia ny manampy tsanganana amin'ny latabatra nafindra mba hanaraha-maso ny fiovan'ny andalana. Ny tsanganana toy izany dia mety ho karazana daty-fotoana ary tsy maintsy apetraka/havaozina amin'ny fampiharana amin'ny fotoana ankehitriny isaky ny ampiana/ovaina ny rakitsoratra (atom miaraka amin'ny fanampiana/fanovΓ na). Ohatra, andao hiantso ny tsanganana update_time. Amin'ny alΓ lan'ny fitahirizana ny sandan'ny saha ambony indrindra amin'ity tsanganana ity ho an'ireo rakitra nafindra, dia afaka manomboka ny fotoam-panakalozana manaraka miaraka amin'ity sanda ity isika (mifantina rakitra miaraka amin'ny sandan'ny saha. update_time, mihoatra ny sanda voatahiry teo aloha). Ny olana amin'ny fomba farany dia ny fiovan'ny angon-drakitra dia mety hitranga amin'ny batch. Vokatry ny sandan'ny saha ao amin'ny tsanganana update_time mety tsy miavaka. Noho izany, ity tsanganana ity dia tsy azo ampiasaina amin'ny famoahana angona ampahany (pejy isaky ny pejy). Mba hampisehoana ny pejin'ny angona isaky ny pejy dia tsy maintsy mamorona rafitra fanampiny ianao izay mety ho ambany dia ambany ny fahombiazany (ohatra, alaina avy amin'ny angon-drakitra ny rakitra rehetra misy ny sandany. update_time ambony noho ny iray nomena ary mamokatra rakitsoratra maromaro, manomboka amin'ny fanonerana iray avy amin'ny fiandohan'ny santionany).

Azonao atao ny manatsara ny fahombiazan'ny famindrana angon-drakitra amin'ny fanatsarana kely ny fomba teo aloha. Mba hanaovana izany, dia hampiasa ny karazana integer (integer lava) ho toy ny sandan'ny tsanganana ho an'ny fanaraha-maso ny fiovana. Andeha hotononintsika ny tsanganana row_ver. Ny sandan'ny saha an'ity tsanganana ity dia tsy maintsy apetraka/havaozina isaky ny misy rakitra noforonina/ova. Saingy amin'ity tranga ity, ny saha dia tsy homena ny daty amin'izao fotoana izao, fa ny sandan'ny kaontera sasany, nitombo iray. Vokatr'izany, ny tsanganana row_ver dia misy soatoavina tokana ary azo ampiasaina tsy hanehoana ny angon-drakitra "delta" fotsiny (angona nampiana / niova hatramin'ny fiafaran'ny fotoam-pifanakalozana teo aloha), fa koa mba hanaparitahana azy amin'ny pejy tsotra sy mahomby.

Ny fomba farany natolotra hanamaivanana ny habetsaky ny angona nafindra ao anatin'ny rafitry ny replication avo lenta dia toa ahy no tsara indrindra sy manerantany. Andeha hojerentsika amin'ny antsipiriany bebe kokoa.

Mandalo angona amin'ny alΓ lan'ny Counter Version Row

Fampiharana ny ampahany server/master

Ao amin'ny MS SQL Server, misy karazana tsanganana manokana hampiharana an'io fomba io - rowversion. Ny angon-drakitra tsirairay dia manana kaontera izay mitombo iray isaky ny misy rakitra ampiana/ova ao anaty tabilao misy tsanganana toy ny rowversion. Ny sandan'ity kaontera ity dia apetraka ho azy amin'ny sahan'ity tsanganana ity ao amin'ny rakitra nampiana/novaina. Ny Tarantool DBMS dia tsy manana rafitra mitovitovy amin'izany. Na izany aza, ao amin'ny Tarantool dia tsy sarotra ny mampihatra izany amin'ny tanana. Andeha hojerentsika ny fomba fanaovana izany.

Voalohany, fehezanteny kely: tabilao ao Tarantool dia antsoina hoe habaka, ary ny firaketana dia antsoina hoe tuples. Ao amin'ny Tarantool dia afaka mamorona sequences ianao. Ny filaharana dia tsy inona fa ny mpamorona nomena ny sanda integer voalamina. Ireo. izany indrindra no ilaintsika amin'ny tanjontsika. Eto ambany dia hamorona filaharana toy izany isika.

Alohan'ny hanaovanao asa momba ny angon-drakitra ao amin'ny Tarantool dia mila manatanteraka ity baiko manaraka ity ianao:

box.cfg{}

Vokatr'izany, Tarantool dia hanomboka hanoratra snapshots amin'ny angon-drakitra sy ny diarin'ny fifanakalozana amin'ny lahatahiry ankehitriny.

Andao hamorona filaharana row_version:

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

Option if_not_exists mamela ny script famoronana ho tanterahina imbetsaka: raha misy ilay zavatra, Tarantool dia tsy hanandrana hamorona azy indray. Ity safidy ity dia hampiasaina amin'ny baiko DDL manaraka rehetra.

Andao hamorona toerana ho ohatra.

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

Eto isika dia mametraka ny anaran'ny habaka (goods), anarana saha sy karazany.

Ny saha mampitombo ho azy ao amin'ny Tarantool dia noforonina amin'ny alΓ lan'ny filaharana. Andeha isika hamorona fanalahidy fototra mitombo mandeha ho azy isaky ny saha 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 dia manohana karazana indeksa maromaro. Ny tondro ampiasaina matetika dia karazana TREE sy HASH, izay mifototra amin'ny rafitra mifanaraka amin'ny anarana. TREE no karazana fanondroana maro samihafa. Izany dia ahafahanao maka angon-drakitra amin'ny fomba voalamina. Fa ho an'ny fifantenana fitoviana dia mety kokoa ny HASH. Noho izany dia tsara ny mampiasa HASH ho an'ny fanalahidy fototra (izay no nataonay).

Ampiasao ny tsanganana row_ver mba hamindra angona niova dia mila mamatotra ny soatoavina filaharana amin'ny sahan'ity tsanganana ity ianao row_ver. Saingy tsy toy ny fanalahidy fototra, ny sandan'ny tsanganana row_ver tokony hitombo iray tsy rehefa manampy firaketana vaovao, fa koa rehefa manova ny efa misy. Azonao atao ny mampiasa trigger amin'izany. Tarantool dia manana karazana trigger habaka roa: before_replace ΠΈ on_replace. Ny trigger dia alefa isaky ny miova ny angon-drakitra ao amin'ny habaka (ho an'ny tuple tsirairay voakasik'ireo fiovana, dia misy fiasa trigger atomboka). Tsy toy ny on_replace, before_replace-Ny trigger dia ahafahanao manova ny angon-drakitra momba ny tuple izay anaovana ny trigger. Araka izany, ny karazana trigger farany dia mety amintsika.

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

Ity trigger manaraka ity dia manolo ny sandan'ny saha row_ver voatahiry tuple mankany amin'ny sanda manaraka amin'ny filaharana row_version.

Mba hahafahana maka angona avy amin'ny habakabaka goods amin'ny tsanganana row_ver, andao hamorona index:

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

Karazana fanondro - hazo (TREE), satria mila maka ny angon-drakitra amin'ny filaharana miakatra amin'ny soatoavina ao amin'ny tsanganana isika row_ver.

Andao hanampy angona vitsivitsy amin'ny habaka:

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}

SATRIA Ny saha voalohany dia kaontinanta miakatra mandeha ho azy; mandalo tsisy kosa isika. Tarantool dia hanolo ho azy ny sanda manaraka. Toy izany koa, toy ny sandan'ny sahan'ny tsanganana row_ver afaka mandalo nil ianao - na tsy mamaritra ny sandany mihitsy, satria ity tsanganana ity dia mitana ny toerana farany amin'ny habaka.

Andeha hojerentsika ny valin'ny fampidirana:

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

Araka ny hitanao dia feno ho azy ny saha voalohany sy farany. Amin'izao fotoana izao dia ho mora ny manoratra asa ho an'ny fandefasana pejy isaky ny pejy momba ny fiovan'ny habaka 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

Ny asa dia maka ny sanda ho toy ny parameter row_ver, manomboka amin'izay ilaina ny manala ny fanovana, ary mamerina ny ampahany amin'ny angona niova.

Ny sampling data ao amin'ny Tarantool dia atao amin'ny alΓ lan'ny indexes. asa get_goods dia mampiasa ny iterator amin'ny index row_ver handraisana angona niova. Ny karazana iterator dia GT (Greater Than, Greater). Midika izany fa ny mpizara dia hamakivaky ny soatoavin'ny index manomboka amin'ny fanalahidy nandalo row_ver).

Ny iterator dia mamerina tuple. Mba hahafahana mamindra angon-drakitra amin'ny alΓ lan'ny HTTP dia ilaina ny mamadika ny tuple ho rafitra mety amin'ny serialization manaraka. Ny ohatra dia mampiasa ny fiasa mahazatra amin'izany tomap. Raha tokony hampiasa tomap afaka manoratra ny asanao manokana ianao. Ohatra, mety te hanova anarana saha isika name, aza mandalo an-tsaha code ary ampio saha 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

Ny haben'ny pejin'ny angona mivoaka (ny isan'ny firaketana amin'ny ampahany iray) dia faritana amin'ny fari-piadidiana page_size. Ao amin'ny ohatra ny sanda page_size dia 5. Amin'ny programa tena izy, ny haben'ny pejy matetika no zava-dehibe kokoa. Izany dia miankina amin'ny haben'ny salan'isan'ny habaka tuple. Ny haben'ny pejy tsara indrindra dia azo faritana amin'ny alΓ lan'ny fandrefesana ny fotoana famindrana angona. Arakaraky ny haben'ny pejy no kely kokoa ny isan'ny fivezivezena eo anelanelan'ny andaniny mandefa sy mandray. Amin'izany fomba izany dia azonao atao ny mampihena ny fotoana ankapobeny amin'ny fampidinana fanovana. Na izany aza, raha lehibe loatra ny haben'ny pejy, dia handany fotoana be loatra amin'ny mpizara amin'ny fandefasana ny santionany izahay. Vokatr'izany dia mety hisy fahatarana amin'ny fikarakarana ny fangatahana hafa tonga any amin'ny mpizara. fikirana page_size azo alaina avy amin'ny fichier configuration. Ho an'ny habaka ampitaina tsirairay dia azonao atao ny mametraka ny sandany manokana. Na izany aza, ho an'ny ankamaroan'ny habaka dia mety tsara ny sandan'ny default (ohatra, 100).

Andao hanatanteraka ny asa 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
...

Andeha horaisintsika ny sandan'ny saha row_ver avy amin'ny andalana farany ary antsoy indray ny asa:

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

Fanindroany:

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

Araka ny hitanao, rehefa ampiasaina amin'ity fomba ity, ny fiasa dia mamerina ny pejy rehetra momba ny habaka goods. Ny pejy farany dia arahin'ny safidy poakaty.

Andao hanova ny habaka:

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

Nanova ny sandan'ny saha izahay name ho an'ny fidirana iray ary nampiana fidirana roa vaovao.

Andeha averina ny antso farany:

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

Naverin'ilay asa ny rakitra niova sy nampiana. Noho izany ny asa get_goods mamela anao handray angon-drakitra niova hatramin'ny antso farany, izay fototry ny fomba replication dinihina.

Avelantsika ny famoahana valiny amin'ny alΓ lan'ny HTTP amin'ny endrika JSON ivelan'ny faritry ity lahatsoratra ity. Afaka mamaky momba izany ianao eto: https://habr.com/ru/company/mailru/blog/272141/

Fampiharana ny ampahany amin'ny mpanjifa/andevo

Andeha hojerentsika ny endriky ny fampiharana ny lafiny mpandray. Andao hamorona toerana eo amin'ny lafiny fandraisana mba hitahiry ny angona alaina:

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

Ny firafitry ny habaka dia mitovy amin'ny firafitry ny habaka amin'ny loharano. Saingy satria tsy handalo any amin'ny toerana hafa ny angon-drakitra voaray, ny tsanganana row_ver tsy ao amin'ny toeran'ny mpandray. An-tsaha id ho voarakitra an-tsoratra ireo famantarana loharano. Noho izany, eo amin'ny lafiny mpandray dia tsy ilaina ny manao izany auto-incrementing.

Ankoatr'izay dia mila toerana ahafahana mitahiry soatoavina isika 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
})

Ho an'ny habaka feno entana (field space_name) hotehirizinay eto ny sanda voaloa farany row_ver (tany value). Ny tsanganana dia miasa toy ny fanalahidy fototra space_name.

Andao hamorona fiasa hametahana angon-drakitra momba ny habaka goods amin'ny HTTP. Mba hanaovana izany dia mila tranomboky iray izay mametraka mpanjifa HTTP izahay. Ity andalana manaraka ity dia mameno ny tranomboky ary mametraka ny mpanjifa HTTP:

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

Mila tranomboky ho an'ny deserialization json ihany koa izahay:

local json = require('json')

Ampy izany mba hamoronana asa fametahana 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

Ny fiasa dia manatanteraka fangatahana HTTP amin'ny adiresy url ary mandefa azy row_ver ho mari-pamantarana ary mamerina ny vokatra deserialized amin'ny fangatahana.

Toy izao ny fiasan'ny fitahirizana angon-drakitra voaray:

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

Tsingerin'ny fitahirizana angon-drakitra mankany amin'ny habakabaka goods napetraka amin'ny fifampiraharahana (ny fiasa no ampiasaina amin'izany box.atomic) mba hampihenana ny isan'ny asa kapila.

Farany, ny asa synchronization toerana eo an-toerana goods miaraka amin'ny loharano azonao ampiharina toy izao:

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

Voalohany dia mamaky ny sanda voatahiry teo aloha isika row_ver ho an'ny habaka goods. Raha tsy hita izany (ny fivoriana voalohany), dia raisinay ho toy ny row_ver aotra. Manaraka amin'ny tsingerina dia manao fampidinana pejy isaky ny pejy ny angona niova avy amin'ny loharano amin'ny url voafaritra. Isaky ny famerimberenana, dia mitahiry ny angon-drakitra voaray amin'ny habaka eo an-toerana mety isika ary manavao ny sandany row_ver (amin'ny habakabaka row_ver ary amin'ny variable row_ver) - maka ny sandany row_ver avy amin'ny andalana farany amin'ny angona voapetraka.

Mba hiarovana amin'ny famoriana tsy nahy (raha misy hadisoana ao amin'ny programa), ny loop while azo soloina amin'ny for:

for _ = 1, max_req do ...

Vokatry ny fanatanterahana ny asa sync_goods toerana goods ny mpandray dia ahitana ny dikan-teny farany amin'ny firaketana an-habakabaka rehetra goods amin'ny loharano.

Mazava ho azy fa tsy azo alefa amin'izany fomba izany ny famafana angon-drakitra. Raha misy ny filana toy izany dia azonao atao ny mampiasa marika famafana. Ampio amin'ny habaka goods saha boolean is_deleted ary raha tokony ho famafana ara-batana ny rakitra iray, dia mampiasa famafana lojika - mametraka ny sandan'ny saha is_deleted amin'ny dikany true. Indraindray fa tsy saha boolean is_deleted mety kokoa ny mampiasa ny saha deleted, izay mitahiry ny daty-fotoan'ny famafana lojika ny rakitsoratra. Rehefa vita ny famafana lojika dia hafindra avy any amin'ny loharano mankany amin'ny toerana haleha ny rakitra voamarika ho famafana (araka ny lojika voaresaka etsy ambony).

filaharana row_ver azo ampiasaina handefasana angona avy amin'ny habaka hafa: tsy ilaina ny mamorona filaharana manokana ho an'ny habaka ampitaina tsirairay.

Nijery fomba mahomby amin'ny famerenana angon-drakitra avo lenta amin'ny fampiharana mampiasa ny Tarantool DBMS izahay.

hitany

  1. Tarantool DBMS dia vokatra mahasarika sy mampanantena amin'ny famoronana rindranasa avo lenta.
  2. Ny famerenan'ny angona avo lenta dia manana tombony maromaro raha oharina amin'ny replication ambany.
  3. Ny fomba fanaovana kopia avo lenta resahina ao amin'ny lahatsoratra dia ahafahanao manamaivana ny habetsaky ny angon-drakitra nafindra amin'ny alΓ lan'ny famindrana ireo rakitsoratra izay niova hatramin'ny fotoam-pifanakalozana farany.

Source: www.habr.com

Add a comment