ืฉื›ืคื•ืœ ื‘ืจืžื” ื’ื‘ื•ื”ื” ื‘-Tarantool DBMS

ืฉืœื•ื, ืื ื™ ื™ื•ืฆืจ ื™ื™ืฉื•ืžื™ื ืขื‘ื•ืจ DBMS ื˜ืจื ื˜ื•ืœ ื”ื™ื ืคืœื˜ืคื•ืจืžื” ืฉืคื•ืชื—ื” ืขืœ ื™ื“ื™ Mail.ru Group ื”ืžืฉืœื‘ืช DBMS ื‘ืขืœ ื‘ื™ืฆื•ืขื™ื ื’ื‘ื•ื”ื™ื ื•ืฉืจืช ื™ื™ืฉื•ืžื™ื ื‘ืฉืคืช Lua. ื”ืžื”ื™ืจื•ืช ื”ื’ื‘ื•ื”ื” ืฉืœ ืคืชืจื•ื ื•ืช ื”ืžื‘ื•ืกืกื™ื ืขืœ Tarantool ืžื•ืฉื’ืช, ื‘ืžื™ื•ื—ื“, ื”ื•ื“ื•ืช ืœืชืžื™ื›ื” ื‘ืžืฆื‘ ื”ื–ื™ื›ืจื•ืŸ ืฉืœ ื”-DBMS ื•ื”ื™ื›ื•ืœืช ืœื‘ืฆืข ืœื•ื’ื™ืงื” ืขืกืงื™ืช ืฉืœ ื™ื™ืฉื•ืžื™ื ื‘ืžืจื—ื‘ ื›ืชื•ื‘ื•ืช ื™ื—ื™ื“ ืขื ื ืชื•ื ื™ื. ื‘ืžืงื‘ื™ืœ, ืขืžื™ื“ื•ืช ื”ื ืชื•ื ื™ื ืžื•ื‘ื˜ื—ืช ื‘ืืžืฆืขื•ืช ืขืกืงืื•ืช ACID (ื™ื•ืžืŸ WAL ื ืฉืžืจ ืขืœ ื”ื“ื™ืกืง). ืœ-Tarantool ื™ืฉ ืชืžื™ื›ื” ืžื•ื‘ื ื™ืช ืœืฉื›ืคื•ืœ ื•ืจื™ืกื•ืง. ื”ื—ืœ ืžื’ืจืกื” 2.1, ืฉืื™ืœืชื•ืช ื‘ืฉืคืช SQL ื ืชืžื›ื•ืช. Tarantool ื”ื•ื ืงื•ื“ ืคืชื•ื— ื•ืžื•ืจืฉื” ืชื—ืช ืจื™ืฉื™ื•ืŸ BSD Simplified. ื™ืฉ ื’ื ื’ืจืกืช Enterprise ืžืกื—ืจื™ืช.

ืฉื›ืคื•ืœ ื‘ืจืžื” ื’ื‘ื•ื”ื” ื‘-Tarantool DBMS
ื”ืจื’ื™ืฉื• ืืช ื”ืขื•ืฆืžื”! (...aka ืชื”ื ื” ืžื”ื‘ื™ืฆื•ืข)

ื›ืœ ื”ืืžื•ืจ ืœืขื™ืœ ื”ื•ืคืš ืืช Tarantool ืœืคืœื˜ืคื•ืจืžื” ืื˜ืจืงื˜ื™ื‘ื™ืช ืœื™ืฆื™ืจืช ื™ื™ืฉื•ืžื™ื ื‘ืขื•ืžืก ื’ื‘ื•ื” ืฉืขื•ื‘ื“ื™ื ืขื ืžืกื“ื™ ื ืชื•ื ื™ื. ื‘ื™ื™ืฉื•ืžื™ื ื›ืืœื”, ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื™ืฉ ืฆื•ืจืš ื‘ืฉื›ืคื•ืœ ื ืชื•ื ื™ื.

ื›ืคื™ ืฉื”ื•ื–ื›ืจ ืœืขื™ืœ, ืœ-Tarantool ื™ืฉ ืฉื›ืคื•ืœ ื ืชื•ื ื™ื ืžื•ื‘ื ื”. ืขืงืจื•ืŸ ื”ืคืขื•ืœื” ืฉืœื• ื”ื•ื ืœื‘ืฆืข ื‘ืจืฆืฃ ืขืœ ื”ืขืชืงื™ื ืืช ื›ืœ ื”ืขืกืงืื•ืช ื”ื›ืœื•ืœื•ืช ื‘ื™ื•ืžืŸ ื”ืจืืฉื™ (WAL). ื‘ื“ืจืš ื›ืœืœ ืฉื›ืคื•ืœ ื›ื–ื” (ื ืงืจื ืœื–ื” ืขื•ื“ ืจืžื” ื ืžื•ื›ื”) ืžืฉืžืฉ ืœื”ื‘ื˜ื—ืช ืกื•ื‘ืœื ื•ืช ืชืงืœื•ืช ื‘ืืคืœื™ืงืฆื™ื” ื•/ืื• ืœืคื™ื–ื•ืจ ืขื•ืžืก ื”ืงืจื™ืื” ื‘ื™ืŸ ืฆืžืชื™ ืืฉื›ื•ืœ.

ืฉื›ืคื•ืœ ื‘ืจืžื” ื’ื‘ื•ื”ื” ื‘-Tarantool DBMS
ืื•ืจื–. 1. ืฉื›ืคื•ืœ ื‘ืชื•ืš ืืฉื›ื•ืœ

ื“ื•ื’ืžื” ืœืชืจื—ื™ืฉ ื—ืœื•ืคื™ ืชื”ื™ื” ื”ืขื‘ืจืช ื ืชื•ื ื™ื ืฉื ื•ืฆืจื• ื‘ืžืกื“ ื ืชื•ื ื™ื ืื—ื“ ืœืžืกื“ ื ืชื•ื ื™ื ืื—ืจ ืœืฆื•ืจืš ืขื™ื‘ื•ื“/ื ื™ื˜ื•ืจ. ื‘ืžืงืจื” ื”ืื—ืจื•ืŸ, ืคืชืจื•ืŸ ื ื•ื— ื™ื•ืชืจ ืขืฉื•ื™ ืœื”ื™ื•ืช ืฉื™ืžื•ืฉ ืจืžื” ื’ื‘ื•ื”ื” ืฉื›ืคื•ืœ - ืฉื›ืคื•ืœ ื ืชื•ื ื™ื ื‘ืจืžืช ื”ืœื•ื’ื™ืงื” ื”ืขืกืงื™ืช ืฉืœ ื”ืืคืœื™ืงืฆื™ื”. ื”ึธื”ึตืŸ. ืื ื—ื ื• ืœื ืžืฉืชืžืฉื™ื ื‘ืคืชืจื•ืŸ ืžื•ื›ืŸ ื”ืžื•ื‘ื ื” ื‘-DBMS, ืืœื ืžื™ื™ืฉืžื™ื ืจืคืœื™ืงืฆื™ื” ื‘ืขืฆืžื ื• ื‘ืชื•ืš ื”ืืคืœื™ืงืฆื™ื” ืฉืื ื• ืžืคืชื—ื™ื. ืœื’ื™ืฉื” ื–ื• ื™ืฉ ื’ื ื™ืชืจื•ื ื•ืช ื•ื’ื ื—ืกืจื•ื ื•ืช. ื‘ื•ืื• ื ืžื ื” ืืช ื”ื™ืชืจื•ื ื•ืช.

1. ื—ื™ืกื›ื•ืŸ ื‘ืชื ื•ืขื”:

  • ืœื ื ื™ืชืŸ ืœื”ืขื‘ื™ืจ ืืช ื›ืœ ื”ื ืชื•ื ื™ื, ืืœื ืจืง ื—ืœืง ืžื”ื (ืœื“ื•ื’ืžื”, ื ื™ืชืŸ ืœื”ืขื‘ื™ืจ ืจืง ื—ืœืง ืžื”ื˜ื‘ืœืื•ืช, ื—ืœืง ืžื”ืขืžื•ื“ื•ืช ืื• ื”ืจืฉื•ืžื•ืช ืฉืœื”ืŸ ื”ืขื•ืžื“ื•ืช ื‘ืงืจื™ื˜ืจื™ื•ืŸ ืžืกื•ื™ื);
  • ื‘ื ื™ื’ื•ื“ ืœืฉื›ืคื•ืœ ื‘ืจืžื” ื ืžื•ื›ื”, ื”ืžืชื‘ืฆืขืช ื‘ืื•ืคืŸ ืจืฆื™ืฃ ื‘ืžืฆื‘ ืืกื™ื ื›ืจื•ื ื™ (ืžื™ื•ืฉื ื‘ื’ืจืกื” ื”ื ื•ื›ื—ื™ืช ืฉืœ Tarantool - 1.10) ืื• ืกื™ื ื›ืจื•ื ื™ (ืฉื™ื™ื•ืฉื ื‘ื’ืจืกืื•ืช ื”ื‘ืื•ืช ืฉืœ Tarantool), ื ื™ืชืŸ ืœื‘ืฆืข ืฉื›ืคื•ืœ ื‘ืจืžื” ื’ื‘ื•ื”ื” ื‘ืกืฉื ื™ื (ื›ืœื•ืžืจ, ื”ืืคืœื™ืงืฆื™ื” ืžืกื ื›ืจื ืช ืชื—ื™ืœื” ืืช ื”ื ืชื•ื ื™ื - ื ืชื•ื ื™ ื”ืคืขืœื” ืฉืœ ื”ื—ืœืคื”, ืœืื—ืจ ืžื›ืŸ ื™ืฉ ื”ืคืกืงื” ื‘ืฉื›ืคื•ืœ, ื•ืœืื—ืจ ืžื›ืŸ ืžืชืจื—ืฉืช ื”ืคื’ื™ืฉื” ื”ื‘ืื” ืฉืœ ื”ื—ืœืคื” ื•ื›ื•');
  • ืื ืจืฉื•ืžื” ื”ืฉืชื ืชื” ืžืกืคืจ ืคืขืžื™ื, ืืชื” ื™ื›ื•ืœ ืœื”ืขื‘ื™ืจ ืจืง ืืช ื”ื’ืจืกื” ื”ืื—ืจื•ื ื” ืฉืœื” (ื‘ื ื™ื’ื•ื“ ืœืฉื›ืคื•ืœ ื‘ืจืžื” ื ืžื•ื›ื”, ืฉื‘ื” ื›ืœ ื”ืฉื™ื ื•ื™ื™ื ืฉื ืขืฉื• ื‘ืžืืกื˜ืจ ื™ื•ืฉืžืขื• ื‘ืจืฆืฃ ืขืœ ื”ื”ืขืชืงื™ื).

2. ืื™ืŸ ืงืฉื™ื™ื ื‘ื™ื™ืฉื•ื ื—ื™ืœื•ืคื™ HTTP, ื”ืžืืคืฉืจื™ื ืœืกื ื›ืจืŸ ืžืกื“ื™ ื ืชื•ื ื™ื ืžืจื•ื—ืงื™ื.

ืฉื›ืคื•ืœ ื‘ืจืžื” ื’ื‘ื•ื”ื” ื‘-Tarantool DBMS
ืื•ืจื–. 2. ืฉื›ืคื•ืœ ืขืœ HTTP

3. ืžื‘ื ื™ ืžืกื“ ื”ื ืชื•ื ื™ื ืฉื‘ื™ื ื™ื”ื ืžื•ืขื‘ืจื™ื ื ืชื•ื ื™ื ืื™ื ื ื—ื™ื™ื‘ื™ื ืœื”ื™ื•ืช ื–ื”ื™ื (ื™ืชืจ ืขืœ ื›ืŸ, ื‘ืžืงืจื” ื”ื›ืœืœื™, ื ื™ืชืŸ ืืคื™ืœื• ืœื”ืฉืชืžืฉ ื‘-DBMS, ืฉืคื•ืช ืชื›ื ื•ืช, ืคืœื˜ืคื•ืจืžื•ืช ื•ื›ื•').

ืฉื›ืคื•ืœ ื‘ืจืžื” ื’ื‘ื•ื”ื” ื‘-Tarantool 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 Server, ื™ืฉ ืกื•ื’ ืขืžื•ื“ื” ืžื™ื•ื—ื“ ืœื™ื™ืฉื•ื ื’ื™ืฉื” ื–ื• - rowversion. ืœื›ืœ ืžืกื“ ื ืชื•ื ื™ื ื™ืฉ ืžื•ื ื” ืฉืขื•ืœื” ื‘ืื—ื“ ื‘ื›ืœ ืคืขื ืฉืžืชื•ื•ืกืคืช/ืžืฉืชื ื” ืจืฉื•ืžื” ื‘ื˜ื‘ืœื” ืฉื™ืฉ ืœื” ืขืžื•ื“ื” ื›ืžื• rowversion. ื”ืขืจืš ืฉืœ ืžื•ื ื” ื–ื” ืžื•ืงืฆื” ืื•ื˜ื•ืžื˜ื™ืช ืœืฉื“ื” ืฉืœ ืขืžื•ื“ื” ื–ื• ื‘ืจืฉื•ืžื” ืฉื ื•ืกืคื”/ืฉื•ื ืชื”. ืœ-Tarantool DBMS ืื™ืŸ ืžื ื’ื ื•ืŸ ืžื•ื‘ื ื” ื“ื•ืžื”. ืขื ื–ืืช, ื‘-Tarantool ืœื ืงืฉื” ืœื™ื™ืฉื ืื•ืชื• ื‘ืื•ืคืŸ ื™ื“ื ื™. ื‘ื•ืื• ื ืจืื” ืื™ืš ื–ื” ื ืขืฉื”.

ืจืืฉื™ืช, ื˜ืจืžื™ื ื•ืœื•ื’ื™ื” ืงื˜ื ื”: ื˜ื‘ืœืื•ืช ื‘-Tarantool ื ืงืจืื•ืช ืจื•ื•ื—ื™ื, ื•ืจืฉื•ืžื•ืช ื ืงืจืื•ืช tuples. ื‘-Tarantool ื ื™ืชืŸ ืœื™ืฆื•ืจ ืจืฆืคื™ื. ืจืฆืคื™ื ื”ื ืœื ื™ื•ืชืจ ืžืžื—ื•ืœืœื™ื ื‘ืขืœื™ ืฉื ืฉืœ ืขืจื›ื™ ืžืกืคืจ ืฉืœืžื™ื ืžืกื•ื“ืจื™ื. ื”ึธื”ึตืŸ. ื–ื” ื‘ื“ื™ื•ืง ืžื” ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืžื˜ืจื•ืช ืฉืœื ื•. ืœื”ืœืŸ ื ื™ืฆื•ืจ ืจืฆืฃ ื›ื–ื”.

ืœืคื ื™ ื‘ื™ืฆื•ืข ืคืขื•ืœืช ืžืกื“ ื ืชื•ื ื™ื ื›ืœืฉื”ื™ ื‘-Tarantool, ืขืœื™ืš ืœื”ืคืขื™ืœ ืืช ื”ืคืงื•ื“ื” ื”ื‘ืื”:

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), ืฉืžื•ืช ืฉื“ื•ืช ื•ืกื•ื’ื™ื”ื.

ืฉื“ื•ืช ื”ื’ื“ืœื” ืื•ื˜ื•ืžื˜ื™ืช ื‘-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 ืฆืจื™ืš ืœื”ื’ื“ื™ืœ ื‘ืื—ื“ ืœื ืจืง ื‘ืขืช ื”ื•ืกืคืช ืจืฉื•ืžื•ืช ื—ื“ืฉื•ืช, ืืœื ื’ื ื‘ืขืช ืฉื™ื ื•ื™ ืจืฉื•ืžื•ืช ืงื™ื™ืžื•ืช. ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื˜ืจื™ื’ืจื™ื ื‘ืฉื‘ื™ืœ ื–ื”. ืœ-Tarantool ื™ืฉ ืฉื ื™ ืกื•ื’ื™ื ืฉืœ ืžืคืขื™ืœื™ ืฉื˜ื—: before_replace ะธ on_replace. ื˜ืจื™ื’ืจื™ื ืžื•ืคืขืœื™ื ื‘ื›ืœ ืคืขื ืฉื”ื ืชื•ื ื™ื ื‘ืžืจื—ื‘ ืžืฉืชื ื™ื (ืขื‘ื•ืจ ื›ืœ tuple ื”ืžื•ืฉืคืข ืžื”ืฉื™ื ื•ื™ื™ื, ืžื•ืคืขืœืช ืคื•ื ืงืฆื™ื™ืช ื˜ืจื™ื’ืจ). ื‘ื ื™ื’ื•ื“ on_replace, before_replace-ื˜ืจื™ื’ืจื™ื ืžืืคืฉืจื™ื ืœืš ืœืฉื ื•ืช ืืช ื”ื ืชื•ื ื™ื ืฉืœ ื”-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 ืžืื•ื—ืกืŸ ืœืขืจืš ื”ื‘ื ืฉืœ ื”ืจืฆืฃ 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, ื”ื—ืœ ืžืžื ื• ื™ืฉ ืฆื•ืจืš ืœืคืจื•ืง ืฉื™ื ื•ื™ื™ื, ื•ืžื—ื–ื™ืจ ื—ืœืง ืžื”ื ืชื•ื ื™ื ืฉื”ืฉืชื ื•.

ื“ื’ื™ืžืช ื ืชื•ื ื™ื ื‘-Tarantool ื ืขืฉื™ืช ื‘ืืžืฆืขื•ืช ืื™ื ื“ืงืกื™ื. ืคื•ึผื ืงืฆึดื™ึธื” get_goods ืžืฉืชืžืฉ ื‘ืื™ื˜ืจื˜ื•ืจ ืœืคื™ ืื™ื ื“ืงืก row_ver ื›ื“ื™ ืœืงื‘ืœ ื ืชื•ื ื™ื ืฉื”ืฉืชื ื•. ืกื•ื’ ื”ืื™ื˜ืจื˜ื•ืจ ื”ื•ื GT (ื’ื“ื•ืœ ืž, ื’ื“ื•ืœ ืž). ื–ื” ืื•ืžืจ ืฉื”ืื™ื˜ืจื˜ื•ืจ ื™ืขื‘ื•ืจ ื‘ืจืฆืฃ ืืช ืขืจื›ื™ ื”ืื™ื ื“ืงืก ื”ื—ืœ ืžื”ืžืคืชื— ืฉืขื‘ืจ (ืขืจืš ืฉื“ื” row_ver).

ื”ืื™ื˜ืจื˜ื•ืจ ืžื—ื–ื™ืจ tuples. ืขืœ ืžื ืช ืฉื ื™ืชืŸ ื™ื”ื™ื” ืœื”ืขื‘ื™ืจ ื ืชื•ื ื™ื ื‘ืืžืฆืขื•ืช HTTP ืœืื—ืจ ืžื›ืŸ, ื™ืฉ ืฆื•ืจืš ืœื”ืžื™ืจ ืืช ื”-tuples ืœืžื‘ื ื” ื ื•ื— ืœื”ืกื“ืจื” ืœืื—ืจ ืžื›ืŸ. ื”ื“ื•ื’ืžื” ืžืฉืชืžืฉืช ื‘ืคื•ื ืงืฆื™ื” ื”ืกื˜ื ื“ืจื˜ื™ืช ืœืฉื ื›ืš 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. ื‘ืชื•ื›ื ื™ืช ืืžื™ืชื™ืช, ื’ื•ื“ืœ ื”ืขืžื•ื“ ื‘ื“ืจืš ื›ืœืœ ื—ืฉื•ื‘ ื™ื•ืชืจ. ื–ื” ืชืœื•ื™ ื‘ื’ื•ื“ืœ ื”ืžืžื•ืฆืข ืฉืœ tuple ื”ื—ืœืœ. ื ื™ืชืŸ ืœืงื‘ื•ืข ืืช ื’ื•ื“ืœ ื”ืขืžื•ื“ ื”ืื•ืคื˜ื™ืžืœื™ ื‘ืื•ืคืŸ ืืžืคื™ืจื™ ืขืœ ื™ื“ื™ ืžื“ื™ื“ืช ื–ืžืŸ ื”ืขื‘ืจืช ื”ื ืชื•ื ื™ื. ื›ื›ืœ ืฉื’ื•ื“ืœ ื”ืขืžื•ื“ ื’ื“ื•ืœ ื™ื•ืชืจ, ืžืกืคืจ ื”ื—ื–ืจื•ืช ื‘ื™ืŸ ืฆื“ ื”ืฉืœื™ื—ื” ื•ื”ืงื‘ืœื” ืงื˜ืŸ ื™ื•ืชืจ. ื›ืš ืชื•ื›ืœื• ืœื”ืคื—ื™ืช ืืช ื”ื–ืžืŸ ื”ื›ื•ืœืœ ืœื”ื•ืจื“ืช ืฉื™ื ื•ื™ื™ื. ืขื ื–ืืช, ืื ื’ื•ื“ืœ ื”ืขืžื•ื“ ื’ื“ื•ืœ ืžื“ื™, ื ื‘ืœื” ื–ืžืŸ ืจื‘ ืžื“ื™ ื‘ืฉืจืช ื‘ื”ืžืฉื›ืช ื”ื“ื•ื’ืžื”. ื›ืชื•ืฆืื” ืžื›ืš, ืขืฉื•ื™ื™ื ืœื”ื™ื•ืช ืขื™ื›ื•ื‘ื™ื ื‘ืขื™ื‘ื•ื“ ื‘ืงืฉื•ืช ืื—ืจื•ืช ื”ืžื’ื™ืขื•ืช ืœืฉืจืช. ืคึผึธืจึธืžึถื˜ึถืจ 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 ืžืืคืฉืจ ืœืš ืœืงื‘ืœ ื ืชื•ื ื™ื ืฉื”ืฉืชื ื• ืžืื– ื”ืงืจื™ืื” ื”ืื—ืจื•ื ื” ืฉืœื•, ื”ืžื”ื•ื•ื” ืืช ื”ื‘ืกื™ืก ืœืฉื™ื˜ืช ื”ืฉื›ืคื•ืœ ื”ื ื‘ื“ืงืช.

ื ืฉืื™ืจ ืืช ื”ื ืคืงืช ื”ืชื•ืฆืื•ืช ื‘ืืžืฆืขื•ืช HTTP ื‘ืฆื•ืจื” ืฉืœ JSON ืžื—ื•ืฅ ืœืชื—ื•ื ื”ืžืืžืจ ื”ื–ื”. ืืชื” ื™ื›ื•ืœ ืœืงืจื•ื ืขืœ ื–ื” ื›ืืŸ: 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:

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 ืœื›ืชื•ื‘ืช ื”-url ื•ืฉื•ืœื—ืช ืื•ืชื” 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 ืึถืคึถืก. ื‘ืฉืœื‘ ื”ื‘ื ื‘ืžื—ื–ื•ืจ ืื ื• ืžื‘ืฆืขื™ื ื”ื•ืจื“ื” ืขืžื•ื“ ืื—ืจ ืขืžื•ื“ ืฉืœ ื”ื ืชื•ื ื™ื ืฉื”ืฉืชื ื• ืžื”ืžืงื•ืจ ื‘ื›ืชื•ื‘ืช ื”-URL ืฉืฆื•ื™ื ื”. ื‘ื›ืœ ืื™ื˜ืจืฆื™ื” ืื ื• ืฉื•ืžืจื™ื ืืช ื”ื ืชื•ื ื™ื ืฉื”ืชืงื‘ืœื• ื‘ืžืจื—ื‘ ื”ืžืงื•ืžื™ ื”ืžืชืื™ื ื•ืžืขื“ื›ื ื™ื ืืช ื”ืขืจืš 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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”