په ټرانټول DBMS کې د لوړې کچې نقل

سلام، زه د DBMS لپاره غوښتنلیکونه جوړوم ترنتول یو پلیټ فارم دی چې د Mail.ru ګروپ لخوا رامینځته شوی چې د لوا په ژبه کې د لوړ فعالیت DBMS او د غوښتنلیک سرور ترکیب کوي. د ترانتول پراساس د حلونو لوړ سرعت ترلاسه کیږي ، په ځانګړي توګه د DBMS د حافظې حالت ملاتړ کولو او د ډیټا سره په یو واحد پته ځای کې د غوښتنلیک سوداګرۍ منطق اجرا کولو وړتیا سره. په ورته وخت کې، د معلوماتو دوام د ACID لیږدونو په کارولو سره ډاډمن کیږي (د WAL log په ډیسک کې ساتل کیږي). ترنټول د نقل او شارډینګ لپاره جوړ شوی ملاتړ لري. د 2.1 نسخه څخه پیل کول، په SQL ژبه کې پوښتنې ملاتړ کیږي. Tarantool خلاص سرچینه ده او د ساده BSD جواز لاندې جواز لري. د سوداګریزې سوداګرۍ نسخه هم شتون لري.

په ټرانټول DBMS کې د لوړې کچې نقل
ځواک احساس کړئ! (... د فعالیت څخه خوند واخلئ)

پورتني ټول ټرانټول د لوړ بار غوښتنلیکونو رامینځته کولو لپاره یو زړه راښکونکی پلیټ فارم رامینځته کوي چې د ډیټابیسونو سره کار کوي. په داسې غوښتنلیکونو کې، ډیری وختونه د معلوماتو نقل کولو ته اړتیا وي.

لکه څنګه چې پورته یادونه وشوه، ټرانټول د ډیټا نقل جوړ شوی دی. د دې عملیاتو اصول په ترتیب سره د ټولو لیږدونو په نقلونو کې اجرا کول دي چې په ماسټر لاګ (WAL) کې شتون لري. معمولا دا ډول نقل (موږ به نور ورته ووایو ټیټه کچه) د غوښتنلیک د غلطۍ زغم ډاډ ترلاسه کولو او/یا د کلستر نوډونو ترمینځ د لوستلو بار ویشلو لپاره کارول کیږي.

په ټرانټول DBMS کې د لوړې کچې نقل
وريجې. 1. په کلستر کې نقل کول

د بدیل سناریو یوه بیلګه به د پروسس / څارنې لپاره په یوه ډیټابیس کې بل ډیټابیس ته رامینځته شوي ډیټا لیږدول وي. په وروستي حالت کې، یو ډیر مناسب حل کارول کیدی شي لوړه کچه نقل کول - د غوښتنلیک سوداګرۍ منطق په کچه د معلوماتو نقل کول. هغوی. موږ په DBMS کې جوړ شوي چمتو شوي حل نه کاروو، مګر په هغه اپلیکیشن کې چې موږ یې وده کوو په خپله یې نقل پلي کوو. دا طریقه دواړه ګټې او زیانونه لري. راځئ چې ګټې لیست کړو.

1. د ترافیک سپما:

  • تاسو نشئ کولی ټول معلومات انتقال کړئ، مګر یوازې د هغې یوه برخه (د مثال په توګه، تاسو کولی شئ یوازې ځینې میزونه، د دوی ځینې کالمونه یا ریکارډونه چې یو ټاکلی معیار پوره کوي) انتقال کړئ؛
  • د ټیټې کچې نقل په څیر ، کوم چې په دوامداره توګه په اسینکرونس کې ترسره کیږي (د Tarantool په اوسني نسخه کې پلي کیږي - 1.10) یا همغږي (د Tarantool په راتلونکو نسخو کې پلي کیږي) حالت کې ، د لوړې کچې نقل کول په غونډو کې ترسره کیدی شي (د مثال په توګه ، غوښتنلیک لومړی ډیټا همغږي کوي - د تبادلې سیشن ډیټا ، بیا په نقل کې وقفه شتون لري ، له هغې وروسته د تبادلې راتلونکی ناسته پیښیږي ، او داسې نور؛
  • که یو ریکارډ څو ځله بدل شوی وي، تاسو کولی شئ یوازې د هغې وروستۍ نسخه انتقال کړئ (د ټیټې کچې نقل په څیر، په کوم کې چې په ماسټر کې ټول بدلونونه به په ترتیب سره په نقلونو کې پلی شي).

2. د HTTP تبادلې پلي کولو کې کومه ستونزه شتون نلري، کوم چې تاسو ته اجازه درکوي د لرې پرتو ډیټابیسونو همغږي کړئ.

په ټرانټول DBMS کې د لوړې کچې نقل
وريجې. 2. په HTTP باندې نقل کول

3. د ډیټابیس جوړښتونه چې د هغې ترمنځ ډاټا لیږدول کیږي باید یو شان نه وي (سربیره پردې، په عمومي حالت کې، دا حتی ممکنه ده چې مختلف DBMSs، د پروګرام کولو ژبې، پلیټ فارمونه، او نور کارول کیږي).

په ټرانټول DBMS کې د لوړې کچې نقل
وريجې. 3. په متضاد سیسټمونو کې تکثیر

نیمګړتیا دا ده چې په اوسط ډول ، برنامه کول د تنظیم کولو په پرتله خورا ګران / ګران دي ، او د جوړ شوي فعالیت دودیز کولو پرځای ، تاسو باید خپل ځان پلي کړئ.

که ستاسو په وضعیت کې پورتنۍ ګټې مهمې وي (یا یو اړین شرط وي)، نو دا د لوړې کچې نقل کارول معنی لري. راځئ چې په Tarantool DBMS کې د لوړې کچې ډیټا نقل پلي کولو لپاره څو لارې وګورو.

د ترافیک کمول

نو، د لوړې کچې نقل یوه ګټه د ترافیک سپما ده. د دې لپاره چې دا ګټې په بشپړه توګه درک شي، دا اړینه ده چې د هرې تبادلې ناستې په جریان کې د لیږدول شوي ډیټا اندازه کمه کړئ. البته، موږ باید هیر نکړو چې د غونډې په پای کې، د معلوماتو ترلاسه کوونکی باید د سرچینې سره همغږي شي (لږترلږه د معلوماتو هغه برخې لپاره چې په نقل کې ښکیل دي).

د لوړې کچې نقل کولو په جریان کې د لیږدول شوي معلوماتو مقدار څنګه راکم کړئ؟ یو مستقیم حل کیدی شي د نیټې او وخت له مخې ډاټا غوره کړي. د دې کولو لپاره، تاسو کولی شئ د نیټې وخت ساحه وکاروئ چې دمخه په جدول کې شتون لري (که شتون ولري). د مثال په توګه، د "آرډر" سند کیدای شي د "اړین امر اجرا کولو وخت" ساحه ولري - delivery_time. د دې حل سره ستونزه دا ده چې پدې ساحه کې ارزښتونه باید په ترتیب کې نه وي چې د امرونو رامینځته کولو سره مطابقت ولري. نو موږ نشو کولی د ساحې اعظمي ارزښت په یاد ولرو delivery_time، د تیرې تبادلې سیشن په جریان کې لیږدول شوی ، او د راتلونکي تبادلې سیشن په جریان کې ټول ریکارډونه د لوړ ساحې ارزښت سره غوره کړئ delivery_time. د ټیټ ساحې ارزښت سره ریکارډونه ممکن د تبادلې غونډو ترمینځ اضافه شوي وي delivery_time. همچنان ، امر کولی شي بدلونونه رامینځته کړي ، کوم چې بیا هم په ساحه اغیزه نه کوي delivery_time. په دواړو حالتونو کې، بدلونونه به د سرچینې څخه منزل ته نه لیږدول کیږي. د دې ستونزو د حل لپاره، موږ به د معلوماتو لیږد ته اړتیا ولرو "اوورلیپینګ". هغوی. د تبادلې په هره ناسته کې به موږ ټول معلومات د ساحې ارزښت سره انتقال کړو delivery_time، په تیرو وختونو کې له یو څه څخه تیریدل (د مثال په توګه ، د اوسنۍ شیبې څخه N ساعتونه). په هرصورت، دا څرګنده ده چې د لوی سیسټمونو لپاره دا طریقه خورا بې کاره ده او کولی شي د ټرافیک سپما کم کړي چې موږ یې د هیڅ شی لپاره هڅه کوو. برسېره پردې، هغه جدول چې لیږدول کیږي ممکن د نیټې وخت پورې اړوند ساحه ونه لري.

بل حل، د پلي کولو په برخه کې خورا پیچلی، د معلوماتو ترلاسه کول دي. په دې حالت کې، د هرې تبادلې ناستې په جریان کې، ټول معلومات لیږدول کیږي، چې د رسیدونکي لخوا تایید شوي ندي. د دې پلي کولو لپاره، تاسو به د سرچینې میز ته د بولین کالم اضافه کولو ته اړتیا ولرئ (د مثال په توګه، is_transferred). که چیرې ترلاسه کوونکی د ریکارډ رسید ومني، اړونده ساحه ارزښت اخلي true، چې له هغې وروسته ننوتل نور په تبادله کې دخیل ندي. د دې پلي کولو اختیار لاندې زیانونه لري. لومړی، د لیږد شوي هر ریکارډ لپاره، یو اعتراف باید تولید او لیږل شي. په لنډه توګه ووایو، دا د لیږد شوي ډیټا مقدار دوه چنده کولو سره پرتله کیدی شي او د ګردي سفرونو شمیر دوه چنده کولو لامل کیږي. دوهم، څو رسیدونکو ته د ورته ریکارډ لیږلو امکان شتون نلري (لومړی ترلاسه کونکی به د ځان او نورو ټولو لپاره رسید تایید کړي).

یو میتود چې پورته ورکړل شوي زیانونه نلري د لیږد شوي میز ته د کالم اضافه کول دي ترڅو په قطارونو کې بدلونونه تعقیب کړي. دا ډول کالم د نیټې وخت ډول کیدی شي او باید د غوښتنلیک لخوا اوسني وخت ته تنظیم او تازه شي هرکله چې ریکارډونه اضافه/بدل شي (په اټومي ډول د اضافه/بدلون سره). د مثال په توګه، راځئ چې کالم ووایو update_time. د لیږد شوي ریکارډونو لپاره د دې کالم اعظمي ساحې ارزښت خوندي کولو سره، موږ کولی شو د دې ارزښت سره د تبادلې راتلونکی ناسته پیل کړو (د ساحې ارزښت سره ریکارډونه غوره کړئ update_time، د مخکیني زیرمه شوي ارزښت څخه ډیر). د وروستي چلند سره ستونزه دا ده چې د معلوماتو بدلونونه په بیچونو کې واقع کیدی شي. په کالم کې د ساحې ارزښتونو په پایله کې update_time ښايي بې ساري نه وي. په دې توګه، دا کالم د برخې شوي (د پاڼې په واسطه) د معلوماتو محصول لپاره نشي کارول کیدی. د پاڼې په واسطه د معلوماتو پاڼې ښودلو لپاره، تاسو باید اضافي میکانیزمونه ایجاد کړئ چې ډیری احتمال به خورا ټیټ موثریت ولري (د مثال په توګه، د ډیټابیس څخه د ارزښت سره ټول ریکارډونه ترلاسه کول. update_time د ورکړل شوي څخه لوړ او د یو ټاکلي شمیر ریکارډونو تولید کول، د نمونې له پیل څخه د یو ځانګړي آفسیټ څخه پیل کیږي).

تاسو کولی شئ د پخوانۍ تګلارې یو څه ښه کولو سره د معلوماتو لیږد موثریت ته وده ورکړئ. د دې کولو لپاره، موږ به د انټیجر ډول (اوږده عدد) د بدلونونو تعقیب لپاره د کالم ساحې ارزښتونو په توګه وکاروو. راځئ چې د کالم نوم ورکړو row_ver. د دې کالم د ساحې ارزښت باید لاهم تنظیم شي / تازه شي هرکله چې ریکارډ جوړ شي / ترمیم شي. مګر په دې حالت کې، ساحه به د اوسني نیټې وخت نه ټاکل کیږي، مګر د ځینې کاونټر ارزښت، یو لخوا زیات شوی. په پایله کې، کالم row_ver بې ساري ارزښتونه به ولري او نه یوازې د "ډیلټا" ډیټا ښودلو لپاره کارول کیدی شي (ډیټا د تیرې تبادلې ناستې له پای راهیسې اضافه شوي / بدل شوي) ، بلکه په ساده او مؤثره توګه دا په پاڼو کې ماتولو لپاره هم کارول کیدی شي.

د لوړې کچې نقل کولو چوکاټ کې د لیږدول شوي ډیټا مقدار کمولو وروستی وړاندیز شوی میتود ما ته خورا غوره او نړیوال ښکاري. راځئ چې دا په ډیر تفصیل سره وګورو.

د قطار نسخه کاونټر په کارولو سره د معلوماتو تیریدل

د سرور / ماسټر برخې پلي کول

په MS SQL سرور کې، د دې طریقې پلي کولو لپاره د ځانګړي کالم ډول شتون لري - rowversion. هر ډیټابیس یو کاونټر لري چې هرکله چې ریکارډ اضافه شي / بدل شي په جدول کې چې د کالم په څیر یو کالم لري یو لخوا لوړیږي. rowversion. د دې کاونټر ارزښت په اوتومات ډول د دې کالم ساحې ته په اضافه شوي / بدل شوي ریکارډ کې ټاکل کیږي. د ترنتول DBMS ورته جوړ شوی میکانیزم نلري. په هرصورت، په تارنول کې دا په لاسي ډول پلي کول ستونزمن ندي. راځئ وګورو چې دا څنګه ترسره کیږي.

لومړی، یو کوچنی اصطالح: میزونه په تارنول کې ځایونه بلل کیږي، او ریکارډونه د ټوپلز په نوم یادیږي. په ترانتول کې تاسو کولی شئ سلسلې جوړې کړئ. ترتیبونه د ترتیب شوي عددي ارزښتونو نومول شوي جنریټرونو پرته نور څه ندي. هغوی. دا هغه څه دي چې موږ د خپلو موخو لپاره اړتیا لرو. لاندې به موږ دا ډول ترتیب جوړ کړو.

مخکې له دې چې په تارنول کې د ډیټابیس عملیات ترسره کړئ، تاسو اړتیا لرئ لاندې کمانډ چل کړئ:

box.cfg{}

د پایلې په توګه، Tarantool به اوسني ډایرکټر ته د ډیټابیس سنیپ شاټونو او د لیږد لاګ لیکل پیل کړي.

راځئ چې یو ترتیب جوړ کړو row_version:

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

غوراوي if_not_exists د جوړولو سکریپټ ته اجازه ورکوي څو څو ځله اجرا شي: که چیرې اعتراض شتون ولري، Tarantool به بیا د جوړولو هڅه ونه کړي. دا اختیار به په ټولو راتلونکو DDL کمانډونو کې وکارول شي.

راځئ چې د مثال په توګه یو ځای جوړ کړو.

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

دلته موږ د ځای نوم ټاکلی (goodsد ساحې نومونه او ډولونه.

په ترانتول کې د اتومات زیاتوالي ساحې هم د ترتیبونو په کارولو سره رامینځته کیږي. راځئ چې د ساحې په واسطه د اتوماتیک زیاتوالي لومړنۍ کیلي جوړه کړو 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 د څو ډوله شاخصونو ملاتړ کوي. ترټولو عام کارول شوي شاخصونه د TREE او HASH ډولونه دي، کوم چې د نوم سره ورته جوړښتونو پر بنسټ والړ دي. TREE تر ټولو هر اړخیز شاخص ډول دی. دا تاسو ته اجازه درکوي په منظم ډول ډاټا بیرته ترلاسه کړئ. مګر د مساوي انتخاب لپاره، HASH ډیر مناسب دی. په دې اساس، دا مشوره ورکول کیږي چې د لومړني کیلي لپاره HASH وکاروئ (کوم چې موږ وکړل).

د کالم کارولو لپاره row_ver د بدل شوي ډاټا لیږدولو لپاره، تاسو اړتیا لرئ چې د دې کالم ساحو ته د ترتیب ارزښتونه وتړئ row_ver. مګر د لومړني کیلي برعکس، د کالم ساحې ارزښت row_ver نه یوازې د نوي ریکارډونو د اضافه کولو په وخت کې، بلکې د موجوده ریکارډونو د بدلولو په وخت کې باید یو له خوا زیاتوالی ومومي. تاسو کولی شئ د دې لپاره محرک وکاروئ. ټرانټول دوه ډوله فضا محرکونه لري: before_replace и on_replace. محرکونه هغه وخت توزیع کیږي کله چې په ځای کې ډاټا بدل شي (د هر ټپل لپاره چې د بدلونونو لخوا اغیزمن کیږي، د محرک فعالیت پیل کیږي). برعکس on_replace, before_replace-ټریګر تاسو ته اجازه درکوي د ټپل ډیټا بدل کړئ د کوم لپاره چې محرک اجرا کیږي. په دې اساس، د محرکاتو وروستی ډول موږ ته مناسب دی.

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

لاندې محرک د ساحې ارزښت بدلوي row_ver د سلسلې راتلونکي ارزښت ته ټپل ذخیره شوی row_version.

د دې لپاره چې د خلا څخه معلومات راوباسئ goods د کالم لخوا row_verراځئ چې یو شاخص جوړ کړو:

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

د شاخص ډول - ونه (TREE)، ځکه موږ به اړتیا ولرو چې ډاټا په کالم کې د ارزښتونو په لوړ ترتیب کې استخراج کړو row_ver.

راځئ چې خلا ته ځینې معلومات اضافه کړو:

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}

ځکه لومړی ساحه د اتوماتیک زیاتیدونکي کاونټر دی؛ موږ د دې پرځای صفر تیر کړو. Tarantool به په اتوماتيک ډول راتلونکی ارزښت بدل کړي. په ورته ډول، د کالم ساحو ارزښت په توګه row_ver تاسو کولی شئ صفر تیر کړئ - یا په هیڅ ډول ارزښت مشخص نه کړئ، ځکه دا کالم په خلا کې وروستی ځای نیسي.

راځئ چې د ننوتلو پایله وګورو:

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

لکه څنګه چې تاسو لیدلی شئ، لومړی او وروستي ساحې په اوتومات ډول ډک شوي. اوس دا به اسانه وي چې د پاڼې په واسطه د ځای د بدلونونو د پورته کولو لپاره د فنکشن لیکلو لپاره 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

فنکشن د ارزښت پیرامیټر په توګه اخلي row_ver، له هغه څخه پیل کیږي چې د بدلونونو پورته کولو لپاره اړین دي ، او د بدل شوي ډیټا یوه برخه بیرته راګرځوي.

په تارنول کې د معلوماتو نمونې د شاخصونو له لارې ترسره کیږي. فعالیت get_goods د شاخص په واسطه تکرارونکی کاروي row_ver د بدل شوي معلوماتو ترلاسه کولو لپاره. د تکرارونکي ډول GT دی (له دې څخه لوی، له دې څخه لوی). دا پدې مانا ده چې تکرارونکی به په ترتیب سره د شاخص ارزښتونه تیر کړي چې د منظور شوي کیلي څخه پیل کیږي (د ساحې ارزښت row_ver).

تکرار کوونکی ټیپلونه راګرځوي. د دې لپاره چې وروسته د HTTP له لارې ډیټا لیږدولو وړ اوسئ ، نو اړینه ده چې ټپلونه د راتلونکي سیریل کولو لپاره مناسب جوړښت ته واړوئ. مثال د دې لپاره معیاري فعالیت کاروي tomap. د کارولو پرځای tomap تاسو کولی شئ خپل فعالیت ولیکئ. د مثال په توګه، موږ ممکن د ساحې نوم بدل کړو name، میدان نه تیریږي code او ساحه اضافه کړئ 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

د محصول ډاټا پاڼې اندازه (په یوه برخه کې د ریکارډونو شمیر) د متغیر لخوا ټاکل کیږي page_size. په بیلګه کې ارزښت page_size 5. په ریښتیني پروګرام کې، د پاڼې اندازه معمولا ډیر اهمیت لري. دا د سپیس ټپل اوسط اندازې پورې اړه لري. د غوره پاڼې اندازه د معلوماتو لیږد وخت اندازه کولو سره په تجربه سره ټاکل کیدی شي. څومره چې د پاڼې اندازه لوی وي، د لیږلو او ترلاسه کولو اړخونو ترمنځ د ګردي سفرونو شمیر کوچنی وي. پدې توګه تاسو کولی شئ د بدلونونو ډاونلوډ کولو لپاره ټول وخت کم کړئ. که څه هم، که د پاڼې اندازه ډیره لویه وي، موږ به په سرور کې د سیمالټ سیریل کولو لپاره ډیر اوږد مصرف کړو. د پایلې په توګه، ممکن سرور ته د نورو غوښتنو پروسس کولو کې ځنډ شتون ولري. پیرامیټر page_size د ترتیب کولو فایل څخه پورته کیدی شي. د هر لیږدول شوي ځای لپاره، تاسو کولی شئ خپل ارزښت وټاکئ. په هرصورت، د ډیری ځایونو لپاره ډیفالټ ارزښت (د مثال په توګه، 100) ممکن مناسب وي.

راځئ چې فنکشن اجرا کړو 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
...

راځئ چې د ساحې ارزښت واخلو row_ver له وروستۍ کرښې څخه او فنکشن ته بیا زنګ ووهئ:

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

یو ځل بیا:

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

لکه څنګه چې تاسو لیدلی شئ، کله چې دا طریقه کارول کیږي، فنکشن د پاڼې په واسطه د فضا ریکارډ ټول پاڼې بیرته راولي goods. وروستنۍ پاڼه د خالي انتخاب لخوا تعقیب کیږي.

راځئ چې ځای ته بدلون ورکړو:

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

موږ د ساحې ارزښت بدل کړی دی name د یوې ننوتلو لپاره او دوه نوي ننوتل شامل کړل.

راځئ چې وروستی فنکشن کال تکرار کړو:

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

فنکشن بدل شوي او اضافه شوي ریکارډونه بیرته راستانه کړل. نو فعالیت get_goods تاسو ته اجازه درکوي هغه معلومات ترلاسه کړئ چې د دې وروستي زنګ څخه بدل شوي ، کوم چې د بیاکتنې میتود اساس دی.

موږ به د دې مقالې له ساحې بهر د JSON په بڼه د HTTP له لارې د پایلو خپرول پریږدو. تاسو کولی شئ پدې اړه دلته ولولئ: https://habr.com/ru/company/mailru/blog/272141/

د پیرودونکي / غلام برخه پلي کول

راځئ وګورو چې د ترلاسه کونکي اړخ پلي کول څه ډول ښکاري. راځئ چې د ډاونلوډ شوي ډیټا ذخیره کولو لپاره ترلاسه کونکي اړخ کې ځای رامینځته کړو:

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

د فضا جوړښت په سرچینه کې د ځای جوړښت سره ورته دی. مګر له دې امله چې موږ ترلاسه شوي ډاټا بل چیرې نه تیروو، کالم row_ver د ترلاسه کوونکي په ځای کې نه دی. په ساحه کې id د سرچینې پیژندونکي به ثبت شي. له همدې امله ، د رسیدونکي اړخ ته اړتیا نشته چې دا په اوتومات ډول وده وکړي.

سربیره پردې، موږ د ارزښتونو خوندي کولو لپاره ځای ته اړتیا لرو 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
})

د هر بار شوي ځای لپاره (فیلډ space_name) موږ به دلته وروستی بار شوی ارزښت خوندي کړو row_ver ( میدان value). کالم د لومړني کیلي په توګه کار کوي space_name.

راځئ چې د ځای ډیټا پورته کولو لپاره فنکشن جوړ کړو goods د HTTP له لارې. د دې کولو لپاره، موږ یو کتابتون ته اړتیا لرو چې د HTTP پیرودونکي پلي کړي. لاندې کرښه کتابتون پورته کوي او د HTTP پیرودونکی انسټاګرام کوي:

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

موږ د json deserialization لپاره کتابتون ته هم اړتیا لرو:

local json = require('json')

دا د ډیټا بارولو فعالیت رامینځته کولو لپاره کافي دی:

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

فنکشن یو آر ایل پته ته د HTTP غوښتنه اجرا کوي او لیږي row_ver د پیرامیټر په توګه او د غوښتنې بې ترتیبه ​​شوې پایله بیرته راګرځوي.

د ترلاسه شوي معلوماتو خوندي کولو فعالیت داسې ښکاري:

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

فضا ته د معلوماتو د خوندي کولو دوره goods په راکړه ورکړه کې ځای پر ځای شوی (فعالیت د دې لپاره کارول کیږي box.atomic) د ډیسک عملیاتو شمیر کمولو لپاره.

په نهایت کې ، د ځایی ځای ترکیب فعالیت goods د یوې سرچینې سره تاسو کولی شئ دا په لاندې ډول پلي کړئ:

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

لومړی موږ مخکې خوندي شوي ارزښت ولولئ row_ver د ځای لپاره goods. که دا ورک وي (د تبادلې لومړۍ ناسته)، نو موږ یې په توګه اخلو row_ver صفر. بیا په دوره کې موږ په ټاکل شوي یو آر ایل کې د سرچینې څخه د بدل شوي ډیټا د پاڼې په واسطه د پاڼې ډاونلوډ ترسره کوو. په هر تکرار کې، موږ ترلاسه شوي ډاټا مناسب ځایی ځای ته خوندي کوو او ارزښت یې تازه کوو row_ver (په فضا کې row_ver او په متغیر کې row_ver) - ارزښت واخلئ row_ver د بار شوي ډیټا وروستۍ کرښې څخه.

د ناڅاپي لوپ کولو څخه د ساتنې لپاره (په برنامه کې د خطا په صورت کې) ، لوپ while لخوا بدل کیدی شي for:

for _ = 1, max_req do ...

د فعالیت د اجرا کولو په پایله کې sync_goods ځای goods اخیستونکی به د ټولو فضا ریکارډونو وروستي نسخې ولري goods په سرچینه کې.

په ښکاره ډول، د معلوماتو ړنګول په دې ډول نشي خپریدلی. که داسې اړتیا شتون ولري، تاسو کولی شئ د حذف کولو نښه وکاروئ. ځای ته اضافه کړئ goods بولین ساحه is_deleted او د فزیکي پلوه د ریکارډ حذف کولو پرځای ، موږ منطقي حذف کاروو - موږ د ساحې ارزښت تنظیم کوو is_deleted په معنی true. ځینې ​​​​وختونه د بولین ساحې پرځای is_deleted دا د ساحې کارول خورا اسانه دي deleted، کوم چې د ریکارډ منطقي حذف کولو نیټه وخت ذخیره کوي. د منطقي حذف کولو ترسره کولو وروسته، د حذف کولو لپاره نښه شوي ریکارډ به له سرچینې څخه منزل ته لیږدول کیږي (د پورته بحث شوي منطق سره سم).

تسلسل row_ver د نورو ځایونو څخه د معلوماتو لیږدولو لپاره کارول کیدی شي: د هر لیږدول شوي ځای لپاره جلا ترتیب جوړولو ته اړتیا نشته.

موږ د Tarantool DBMS په کارولو سره غوښتنلیکونو کې د لوړې کچې ډیټا نقل کولو مؤثره لاره وګورله.

موندنو

  1. Tarantool DBMS د لوړ بار غوښتنلیکونو رامینځته کولو لپاره یو زړه راښکونکی ، ژمن محصول دی.
  2. د لوړې کچې ډیټا نقل کول د ټیټې کچې نقل کولو په پرتله ډیری ګټې لري.
  3. د لوړې کچې نقل کولو میتود چې په مقاله کې بحث شوی تاسو ته اجازه درکوي یوازې د هغه ریکارډونو په لیږدولو سره د لیږد شوي ډیټا مقدار کم کړئ چې د تیر تبادلې ناستې راهیسې بدل شوي.

سرچینه: www.habr.com

Add a comment