áááºá¹ááá¬áá«á áá»áœááºá¯ááºááẠDBMS á¡ááœáẠá¡ááá®áá±ážááŸááºážáá»á¬ážááᯠáááºáá®ážáá±áá«áááºá
áááºááá¯ážááá¯áá¶á
á¬ážáá«á (áá»á±á¬áºááŒá±áááºáááºááŸá¯ááᯠáá¶á
á¬ážááŒáá·áºáá«)
á¡áááºáá«á¡áá¬áá»á¬ážá¡á¬ážáá¯á¶ážááẠDatabases áá»á¬ážááŸáá·áºá¡áá¯ááºáá¯ááºáá±á¬ high-load applications áá»á¬ážáááºáá®ážáááºá¡ááœáẠTarantool ááá¯ááœá²áá±á¬ááºááŸá¯ááŸááá±á¬ platform áá
áºáá¯ááŒá
áºá
á±áááºá ááá¯ááá¯á·áá±á¬á¡ááá®áá±ážááŸááºážáá»á¬ážááœááºá áááŒá¬áááá±áá¬áá°ážáá°áááºááá¯á¡ááºáááºá
á¡áááºááœááºáá±á¬áºááŒáá²á·ááá·áºá¡ááá¯ááºáž, Tarantool ááœáẠbuilt-in data replication ááŸááááºá áááºážááá¯ááºáá±á¬ááºáá»ááºá áááá¬áááẠáá¬á
áá¬ááŸááºáááºáž (WAL) ááœááºáá«ááŸááá±á¬ ááœá±áá±ážááœá±áá°á¡á¬ážáá¯á¶ážááᯠáá¯á¶áá°áá°ážáá°ááŒááºážá¡áá±á«áº áááºááá¯ááºáá¯ááºáá±á¬ááºáááºááŒá
áºáááºá á¡áá»á¬ážá¡á¬ážááŒáá·áº ááá¯ááá¯á·áá±á¬ áá¯á¶áá°ááœá¬ážááŒááºáž (áá»áœááºá¯ááºááá¯á·á áááºážááᯠáááºáá¶áá±á«áºááá¯áá«áááºá á¡áááºá·ááááº) á¡ááá®áá±ážááŸááºážá¡ááŸá¬ážáá¶ááá¯ááºáááºááŸáá
á±áááºááŸáá·áº/ááá¯á·ááá¯áẠá¡á
á¯á¡áá±ážáá»á¬ážááŒá¬ážááœáẠáááºááŸá¯ááŒááºážáááºááᯠááŒáá·áºáá±áááºá¡ááœáẠá¡áá¯á¶ážááŒá¯áááºá
ááááºážá 1. á¡á
á¯á¡áá±ážáá
áºáá¯á¡ááœááºáž áá¯á¶áá°ááœá¬ážááŒááºážá
á¡ááŒá¬ážá¡ááŒá±á¡áá±áá áºáá¯á á¥ááá¬áá áºáá¯ááẠáá±áá¬áá±á·á áºáá áºáá¯á០áááºáá®ážáá¬ážáá±á¬ áá±áá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºááŒááºáž/á á±á¬áá·áºááŒáá·áºááŒááºážá¡ááœáẠá¡ááŒá¬ážáá±áá¬áá±á·á áºáá áºáá¯ááá¯á· ááœáŸá²ááŒá±á¬ááºážáá±ážáááºááŒá áºáááºá áá±á¬ááºáá¯á¶ážá¡ááŒá±á¡áá±ááœááºá ááá¯ááá¯á¡áááºááŒá±áá±á¬ááŒá±ááŸááºážáá»ááºááá¯á¡áá¯á¶ážááŒá¯áááºááŒá áºááá¯ááºáááºá á¡ááá·áºááŒáá·áº áá°ážáá°ááŒááºáž - á¡ááá®áá±ážááŸááºážáá¯ááºáááºážááá¯ááºáᬠáá¯áá¹áááá±áá¡ááá·áºááœáẠáá±áá¬áá°ážáá°ááŸá¯á á¡á²áá«ááœá±á áá»áœááºá¯ááºááá¯á·ááẠDBMS ááœáẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ ááŒá±ááŸááºážáá»ááºááᯠááá¯á¶ážáá±á¬áºáááºážá áá»áœááºá¯ááºááá¯á· áááºáá®ážáá±áá±á¬ á¡ááá®áá±ážááŸááºážá¡ááœááºáž áá»áœááºá¯ááºááá¯á·ááá¯ááºááá¯áẠáá¯á¶áá°ááœá¬ážááŒááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá«á á€áá»ááºážáááºááŸá¯ááœáẠá¡á¬ážáá¬áá»ááºááŸáá·áº á¡á¬ážáááºážáá»áẠááŸá áºáá»áá¯ážáá¯á¶ážááŸááááºá á¡á¬ážáá¬áá»ááºáá»á¬ážááᯠá á¬áááºážááŒá¯á á¯ááŒáá«á áá¯á·á
1. áá¬ááºá¡ááœá¬ážá¡áᬠáááºáá¬á á±ááŒááºáž-
- áá±áá¬á¡á¬ážáá¯á¶ážááᯠáááºáááœáŸá²ááŒá±á¬ááºážááá¯ááºáá±á¬áºáááºáž áááºážááá áºá áááºáá áºááá¯ááºážáá¬ááŒá áºááẠ(á¥ááá¬á á¡áá»áá¯á·áá±á¬ááá¬ážáá»á¬ážá áááºážááá¯á·ááá±á¬áºáá¶á¡áá»áá¯á· ááá¯á·ááá¯áẠááŸááºáááºážá¡áá»áá¯á·ááá¯áᬠááœáŸá²ááŒá±á¬ááºážááá¯ááºáááº)á
- á¡ááá·áºáááá·áºáá¯á¶áá°áá°ážááŒááºážááŸáá·áºááá°áá²á á¡áááºáááŒááºáá¯ááºáá±á¬ááºáá±ááá·áºá áááºááá¯ááºáá¯ááºáá±á¬ááºáá±ááá·áº (Tarantool - 1.10 á áááºááŸááá¬ážááŸááºážááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºáá±áááº) ááá¯á·ááá¯áẠáá áºááŒáá¯ááºáááºáž (Tarantool ááá±á¬ááºáááºááœá²áá¬ážááŸááºážáá»á¬ážááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºáááº) áá¯ááºááœáẠá¡ááá·áºááŒáá·áºáá¬ážáá±á¬áá¯á¶áá°ááœá¬ážááŒááºážááᯠáááºááŸááºáá»á¬ážááœáẠáá¯ááºáá±á¬ááºááá¯ááºááẠ(ááá¯ááá¯áááºááŸá¬á á¡ááá®áá±ážááŸááºážááẠáá±áá¬ááᯠáááá¡ááŒááẠáá áºááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºááẠ- áááŸááºááá·áºá ááºááŸááºáá±áá¬á ááá¯á·áá±á¬áẠáááºáá°ááŒá¯ááŒááºážááœáẠáá±áá¹ááááºááœá¬ážáááºá ááá¯á·áá±á¬áẠáá²ááŸááºááá·áºáááºááŸááºáá±á«áºáá±á«ááºááẠá áááºááŒáá·áº)á
- ááŸááºáááºážáá áºáá¯ááẠá¡ááŒáááºáá»á¬ážá áœá¬ááŒá±á¬ááºážáá²áá«áá áááºááẠáááºážááá±á¬ááºáá¯á¶ážáá¬ážááŸááºážááá¯áᬠááœáŸá²ááŒá±á¬ááºážááá¯ááºááẠ(á¡ááá·áºáááá·áºáá±á¬áá¯á¶áá°áá°ážááŒááºážááŸáá·áºááá°áá²á áááºážááœáẠáá¬á áá¬ááœááºááŒá¯áá¯ááºáá¬ážáá±á¬ááŒá±á¬ááºážáá²ááŸá¯á¡á¬ážáá¯á¶ážááᯠáá¯á¶á á¶áá°áá»á¬ážáá±á«áºááœáẠáááºááá¯ááºááŒááºááœáá·áºáááº)á
2. á¡áá±ážááááºážáá±áá¬áá±á·á áºáá»á¬ážááᯠáááºáá°ááŒá¯ááá¯ááºá á±ááá·áº HTTP áá²ááŸááºááŸá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá¬ááœáẠá¡áááºá¡áá²áááŸááá«á
ááááºážá 2. HTTP ááŒáá·áº áá°ážáá°áá±á¬áºááŒááŒááºážá
3. áá±áá¬ááœáŸá²ááŒá±á¬ááºážááŒááºážááŒá¬ážááŸá áá±áá¬áá±á·á áºááœá²á·á ááºážáá¯á¶áá»á¬ážááẠáá°áá®áá±ááẠáááá¯á¡ááºáá« (ááá¯á·ááŒááºá áá±áá¯áá»á¡á¬ážááŒáá·áºá ááœá²ááŒá¬ážááŒá¬ážáá¬ážáá±á¬ DBMSsá áááá¯ááááºážáááºážáá¬áá¬á áá¬ážáá»á¬ážá ááááºáá±á¬ááºážáá»á¬ážá á áááºááŒáá·áº) ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
ááááºážá 3. ááœá²ááŒá¬ážáá±á¬ á
áá
áºáá»á¬ážááœáẠáá¯á¶áá°ááœá¬ážááŒááºážá
á¡á¬ážáááºážáá»ááºááŸá¬ áá»ááºážáá»áŸá¡á¬ážááŒáá·áºá áááá¯ááááºáá±ážááœá²ááŒááºážááẠconfiguration áááºááá¯ááá¯áááºáá²áááº/á¡áá¯ááºá¡áá»áá»á¬ážááŒá®áž built-in áá¯ááºáá±á¬ááºááá¯ááºá áœááºážááᯠá áááºááŒáá¯ááºááŒááºáááºááá·áºá¡á á¬ážá áááºáááºáááºáááá¯ááºááá¯ááºááá¯á¡áá±á¬ááºá¡áááºáá±á¬áºááááºááŒá áºáá«áááºá
á¡áááºá ááá·áºá¡ááŒá±á¡áá±ááœáẠá¡áááºáá±á¬áºááŒáá« á¡á¬ážáá¬áá»ááºáá»á¬ážááẠá¡áá±ážááŒá®ážááẠ(ááá¯á·ááá¯áẠááá¯á¡ááºáá±á¬ á¡ááŒá±á¡áá±áá áºáá¯) ááŒá áºáá«á ááŒáá·áºáá¬ážáá±á¬ á¡ááá·áºáá°ááœá¬ážááŸá¯ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááẠá¡áááá¹áá«ááºááŸááá±áááºá Tarantool DBMS ááœááºá¡ááá·áºááŒáá·áºáá±áá¬áá¯á¶áá°ááœá¬ážááŒááºážááá¯á¡áá±á¬ááºá¡áááºáá±á¬áºáááºáááºážáááºážáá»á¬ážá áœá¬ááá¯ááŒáá·áºááŸá¯ááŒáá«á áá¯á·á
áá¬ááºá¡ááœá¬ážá¡áᬠáááºážáá«ážááŒááºážá
ááá¯á·ááŒá±á¬áá·áºá á¡ááá·áºááŒáá·áºáá¯á¶áá°áá°ážááŒááºážá á¡á¬ážáá¬áá»ááºáá»á¬ážáá²á០áá áºáá¯ááŸá¬ á¡ááœá¬ážá¡áᬠáááºáá¬á á±ááŒááºáž ááŒá áºáááºá á€á¡á¬ážáá¬áá»ááºááᯠá¡ááŒáá·áºá¡áá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáááºá áááŸááºááŸá¯áá áºáá¯á á®ááœáẠáá±áá¬ááá¬áááᯠáá»áŸá±á¬á·áá»ááẠááá¯á¡ááºáá«áááºá áá¯ááºáá«áááºá session áá²á·á¡áá¯á¶ážááŸá¬ data receiver ááᯠsource áá²á· synchronize áá¯ááºááááºááá¯áᬠ(á¡áááºážáá¯á¶ážáá±á¬á· replication ááŸá¬áá«áá²á· data á¡á áááºá¡ááá¯ááºážá¡ááœááº) ááᯠááá±á·ááá·áºáá«áá°ážá
á¡ááá·áºááŒáá·áºáá¯á¶áá°áá°ážáá»á
ááºá¡ááœááºáž ááœáŸá²ááŒá±á¬ááºážáá±ážááá·áº áá±áá¬ááá¬áááᯠáááºááá¯á·áá»áŸá±á¬á·áá»ááá¯ááºáááºáááºážá ááá¯ážááŸááºážáá±á¬ ááŒá±ááŸááºážáá»ááºááŸá¬ áááºá
áœá²ááŸáá·áº á¡áá»áááºá¡ááá¯áẠáá±áá¬ááᯠááœá±ážáá»ááºááẠááŒá
áºááá¯ááºáááºá áá«ááá¯áá¯ááºááá¯á·á ááá¬ážáá²ááŸá¬ ááŸáááŒá®ážáá¬áž áááºá
áœá²-á¡áá»áááºá¡ááœááºááᯠáááºáá¯á¶ážááá¯ááºááẠ(áááºážááŸááá»áŸááº)á á¥ááá¬á¡á¬ážááŒáá·áºá "á¡ááŸá¬á
á¬" á
á¬ááœááºá
á¬áááºážáá
áºáá¯ááœáẠ"ááá¯á¡ááºáá±á¬á¡áááá·áºááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá»áááº" á¡ááœááºáá
áºáá¯ááŸáááá¯ááºááẠ- delivery_time
. á€ááŒá±ááŸááºážáá»ááºá ááŒá¿áá¬ááŸá¬ á€á¡ááœááºááŸá áááºááá¯ážáá»á¬ážááẠá¡ááŸá¬á
á¬áá»á¬áž áááºáá®ážááŒááºážááŸáá·áº ááá¯ááºáá®áá±á¬ á¡á
á®á¡á
á¥áºááœáẠááŸááá±ááẠáááá¯á¡ááºáá«á ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠá¡áá»á¬ážáá¯á¶áž á¡ááœááºáááºááá¯ážááᯠáááŸááºááááá¯ááºáá«á delivery_time
ááááºáá²ááŸááºááá·áºá
ááºááŸááºá¡ááœááºáž ááá¯á·ááœáŸááºáá±á¬á ááŸáá·áº áá±á¬ááºáá
áºááŒáááºáá²ááŸááºááá·áºá
ááºááŸááºá¡ááœááºáž ááá¯ááá¯ááŒáá·áºáá¬ážáá±á¬ á¡ááœááºáááºááá¯ážááŸááá±á¬ ááŸááºáááºážá¡á¬ážáá¯á¶ážááᯠááœá±ážáá»ááºáá«á delivery_time
. á¡ááœááºáááºááá¯ážáááºážáá±á¬ ááŸááºáááºážáá»á¬ážááᯠáá²ááŸááºááá·áºá¡á
ááºážá¡áá±ážáá»á¬ážááŒá¬ážááœáẠáá±á«ááºážááá·áºááá¯ááºáááºá delivery_time
. ááá¯á·á¡ááŒáẠá¡ááá¯áá«á¡áááá·áºááẠáááºáááºááᯠááááá¯ááºá
á±ááŒááºážáááŸáááá·áº á¡ááŒá±á¬ááºážá¡áá²áá»á¬áž ááŸáááá¯ááºáááºá delivery_time
. ááŸá
áºáá¯áá¯á¶ážááœááºá á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠá¡áááºážá¡ááŒá
áºá០áŠážáááºáá¬ááá¯á· ááœáŸá²ááŒá±á¬ááºážáááºááá¯ááºáá«á á€ááŒá¿áá¬áá»á¬ážááá¯ááŒá±ááŸááºážáááºá áá»áœááºá¯ááºááá¯á·ááẠ"áááºáá±áá±á¬" áá±áá¬ááá¯ááœáŸá²ááŒá±á¬ááºážáááºááá¯á¡ááºáááá·áºáááºá á¡á²áá«ááœá±á áá²ááŸááºááŸá¯á¡ááá¯ááºážáá
áºáá¯á
á®ááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá±áá¬á¡á¬ážáá¯á¶ážááᯠá¡ááœááºáááºááá¯ážááŒáá·áº ááœáŸá²ááŒá±á¬ááºážáá±ážáá«áááºá delivery_time
á¡ááááºá á¡ááŸááºá¡áá»áá¯á·ááᯠáá»á±á¬áºááœááºáá±ááẠ(á¥ááá¬á áááºááŸáá¡áá»áááºá០N áá¬áá®)á ááá¯á·áá±á¬áºá á
áá
áºááŒá®ážáá»á¬ážá¡ááœáẠá€áá»ááºážáááºááŸá¯ááẠá¡ááœááºáááá¯á¡ááºáá² áá»áœááºá¯ááºááá¯á·ááŒáá¯ážáááºážáá±áá±á¬ áá¬ááºááŒá±á¬ááááºááá¯á·ááŸá¯ááᯠáá»áŸá±á¬á·áá»ááá¯ááºáááºááŸá¬ áááºááŸá¬ážáá«áááºá ááá¯á·á¡ááŒááºá ááœáŸá²ááŒá±á¬ááºážáá±ážááá·áºááá¬ážááœáẠáááºá
áœá²-á¡áá»áááºááŸáá·áº áááºá
ááºáá±áá±á¬ á¡ááœááºáá
áºáᯠááŸááááºááá¯ááºáá«á
á¡áá±á¬ááºá¡áááºáá±á¬áºáá¬ááœáẠááá¯ááá¯ááŸá¯ááºááœá±ážáá±á¬áá±á¬ááºáááºááŒá±ááŸááºážáá»ááºááŸá¬ áá±áá¬áááºáá¶áááŸáááŸá¯ááᯠá¡ááá¡ááŸááºááŒá¯áááºááŒá
áºáááºá á€ááá
á¹á
ááœááºá áááŸááºááŸá¯áá
áºáá¯á
á®ááœááºá áááºáá¶áá°á០á¡áááºááŒá¯ááá¬ážáá±á¬ ááŒá±á
á¬á¡á¬áž áá±áá¬á¡á¬ážáá¯á¶ážááᯠáá±ážááá¯á·áá«áááºá áááºážááá¯á¡áá±á¬ááºá¡áááºáá±á¬áºáááºá áááºááẠá¡áááºážá¡ááŒá
áºááá¬ážááá¯á· Boolean áá±á¬áºáá¶áá
áºáá¯ááá·áºááẠááá¯á¡ááºáááá·áºááẠ(á¥ááá¬á is_transferred
) áááºáá¶áá°ááẠááŸááºáááºážááááºáá¶ááŸá¯ááᯠá¡ááá¡ááŸááºááŒá¯áá«áá áááºááá¯ááºáá¬á¡ááœááºááẠáááºááá¯ážááᯠáá°áááºá true
ááá¯á·áá±á¬áẠáááºááœáá·áºááẠáááŸááºááŸá¯ááœáẠááá«áááºáá±á¬á·áá«á á€á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááœá±ážáá»ááºááŸá¯ááœáẠá¡á±á¬ááºáá«á¡á¬ážáááºážáá»ááºáá»á¬ážááŸááááºá áŠážá
áœá¬á ááœáŸá²ááŒá±á¬ááºážáá±ážááá·áºááŸááºáááºážáá
áºáá¯á
á®á¡ááœááºá á¡ááá¡ááŸááºááŒá¯áá»ááºááá¯áá¯ááºáá±ážááŒá®áž áá±ážááá¯á·ááááºááŒá
áºáááºá á¡ááŒááºážáá»ááºážá¡á¬ážááŒáá·áºááŒá±á¬ááá»áŸáẠáááºážááẠááœáŸá²ááŒá±á¬ááºážááá·áºáá±áá¬ááá¬áááᯠááŸá
áºáááá¯ážá
á±ááŒá®áž á¡ááœá¬ážá¡ááŒááºááá®ážá¡áá±á¡ááœááºááᯠááŸá
áºáááá¯ážáá¬á
á±ááá¯ááºáááºá áá¯áááá¡áá±ááŒáá·áºá áááºáá¶áá°á¡áá»á¬ážá¡ááŒá¬ážáᶠáá°áá®áá±á¬ááŸááºáááºážááᯠáá±ážááá¯á·ááẠááŒá
áºááá¯ááºááŒá±áááŸááá« (ááááááºáá¶áá°ááẠáááºáá¶áááŸááá°ááá¯ááºááá¯ááºááŸáá·áº á¡ááŒá¬ážáá°á¡á¬ážáá¯á¶ážá¡ááœáẠááŒá±á
á¬ááᯠá¡áááºááŒá¯áá«áááº)á
á¡áááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ á¡á¬ážáááºážáá»ááºáá»á¬ážáááŸááá±á¬áááºážáááºážááŸá¬ áááºážáá¡áááºážáá»á¬ážááŸá á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠááŒá±áá¬áá¶ááẠááŒá±á¬ááºážááœáŸá±á·áá¬ážáá±á¬ááá¬ážááá¯á· áá±á¬áºáá¶áá
áºáá¯ááá·áºááŒááºážááŒá
áºáááºá ááá¯ááá¯á·áá±á¬áá±á¬áºáá¶ááẠáááºá
áœá²á¡áá»áááºá¡áá»áá¯ážá¡á
á¬ážááŒá
áºááá¯ááºááŒá®áž ááŸááºáááºážáá»á¬ážááᯠááá·áºááœááºážááŒááºáž/ááŒá±á¬ááºážáá²ááŒááºážááá¯ááºážááᯠáááºááŸáá¡áá»áááºá¡áá á¡ááá®áá±ážááŸááºážá០áááºááŸááº/á¡ááºááááºáá¯ááºááá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá áá±á¬áºáá¶ááá¯áá±á«áºááŒáá«á
áá¯á· update_time
. ááœáŸá²ááŒá±á¬ááºážáá¬ážáá±á¬ ááŸááºáááºážáá»á¬ážá¡ááœáẠá€áá±á¬áºáá¶á á¡ááŒáá·áºáá¯á¶áž á¡ááœááºáááºááá¯ážááᯠááááºážáááºážááŒááºážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠá€áááºááá¯ážááŒáá·áº áá±á¬ááºáá¬ááá·áº ááœá±áá²ááŸááºááŸá¯ááºážááᯠá
áááºááá¯ááºááẠ(á¡ááœááºáááºááá¯ážááŸáá·áº ááŸááºáááºážáá»á¬ážááᯠááœá±ážáá« update_time
ááááºááááºážáááºážáá¬ážááá·áº áááºááá¯ážááẠáá»á±á¬áºááœááºáá±áá«áááºá) áá±á¬ááºáá¯á¶ážáá»ááºážáááºááŸá¯áááŒá¿áá¬ááŸá¬ áá±áá¬ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááẠá¡á
á¯ááá¯ááºá¡ááŒá¯á¶ááá¯ááºááŒá
áºáá±á«áºááá¯ááºááŒááºážááŒá±á¬áá·áºááŒá
áºáááºá ááá¯á·ááŒá±á¬áá·áº áá±á¬áºáá¶ááŸá á¡ááœááºáááºááá¯ážáá»á¬áž update_time
áá°ážááŒá¬ážáááºááá¯ááºáá«á ááá¯á·ááŒá±á¬áá·áºá á€áá±á¬áºáá¶ááᯠá¡ááá¯ááºážááœá² (áá
áºáá»ááºááŸá¬áá»ááºáž-áá
áºáá»ááºááŸá¬) áá±áá¬á¡ááœááºá¡ááœáẠá¡áá¯á¶ážáááŒá¯ááá¯ááºáá«á á
á¬áá»ááºááŸá¬áá
áºáá¯ááŒá®ážáá
áºáᯠáá±áá¬ááá¯ááŒááááºá áááá±á¬ááºááŸá¯á¡ááœááºáááºážááá·áº áá±á¬ááºáááºááá¹ááá¬ážáá»á¬ážááᯠáááºáá®ááœááºááá«ááẠ(á¥ááá¬á áá±áá¬áá±á·á
áºá០ááŸááºáááºážá¡á¬ážáá¯á¶ážááᯠáááºááá¯ážááŒáá·áº ááŒááºáááºááá°ááŒááºáž update_time
áá±ážáá¬ážááá·áºáá
áºáá¯ááẠááá¯ááŒáá·áºááŒá®áž ááá°áá¬áá¡á
á០á¡áá»áá¯á·áá±á¬ offset ááŸá
á á¡áá»áá¯á·áá±á¬ ááŸááºáááºážá¡áá±á¡ááœááºááᯠáá¯ááºáá¯ááºáá«áááºá)
ááááºáááºážáááºážááᯠá¡áááºážáááºááŒáŸáá·áºáááºááŒááºážááŒáá·áº áá±áá¬ááœáŸá²ááŒá±á¬ááºážááŒááºážá áááá±á¬ááºááŸá¯ááᯠááŒáŸáá·áºáááºááá¯ááºáá«áááºá áá«ááá¯áá¯ááºááá¯á·á ááŒá±á¬ááºážáá²ááŸá¯ááœá±ááᯠááŒá±áá¬áá¶ááá¯á·á¡ááœáẠáá±á¬áºáá¶á¡ááœááºáááºááá¯ážáá»á¬ážá¡ááŒá
ẠááááºážááŒáá·áºá¡áá»áá¯ážá¡á
á¬áž (long integer) ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá áá±á¬áºáá¶áá¬áááºáá¡á±á¬áẠrow_ver
. ááŸááºáááºážáá
áºáá¯ááᯠáááºáá®áž/ááŒááºáááºááŒá®ážááá¯ááºáž á€áá±á¬áºáá¶á á¡ááœááºáááºááá¯ážááᯠáááºááŸááº/á¡ááºááááºáá¯ááºáá¬ážááá«áááºá ááá¯á·áá±á¬áº á€ááá
á¹á
ááœááºá á¡ááœááºááᯠáááºááŸááááºá
áœá²-á¡áá»áááºááᯠáááºááŸááºáá±ážáááºááá¯ááºáá±á¬áºáááºáž á¡áá»áá¯á·áá±á¬áá±á¬ááºáá¬ááááºááá¯ážááẠáá
áºáá¯ááŒá®ážáá
áºáá¯ááá¯ážáá¬áááºá ááá¯á·ááŒá±á¬áá·áº áá±á¬áºáᶠrow_ver
áá°ážááŒá¬ážáá±á¬áááºááá¯ážáá»á¬ážáá« á ááºáááºááŒá
áºááŒá®áž âdeltaâ áá±áá¬ááá¯ááŒááááºáá¬áá (ááááºáá²ááŸááºááŸá¯á
ááºááŸááºááŒá®ážáá¯á¶ážáá»áááºááŸá
á áá±áá¬ááá·áºááœááºáž/ááŒá±á¬ááºážáá²áá²á·áááº)á áááºážááᯠá
á¬áá»ááºááŸá¬áá»á¬ážá¡ááŒá
Ạááá¯ážááŸááºážá
áœá¬ áááááá±á¬ááºáá±á¬áẠáá»áá¯ážáá»ááºáááºá¡ááœááºáááºáž á¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
á¡ááá·áºááŒáá·áºáá¯á¶áá°ááœá¬ážááŒááºážáá°áá±á¬ááºá¡ááœááºáž ááœáŸá²ááŒá±á¬ááºážáá±ážááá¯á·ááá·áº áá±áá¬ááá¬áááᯠáá»áŸá±á¬á·áá»ááẠáá±á¬ááºáá¯á¶ážá¡ááá¯ááŒá¯áá¬ážáá±á¬ áááºážáááºážááẠáá»áœááºá¯ááºá¡ááœáẠá¡áá±á¬ááºážáá¯á¶ážááŸáá·áº á¡áá±á¬ááºážááœááºáá¯á¶ážáᯠáá°ááá«áááºá ááá¯ááŒá®ážá¡áá±ážá áááºááŒáá·áºáá¡á±á¬ááºá
Row Version Counter ááᯠá¡áá¯á¶ážááŒá¯á Data ááŒááºáááºážááŒááºážá
áá¬áá¬/áá¬á áá¬á¡ááá¯ááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá
MS SQL Server ááœááºá á€áá»ááºážáááºááŸá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠá¡áá°ážáá±á¬áºáá¶á¡áá»áá¯ážá¡á
á¬ážáá
áºáᯠááŸááá«áááºá rowversion
. áá±áá¬áá±á·á
áºáá
áºáá¯á
á®ááœáẠááŸááºáááºážáá
áºáᯠááá·áº/ááŒá±á¬ááºážááá·áºá¡áá«ááá¯ááºáž áá
áºáá¯ááŸáá·áºáá
áºáᯠááá¯ážáá¬ááá·áº áá±á¬ááºáá¬áá
áºáá¯á
á® ááŸááááºá rowversion
. áááºáá±á¬ááºáž/ááŒá±á¬ááºážáá²áá¬ážáá±á¬ ááŸááºáááºážááŸá á€áá±á¬áºáá¶áá¡ááœááºááœáẠá€áá±á¬ááºáá¬ááááºááá¯ážááᯠá¡ááá¯á¡áá»á±á¬ááºáááºááŸááºáá±ážáá«áááºá Tarantool DBMS ááœáẠá¡áá¬ážáá° built-in ááá¹ááá¬áž áááŸááá«á ááá¯á·áá±á¬áº Tarantool ááœáẠáááºážááᯠááá¯ááºááá¯ááºá¡áá±á¬ááºá¡áááºáá±á¬áºááẠááááºáá²áá«á áá«ááᯠáááºááᯠááŒá®ážááœá¬ážáá² ááŒáá·áºáá¡á±á¬ááºá
áŠážá áœá¬á áá±á«áá¬áá¡áá¯á¶ážá¡ááŸá¯ááºážá¡áááºážáááº- Tarantool ááŸá ááá¬ážáá»á¬ážááᯠspaces áá¯áá±á«áºááŒá®áž ááŸááºáááºážáá»á¬ážááᯠtuples áá¯áá±á«áºáááºá Tarantool ááœááºááẠsequences ááá¯áááºáá®ážááá¯ááºáááºá Sequence áá»á¬ážááẠá á®áá¬ážáá±á¬ ááááºážááŒáá·áºáááºááá¯ážáá»á¬ážá á¡áááºáá±ážáá¬ážáá±á¬ áá»ááºááá±áá¬áá»á¬ážááẠáá¬ááŸáááá¯áá«á á¡á²áá«ááœá±á á€áááºááŸá¬ áá»áœááºá¯ááºááá¯á·á áááºááœááºáá»ááºáá»á¬ážá¡ááœáẠááá¯á¡ááºáá±á¬ á¡ááá¡áá»ááŒá áºáááºá á¡á±á¬ááºááœááºáá»áœááºá¯ááºááá¯á·ááá¯áá²á·ááá¯á·áá±á¬ sequence ááá¯áááºáá®ážáá«áááá·áºáááºá
Tarantool ááœáẠáááºááá·áºáá±áá¬áá±á·á áºáá¯ááºáá±á¬ááºáá»ááºááá¯áááᯠááá¯ááºáá±á¬ááºáá®á áááºááẠá¡á±á¬ááºáá« command ááᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááº-
box.cfg{}
ááááºá¡áá±ááŒáá·áº Tarantool ááẠáááºááŸááááºážááœáŸááºááœáẠáá±áá¬áá±á·á áºáá»áŸááºáá áºááŒááºááá¯ááºáá»ááºáá»á¬ážááŸáá·áº ááœá±áá±ážááœá±áá°ááŸááºáááºážáá»á¬ážááᯠá áááºáá±ážáá¬ážáá«áááºá
á¡á
á®á¡á
á¥áºáá
áºáá¯áááºáá®ážááŒáá«á
áá¯á· row_version
:
box.schema.sequence.create('row_version',
{ if_not_exists = true })
ááœá±ážáá»ááºá
áᬠif_not_exists
áááºáá®ážááŸá¯ script ááᯠá¡ááŒáááºáá±á«ááºážáá»á¬ážá
áœá¬ áá¯ááºáá±á¬ááºááẠááœáá·áºááŒá¯áááº- á¡áá¬ááá¹áá¯ááŸááá»áŸáẠTarantool ááẠáááºážááᯠáááºáá¶áááºáá®ážááẠááŒáá¯ážá
á¬ážáááºááá¯ááºáá«á á€ááœá±ážáá»ááºááŸá¯ááᯠáá±á¬ááºáááºááœá² DDL á¡áááá·áºáá»á¬ážá¡á¬ážáá¯á¶ážááœáẠá¡áá¯á¶ážááŒá¯áá«áááºá
á¥ááá¬á¡áá±áá²á· space áá áºáá¯ááᯠáááºáá®ážááŒáá·áºáá¡á±á¬ááºá
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
})
á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠspace á¡áááºááᯠáááºááŸááºáá²á·ááẠ(goods
) á¡ááœááºá¡áááºáá»á¬ážááŸáá·áº áááºážááá¯á·áá¡áá»áá¯ážá¡á
á¬ážáá»á¬ážá
Tarantool ááŸá á¡ááá¯á¡áá»á±á¬áẠááá¯ážáá¬áá±áá±á¬ ááœááºáááºáá»á¬ážááᯠáááºááá¯ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áááºáá®ážáá¬ážáááºá á¡ááœááºá¡ááá¯áẠá¡ááá¯á¡áá»á±á¬ááºááá¯ážáá±áá±á¬ á¡ááááá®ážáá
áºáá¯ááᯠáááºáá®ážááŒáá«á
áá¯á· 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
ááŸááºáááºážá¡áá
áºáá»á¬ážááá·áºááá·áºá¡áá«áá¬áá ááŸáááŒá®ážáá¬ážááá¯ááºáá»á¬ážááᯠááŒá±á¬ááºážáá²ááá·áºá¡áá«ááœááºáááºáž áá
áºáá¯ááŒá®ážáá
áºáᯠááá¯ážááá·áºáááºá áááºážá¡ááœáẠtriggers áá»á¬ážááᯠáááºáá¯á¶ážááá¯ááºáááºá Tarantool ááœáẠspace triggers ááŸá
áºáá»áá¯ážááŸááááºá before_replace
О on_replace
. áá±áá¬ááœááºááŸá áá±áá¬áá»á¬áž ááŒá±á¬ááºážáá²ááá·áºá¡áá«ááá¯ááºáž Triggers áá»á¬ážááᯠá¡áá¯ááºáá¯ááºááẠ(á¡ááŒá±á¬ááºážá¡áá²ááŒá±á¬áá·áº ááááá¯ááºááá·áº tuple áá
áºáá¯á
á®á¡ááœááºá trigger function áá
áºáᯠá
áááºáááº)á ááá°áá«á on_replace
, before_replace
-triggers áá»á¬ážááẠtrigger ááá¯áá¯ááºáá±á¬ááºááá·áº tuple ááá±áá¬ááá¯ááœááºážáá¶ááœáá·áºááŒá¯áááºá ááá¯á·ááŒá±á¬áá·áºá áá±á¬ááºáá¯á¶ážáá±á¬ á¡á
áá»áá¯ážááŸá¯ á¡áá»áá¯ážá¡á
á¬ážááẠáá»áœááºá¯ááºááá¯á·ááŸáá·áº ááá¯ááºáá®áá«áááºá
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
tuple ááᯠsequence á áá±á¬ááºáááºááá¯ážááá¯á· ááááºážáááºážáá¬ážáááºá 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}
áá¬ááŒá
áºááá¯á·áá²ááá¯áá±á¬á· áááá¡ááœááºááẠá¡ááá¯á¡áá»á±á¬ááºááá¯ážáá±áá±á¬áá±á¬ááºáá¬ááŒá
áºááŒá®ážá áá»áœááºá¯ááºááá¯á·á¡á
á¬áž nil ááᯠáá»á±á¬áºááœá¬ážáá«áááºá Tarantool ááẠáá±á¬ááºáááºááá¯ážááᯠá¡ááá¯á¡áá»á±á¬áẠá¡á
á¬ážááá¯ážáá«áááºá á¡áá¬ážáá°áááºá áá±á¬áºáá¶ááœááºáááºáá»á¬ážááááºááá¯áž row_ver
áááºá nil ááá¯ááŒááºááá¯ááºááẠ- ááá¯á·ááá¯ááºáááºááá¯ážááá¯áá¯á¶ážááááºááŸááºááá¬ážáá±á¬ááŒá±á¬áá·áºááŒá
áºáááºá á€áá±á¬áºáá¶ááẠá¡á¬áá¬áá¡ááœááºáž áá±á¬ááºáá¯á¶ážá¡áá±á¡áá¬ážááᯠááááºážááá¯ááºáááºá
ááá·áºááœááºážááŸá¯ááááºááᯠá á áºáá±ážááŒáá«á áá¯á·á
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
function ááẠvalue ááᯠparameter á¡ááŒá
áºáá°áááºá row_ver
á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠááŒááºááœáá·áºááẠááá¯á¡ááºááá·áºá¡áá»áááºá០á
áááºáᬠááŒá±á¬ááºážáá²áá¬ážáá±á¬áá±áá¬á á¡á
áááºá¡ááá¯ááºážáá
áºáá¯ááᯠááŒááºáá±ážáááºá
Tarantool ááœáẠáá±áá¬ááá°áá¬ááᯠá¡ááœáŸááºážáá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºáááºá áá¯ááºáá±á¬ááºáá»áẠget_goods
á¡ááœáŸááºážá¡á¬ážááŒáá·áº iterator ááá¯á¡áá¯á¶ážááŒá¯áááºá row_ver
ááŒá±á¬ááºážáá²áá¬ážáá±á¬áá±áá¬ááá¯áááºáá¶áááŸááááºá Iterator á¡áá»áá¯ážá¡á
á¬ážááẠGT (Greater Than, greater than) ááŒá
áºáááºá ááá¯ááá¯áááºááŸá¬ ááá·áºááŒááºáá°ááẠááœááºáá±á¬á·ááŸá
áááºá á¡ááœáŸááºážáááºááá¯ážáá»á¬ážááᯠááá·áºáá²ááŒááºááœá¬ážáááá·áºááẠ(á¡ááœááºáááºááá¯áž row_ver
).
iterator ááẠtuples ááŒááºáá±ážáááºá HTTP ááŸáá
áºááá·áº áá±áá¬áá»á¬ážááᯠáá±á¬ááºááá¯ááºážááœáẠááœáŸá²ááŒá±á¬ááºážááá¯ááºá
á±áááºá¡ááœááºá áá±á¬ááºáááºááœá² á¡ááŸááºá
ááºáá»á¬ážá¡ááœáẠá¡áááºááŒá±áá±á¬ ááœá²á·á
ááºážáá¯á¶á¡ááŒá
Ạtuples á¡ááŒá
áºááá¯á· ááŒá±á¬ááºážáá²ááẠááá¯á¡ááºáá«áááºá á¥ááá¬ááẠá€á¡ááœáẠá
á¶áá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¯á¶ážááŒá¯áááºá tomap
. áá¯á¶ážááá·áºá¡á
á¬áž tomap
áááºáááºáááºáááá¯ááºááá¯áẠfunction ááá¯áá±ážááá¯ááºáá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááœááºáá
áºáá¯ááᯠá¡áááºááŒá±á¬ááºážááá¯áá±áááºá 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. áááá·áºáááá¯ááááºáá
áºáá¯ááœááºá á
á¬áá»ááºááŸá¬á¡ááœááºá¡á
á¬ážááẠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº ááá¯á¡áá±ážááŒá®ážáá«áááºá áááºážááẠspace tuple ááá»ááºážáá»áŸá¡ááœááºá¡á
á¬ážáá±á«áºááœááºáá°áááºáááºá áá±áá¬ááœáŸá²ááŒá±á¬ááºážáá»áááºááᯠááá¯ááºážáá¬ááŒááºážááŒáá·áº á¡áá±á¬ááºážáá¯á¶áž á
á¬áá»ááºááŸá¬á¡ááœááºá¡á
á¬ážááᯠáá»ááºááŒááºááá¯ááºááœá±á· áá¯á¶ážááŒááºááá¯ááºáá«áááºá á
á¬áá»ááºááŸá¬ á¡ááœááºá¡á
á¬áž ááŒá®ážáá±á ááá¯á·ááŒááºážááŸáá·áº áááºáá¶ááŒááºáž ááŸá
áºáááºááŒá¬áž á¡ááœá¬ážá¡ááŒáẠá¡áá±á¡ááœáẠáááºážáá«ážáá± ááŒá
áºáááºá á€áááºážááŒáá·áº ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáá±á«ááºážáá¯ááºááœá²áááºá¡ááœáẠá
á¯á
á¯áá±á«ááºážá¡áá»áááºááᯠáá»áŸá±á¬á·áá»ááá¯ááºáááºá ááá¯á·áá±á¬áºá á
á¬áá»ááºááŸá¬á¡ááœááºá¡á
á¬áž ááŒá®ážááœááºážáá«áá ááá°áá¬ááᯠáá¶áá«ááºá
ááºáááºááŸááºááŒááºáž áá¬áá¬ááœáẠá¡áá»áááºá¡áá±á¬áºááŒá¬áá±áá«áááºá ááááºá¡áá±ááŒáá·áºá áá¬áá¬ááá¯á·áá±á¬ááºáá¬áá±á¬ á¡ááŒá¬ážáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºáá¬ááœáẠááŸá±á¬áá·áºááŸá±ážááŸá¯áá»á¬ážááŸáááá¯ááºáááºá ááá·áºáááºáá»áẠpage_size
configuration file á០áááºááá¯ááºáááºá áá¯ááºááœáŸáá·áºááá·áºáá±áá¬áá
áºáá¯á
á®á¡ááœááºá áááºááẠáááºážáááá¯ááºááá¯ááºáááºááá¯ážááᯠáááºáááºááŸááºááá¯ááºáááºá ááá¯á·áá±á¬áºá áá±áá¬á¡áá»á¬ážá
á¯á¡ááœáẠáá°áááºážáááºááá¯áž (á¥ááá¬á 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)
---
- []
...
áááºááœá±á·ááŒááºáááá·áºá¡ááá¯ááºáž á€áááºážááá¯á¡áá¯á¶ážááŒá¯áá±á¬á¡áá«á function ááẠspace records á¡á¬ážáá¯á¶ážááᯠá
á¬áá»ááºááŸá¬áá
áºáá¯ááŒá®ážáá
áºáᯠááŒááºáá±ážáááºá 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
...
áá¯ááºáá±á¬ááºáá»ááºááẠááŒá±á¬ááºážáá²ááŒá®áž áááºááá·áºáá¬ážáá±á¬ ááŸááºáááºážáá»á¬ážááᯠááŒááºáá±ážáááºá áá«ááŒá±á¬áá·áº function ááᯠget_goods
ááá·áºááœááºážá
ááºážá
á¬ážááá·áºáááºážáááºážá á¡ááŒá±áá¶ááŒá
áºááá·áº áááºážááá±á¬ááºáá¯á¶ážáá±á«áºááá¯ááŸá¯áá±á¬ááºááá¯ááºáž ááŒá±á¬ááºážáá²áá¬áá±á¬ áá±áá¬ááᯠááá·áºá¡á¬áž áááºáá¶áááŸáá
á±áááºááŒá
áºáááºá
áá»áœááºá¯ááºááá¯á·ááẠá€áá±á¬ááºážáá«ážááá±á¬ááºá¡ááŒááºáááºááœáẠJSON áá¯á¶á
á¶ááŒáá·áº HTTP ááŸáá
áºááá·áº ááááºáá»á¬ážáá¯ááºáá±ážááŒááºážááᯠáá»ááºáá¬ážáá²á·áá«áááºá á€á¡ááŒá±á¬ááºážááᯠá€áá±áá¬ááœáẠáááºááŸá¯ááá¯ááºáá«áááºá
client/slave á¡ááá¯ááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá
áááºáá¶áá²á·áááºá á¡áá±á¬ááºá¡áááºáá±á¬áºáá¯á¶á áááºááá¯áá²ááá¯áᬠááŒáá·áºáá¡á±á¬ááºá áá±á«ááºážáá¯ááºáá¯ááºáá¬ážáá±á¬áá±áá¬ááᯠááááºážáááºážáááºá¡ááœáẠáááºáá¶ááá·áºáááºááŒááºážááœáẠáá±áá¬áá áºáᯠáááºáá®ážááŒáá«á áá¯á·á
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
áá¯ááºáá±á¬ááºáá»ááºááẠurl ááááºá
á¬ááá¯á· 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
) disk áááºáááºááŸá¯á¡áá±á¡ááœááºááá¯áá»áŸá±á¬á·áá»áááºá
áá±á¬ááºáá¯á¶ážááœááºá áá±áááá¯ááºáá¬á¡á¬áá¬ááááºáá°ááŒá¯ááŒááºážáá¯ááºáá±á¬ááºáá»áẠ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
áá¯á ááá¯á·áá±á¬áẠá
ááºááá¯ááºážááœáẠáááºááŸááºáá¬ážáá±á¬ url ááœáẠááŒá±á¬ááºážáá²áá¬ážáá±á¬ áá±áá¬á¡áááºážá¡ááŒá
áºá០á
á¬áá»ááºááŸá¬áá
áºáá¯áá»ááºážááᯠáá±á«ááºážáá¯ááºáá¯ááºáá«áááºá áááºáá«áááºáá«ááá¯ááºážááœááºá áá»áœááºá¯ááºááá¯á·ááẠáááºáá¶áááŸááá¬ážáá±á¬áá±áá¬ááᯠááá·áºáá»á±á¬áºáá±á¬áá±ááá¶áá±áá¬á ááááºážáááºážááŒá®áž áááºááá¯ážááᯠá¡ááºááááºáá¯ááºáá«á row_ver
(á¡á¬áá¬ááá²ááŸá¬ row_ver
ááŸáá·áº variable ááœáẠrow_ver
) - áááºááá¯ážááᯠáá°áá«á row_ver
áááºáá¬ážáá±á¬áá±áá¬ááá±á¬ááºáá¯á¶ážááá¯ááºážááŸá
ááá±á¬áºáá looping (áááá¯ááááºááœáẠerror ááŒá
áºáá«á)á loop ááŸáá¬ááœááºááẠwhile
ááŒáá·áº á¡á
á¬ážááá¯ážááá¯ááºáá«áááºá for
:
for _ = 1, max_req do ...
áá¯ááºáá±á¬ááºáá»ááºááá¯áá¯ááºáá±á¬ááºááŒááºážááááẠsync_goods
á¡á¬áá¬á goods
áááºáá¶áá°ááœáẠspace ááŸááºáááºážá¡á¬ážáá¯á¶ážá áá±á¬ááºáá¯á¶ážáá¬ážááŸááºážáá»á¬áž áá«áááºáááºááŒá
áºáááºá goods
á¡áááºážá¡ááŒá
áºáá
áááááá¬áá¬á áá±áá¬áá»ááºááŒááºážá¡á¬áž á€áááºážááŒáá·áº áá¯ááºááœáŸáá·áºááááá«á ááá¯á¡ááºáá»ááºáá»á¬ážááŸááá«áá áá»ááºááŒááºážá¡ááŸááºá¡áá¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá á¡á¬áá¬ááá²ááá¯á· ááá·áºáá«á goods
áá°áá®áá¶á¡ááœáẠis_deleted
ááŸááºáááºážáá
áºáá¯á¡á¬áž áá¯ááºááá¯ááºážááá¯ááºáá¬áá»ááºááŒááºážá¡á
á¬ážá áá»áœááºá¯ááºááá¯á·ááẠáá»áá¯ážááŒá±á¬ááºážáá®áá»á±á¬áºá
áœá¬ áá»ááºááŒááºážááá¯á¡áá¯á¶ážááŒá¯ááẠ- áá»áœááºá¯ááºááá¯á·ááẠá¡ááœááºáááºááá¯ážááᯠáááºááŸááºáá±ážáá«áááºá is_deleted
á¡áááá¹áá«ááºááá¯á· true
. áá
áºáá«áá
áºáá¶ááœáẠáá°áá®á¡ááœááºá¡á
á¬áž is_deleted
áááºááœááºážááᯠáá¯á¶ážááᬠááá¯á¡áááºááŒá±áááºá deleted
ááŸááºáááºážááᯠáá»áá¯ážááŒá±á¬ááºážáá®áá»á±á¬áºá
áœá¬ áá»ááºááŒááºážá áááºá
áœá²-á¡áá»áááºááᯠááááºážáááºážáá±ážáá±á¬á áá¯áá¹áááá²á· áá»ááºááŒááºážááᯠáá¯ááºáá±á¬ááºááŒá®ážáá±á¬ááºá áá»ááºááŒááºážá¡ááœáẠá¡ááŸááºá¡áá¬ážááŒá¯áá¬ážááá·áº ááŸááºáááºážááᯠá¡áááºážá¡ááŒá
áºá០áŠážáááºáá¬ááá¯á· ááœáŸá²ááŒá±á¬ááºážáá±ážááẠ(á¡áááºááœáẠááœá±ážááœá±ážáá¬ážáá±á¬ áá¯áá¹áááá±áá¡á)á
á¡áááºáááŒáẠrow_ver
á¡ááŒá¬ážáá±áá¬áá»á¬ážá០áá±áá¬áá»á¬ážááᯠááá¯á·ááœáŸááºááẠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá ááá¯á·ááœáŸááºááá·áº áá±áá¬áá
áºáá¯á
á®á¡ááœáẠáá®ážááŒá¬áž sequence áááºáá®ážááẠáááá¯á¡ááºáá«á
Tarantool DBMS ááᯠá¡áá¯á¶ážááŒá¯á á¡ááá®áá±ážááŸááºážáá»á¬ážááœáẠá¡ááá·áºááŒáá·áºáá±áá¬áá¯á¶áá°ááœá¬ážááŒááºážá¡ááœáẠáááá±á¬ááºáá±á¬áááºážáááºážááᯠáá»áœááºá¯ááºááá¯á· ááŒáá·áºááŸá¯áá²á·áá«áááºá
ááœá±á·ááŸááá»ááºáá»á¬áž
- Tarantool DBMS ááẠhigh-load applications áá»á¬ážáááºáá®ážáááºá¡ááœáẠááœá²áá±á¬ááºááŸá¯ááŸáááŒá®áž á¡áá¬ážá¡áá¬ááŸááá±á¬áá¯ááºáá¯ááºáá áºáá¯ááŒá áºáááºá
- High-level data replication ááẠlow-level replication ááẠá¡á¬ážáá¬áá»ááºáá»á¬ážá áœá¬ááŸááááºá
- áá±á¬ááºážáá«ážááœáẠááœá±ážááœá±ážáá¬ážáá±á¬ á¡ááá·áºááŒáá·áº áá¯á¶áá°áá°ážáááºážáááºážáááºážááẠááŒá®ážáá²á·ááá·áº áá²ááŸááºáá»áááºááŸá á ááŒá±á¬ááºážáá²áá²á·ááá·áº ááŸááºáááºážáá»á¬ážááá¯áᬠááœáŸá²ááŒá±á¬ááºážááŒááºážááŒáá·áº ááœáŸá²ááŒá±á¬ááºážáá±áá¬ááá¬áááᯠáá»áŸá±á¬á·áá»ááá¯ááºá á±áááºááŒá áºáááºá
source: www.habr.com