เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เปƒเบ™ Tarantool DBMS

เบชเบฐเบšเบฒเบเบ”เบต, เบ‚เป‰เบญเบเบเปเบฒเบฅเบฑเบ‡เบชเป‰เบฒเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบชเปเบฒเบฅเบฑเบš DBMS Tarantool เป€เบ›เบฑเบ™เปเบžเบฅเบฐเบ•เบฐเบŸเบญเบกเบ—เบตเปˆเบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ”เบเบเบธเปˆเบก Mail.ru เบ—เบตเปˆเบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™ DBMS เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบชเบนเบ‡เปเบฅเบฐเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบŠเบตเบŸเป€เบงเบตเปƒเบ™เบžเบฒเบชเบฒ Lua. เบ„เบงเบฒเบกเป„เบงเบชเบนเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ Tarantool เปเบกเปˆเบ™เบšเบฑเบ™เบฅเบธเป„เบ”เป‰, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบฎเบนเบšเปเบšเบšเปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ‚เบญเบ‡ DBMS เปเบฅเบฐเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบ—เบธเบฅเบฐเบเบดเบ”เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆเบ”เบฝเบงเบเบฑเบšเบ‚เปเป‰เบกเบนเบ™. เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบ‚เปเป‰เบกเบนเบ™เบ„เบปเบ‡เบ„เป‰เบฒเบ‡เบ–เบทเบเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ ACID (เบšเบฑเบ™เบ—เบถเบ WAL เบ–เบทเบเบฎเบฑเบเบชเบฒเป„เบงเป‰เปƒเบ™เปเบœเปˆเบ™). Tarantool เบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เปƒเบ™เบ•เบปเบงเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เปเบฅเบฐ sharding. เป€เบฅเบตเปˆเบกเบˆเบฒเบเป€เบงเบตเบŠเบฑเปˆเบ™ 2.1, เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเปƒเบ™เบžเบฒเบชเบฒ SQL เปเบกเปˆเบ™เบฎเบญเบ‡เบฎเบฑเบš. Tarantool เปเบกเปˆเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เบžเบฒเบเปƒเบ•เป‰เปƒเบšเบญเบฐเบ™เบธเบเบฒเบ” BSD เปเบšเบšเบ‡เปˆเบฒเบ. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰เบเบฑเบ‡เบกเบตเบชเบฐเบšเบฑเบšเบงเบดเบชเบฒเบซเบฐเบเบดเบ”เบเบฒเบ™เบ„เป‰เบฒ.

เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เปƒเบ™ Tarantool DBMS
เบฎเบนเป‰โ€‹เบชเบถเบโ€‹เบงเปˆเบฒโ€‹เบžเบฐโ€‹เบฅเบฑเบ‡โ€‹เบ‡เบฒเบ™โ€‹! (โ€ฆaka เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบชเบธเบโ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹)

เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰ Tarantool เป€เบ›เบฑเบ™เปเบžเบฅเบฐเบ•เบฐเบŸเบญเบกเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบกเบตเบเบฒเบ™เป‚เบซเบผเบ”เบชเบนเบ‡เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™. เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบกเบฑเบเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบ‚เปเป‰เบกเบนเบ™.

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, Tarantool เบกเบตเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบ•เบปเบง. เบซเบผเบฑเบเบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบšเปƒเบ™ replicas เบ—เบธเบฅเบฐเบเปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™ master log (WAL). เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เปเบšเบšเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง (เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป‚เบ—เบซเบฒเบกเบฑเบ™เบ•เบทเปˆเบกเบญเบตเบ เบฅเบฐเบ”เบฑเบšเบ•เปเปˆเบฒ) เบ–เบทเบโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เป€เบžเบทเปˆเบญโ€‹เบฎเบฑเบšโ€‹เบ›เบฐโ€‹เบเบฑเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบ—เบปเบ™โ€‹เบ—เบฒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบ‚เบญเบ‡โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เปเบฅเบฐ / เบซเบผเบทโ€‹เป€เบžเบทเปˆเบญโ€‹เปเบˆเบโ€‹เบขเบฒเบโ€‹เป‚เบซเบผเบ”โ€‹เบเบฒเบ™โ€‹เบญเปˆเบฒเบ™โ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เบ‚เปเป‰ clusterโ€‹.

เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เปƒเบ™ Tarantool DBMS
เป€เบ‚เบปเป‰เบฒ. 1. เบเบฒเบ™เบˆเบณเบฅเบญเบ‡เบžเบฒเบเปƒเบ™เบเบธเปˆเบก

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปเบกเปˆเบ™เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบซเบ™เบถเปˆเบ‡เป„เบ›เบซเบฒเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบญเบทเปˆเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡ / เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบชเบธเบ”เบ—เป‰เบฒเบ, เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบชเบฐเบ”เบงเบเบเบงเปˆเบฒเบญเบฒเบ”เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰ เบฅเบฐโ€‹เบ”เบฑเบšโ€‹เบชเบนเบ‡ replication - เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบฅเบฐเบ”เบฑเบšเป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบ—เบธเบฅเบฐเบเบดเบ”เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™. เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™ DBMS, เปเบ•เปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบ”เป‰เบงเบเบ•เบปเบงเป€เบฎเบปเบฒเป€เบญเบ‡เบžเบฒเบเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒ. เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบกเบตเบ—เบฑเบ‡เบ‚เปเป‰เบ”เบตเปเบฅเบฐเบ‚เปเป‰เป€เบชเบ. เปƒเบซเป‰เบšเบญเบเบ‚เปเป‰เป„เบ”เป‰เบ›เบฝเบš.

1. เบ›เบฐเบซเบเบฑเบ”เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™:

  • เบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบ•เปˆเบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบกเบฑเบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป‚เบญเบ™เบžเบฝเบ‡เปเบ•เปˆเบšเบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบšเบฒเบ‡เบ„เปเบฅเปเบฒเบซเบผเบทเบšเบฑเบ™เบ—เบถเบเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ—เบตเปˆเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™);
  • เบšเปเปˆเบ„เบทเบเบฑเบšเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบ•เปˆเปเบฒ, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เปƒเบ™เปเบšเบšเบšเปเปˆเบเบปเบ‡เบเบฑเบ™ (เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™ Tarantool เบฎเบธเปˆเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™ - 1.10) เบซเบผเบท synchronous (เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบฎเบธเปˆเบ™เบ•เปเปˆเป„เบ›เบ‚เบญเบ‡ Tarantool), เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เปƒเบ™เป€เบŠเบ”เบŠเบฑเบ™ (i.e. เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เปเบฒเบญเบดเบ” synchronizes เบ‚เปเป‰เบกเบนเบ™ - เบ‚เปเป‰เบกเบนเบ™เบเบญเบ‡เบ›เบฐเบŠเบธเบกเปเบฅเบเบ›เปˆเบฝเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบตเบเบฒเบ™เบขเบธเบ”เบŠเบปเปˆเบงเบ„เบฒเบงเปƒเบ™เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบญเบ‡เบ›เบฐเบŠเบธเบกเปเบฅเบเบ›เปˆเบฝเบ™เบ•เปเปˆเป„เบ›เป€เบเบตเบ”เบ‚เบถเป‰เบ™, เปเบฅเบฐเบญเบทเปˆเบ™เป†);
  • เบ–เป‰เบฒเบšเบฑเบ™เบ—เบถเบเป„เบ”เป‰เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบซเบผเบฒเบเบ„เบฑเป‰เบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป‚เบญเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบฐเบšเบฑเบšเบซเบฅเป‰เบฒเบชเบธเบ”เบ‚เบญเบ‡เบกเบฑเบ™ (เบšเปเปˆเบ„เบทเบเบฑเบšเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบ•เปˆเปเบฒ, เป€เบŠเบดเปˆเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเป€เบฎเบฑเบ”เบขเบนเปˆเปƒเบ™เปเบกเปˆเบšเบปเบ”เบˆเบฐเบ–เบทเบเบซเบผเบดเป‰เบ™เบ„เบทเบ™เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบšเปƒเบ™ replicas).

2. เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เปเบฅเบเบ›เปˆเบฝเบ™ HTTP, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” synchronize เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบ.

เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เปƒเบ™ Tarantool DBMS
เป€เบ‚เบปเป‰เบฒ. 2. Replication over HTTP

3. เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเป‚เบญเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ„เบทเบเบฑเบ™ (เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบปเปˆเบงเป„เบ›, เบกเบฑเบ™เบเปเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ DBMSs, เบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบก, เป€เบงเบ—เบต, เปเบฅเบฐเบญเบทเปˆเบ™เป†).

เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เปƒเบ™ Tarantool DBMS
เป€เบ‚เบปเป‰เบฒ. 3. เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เปƒเบ™เบฅเบฐเบšเบปเบš heterogeneous

เบเบฒเบ™เบซเบผเบธเบ”เบฅเบปเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ, เป‚เบ”เบเบชเบฐเป€เบฅเปˆเบ, เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบ / เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเบซเบผเบฒเบเบเปˆเบงเบฒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เปเบฅเบฐเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบ›เบฑเบšเปเบ•เปˆเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปƒเบ™เบ•เบปเบง, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡.

เบ–เป‰เบฒเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบ‚เปเป‰เป„เบ”เป‰เบ›เบฝเบšเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เปเบกเปˆเบ™เบชเปเบฒเบ„เบฑเบ™ (เบซเบผเบทเป€เบ›เบฑเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™), เบกเบฑเบ™เบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡. เบ‚เปเปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เปƒเบ™ Tarantool DBMS.

เบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ‚เปเป‰เป„เบ”เป‰เบ›เบฝเบšเบ‚เบญเบ‡เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เปเบกเปˆเบ™เบเบฒเบ™เบ›เบฐเบซเบเบฑเบ”เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™. เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ›เบฐเป‚เบซเบเบ”เบ™เบตเป‰เบ–เบทเบเบฎเบฑเบšเบฎเบนเป‰เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆ, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบซเบผเบธเบ”เบœเปˆเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเป‚เบญเบ™เปƒเบซเป‰เบซเบ™เป‰เบญเบเบฅเบปเบ‡เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบญเบ‡เบ›เบฐเบŠเบธเบกเปเบฅเบเบ›เปˆเบฝเบ™เปเบ•เปˆเบฅเบฐเบ„เบปเบ™. เปเบ™เปˆเบ™เบญเบ™, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบ„เบงเบ™เบฅเบทเบกเบงเปˆเบฒเปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบเบญเบ‡เบ›เบฐเบŠเบธเบก, เบœเบนเป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ•เป‰เบญเบ‡เบ–เบทเบ synchronized เบเบฑเบšเปเบซเบผเปˆเบ‡ (เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบชเปเบฒเบฅเบฑเบšเบชเปˆเบงเบ™เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡).

เบงเบดเบ—เบตเบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเป‚เบญเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡? เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบเบปเบ‡เป„เบ›เบเบปเบ‡เบกเบฒเบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เป€เบฅเบทเบญเบเบ‚เปเป‰เบกเบนเบ™เบ•เบฒเบกเบงเบฑเบ™เบ—เบตเปเบฅเบฐเป€เบงเบฅเบฒ. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบงเบฑเบ™เบ—เบต - เป€เบงเบฅเบฒเบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ (เบ–เป‰เบฒเบกเบฑเบ™เบกเบตเบขเบนเปˆ). เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบญเบเบฐเบชเบฒเบ™ "เบ„เปเบฒเบชเบฑเปˆเบ‡" เบญเบฒเบ”เบˆเบฐเบกเบตเบžเบฒเบเบชเบฐเบซเบ™เบฒเบก "เป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™" - 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 เบชเบนเบ‡เบเบงเปˆเบฒเบˆเปเบฒเบ™เบงเบ™เบ—เบตเปˆเปƒเบซเป‰เปเบฅเบฐเบœเบฐเบฅเบดเบ”เบˆเปเบฒเบ™เบงเบ™เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™, เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบˆเบฒเบเบเบฒเบ™เบŠเบปเบ”เป€เบŠเบตเบเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบˆเบฒเบเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡).

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ›เบธเบ‡เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบ›เบฐเป€เบžเบ” integer (เบˆเปเบฒเบ™เบงเบ™เป€เบ•เบฑเบกเบเบฒเบง) เป€เบ›เบฑเบ™เบ„เปˆเบฒเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบ–เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡. เปƒเบซเป‰เบ•เบฑเป‰เบ‡เบŠเบทเปˆเบ–เบฑเบ™ row_ver. เบ„เปˆเบฒเบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบ–เบฑเบ™เบ™เบตเป‰เบเบฑเบ‡เบ•เป‰เบญเบ‡เบ–เบทเบเบ•เบฑเป‰เบ‡/เบญเบฑเบšเป€เบ”เบ”เปƒเบ™เปเบ•เปˆเบฅเบฐเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบšเบฑเบ™เบ—เบถเบเบ–เบทเบเบชเป‰เบฒเบ‡/เปเบเป‰เป„เบ‚. เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบˆเบฐเบšเปเปˆเบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเบงเบฑเบ™เบ—เบต - เป€เบงเบฅเบฒเปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™, เปเบ•เปˆเบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบ•เบปเบงเบ™เบฑเบšเบšเบฒเบ‡เบขเปˆเบฒเบ‡, เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบซเบ™เบถเปˆเบ‡. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เบฑเบ™ row_ver เบˆเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ„เบธเบ™เบ„เปˆเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเปเบฅเบฐเบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบกเบนเบ™ "delta" (เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบก / เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบเบญเบ‡เบ›เบฐเบŠเบธเบกเปเบฅเบเบ›เปˆเบฝเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ), เปเบ•เปˆเบเบฑเบ‡เป€เบ›เบฑเบ™เบเบฒเบ™เบ—เปเบฒเบฅเบฒเบเบกเบฑเบ™เบฅเบปเบ‡เป€เบ›เบฑเบ™เบซเบ™เป‰เบฒเบ•เปˆเบฒเบ‡เป†เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš.

เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบชเบฐเป€เบซเบ™เบตเบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเป‚เบญเบ™เบขเบนเปˆเปƒเบ™เบเบญเบšเบ‚เบญเบ‡เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ‚เป‰เบญเบเปเบกเปˆเบ™เบ”เบตเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบ—เบปเปˆเบงเป„เบ›เบ—เบตเปˆเบชเบธเบ”. เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบขเบนเปˆเปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

เบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบ™เบฑเบšเบฅเบธเป‰เบ™เปเบ–เบง

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ / เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš

เปƒเบ™ 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. Triggers เบ–เบทเบเบเบดเบ‡เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบŠเปˆเบญเบ‡เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡ (เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐ tuple เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เบเบฐเบ—เบปเบšเบˆเบฒเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡, เบŸเบฑเบ‡เบŠเบฑเบ™ trigger เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบง). เบšเปเปˆโ€‹เบกเบฑเบ on_replace, before_replace-triggers เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เป€เบžเบทเปˆเบญโ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ‚เบญเบ‡ tuple เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆ trigger เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ›เบฐเป€เบžเบ”เบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบžเบงเบเป€เบฎเบปเบฒ.

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}

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบ•เบปเบงเบ™เบฑเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”; เบžเบงเบเป€เบฎเบปเบฒเบœเปˆเบฒเบ™ 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

เบŸเบฑเบ‡เบŠเบฑเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒเป€เบ›เบฑเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ‚เบญเบ‡เบกเบนเบ™เบ„เปˆเบฒ row_ver, เป€เบฅเบตเปˆเบกเบˆเบฒเบเบ—เบตเปˆเบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡ unload เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡, เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡.

เบเบฒเบ™เป€เบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™ Tarantool เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบœเปˆเบฒเบ™เบ”เบฑเบ”เบชเบฐเบ™เบต. เบŸเบฑเบ‡เบŠเบฑเบ™ get_goods เปƒเบŠเป‰ iterator เป‚เบ”เบเบ”เบฑเบ”เบชเบฐเบ™เบต row_ver เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡. เบ›เบฐเป€เบžเบ” Iterator เปเบกเปˆเบ™ GT (เปƒเบซเบเปˆเบเบงเปˆเบฒ, เปƒเบซเบเปˆเบเบงเปˆเบฒ). เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ iterator เบˆเบฐเบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš traverse เบ„เปˆเบฒเบ”เบฑเบ”เบŠเบฐเบ™เบตเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบˆเบฒเบเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™ (เบ„เปˆเบฒเบžเบฒเบเบชเบฐเบซเบ™เบฒเบก. row_ver).

iterator เบชเบปเปˆเบ‡เบ„เบทเบ™ tuples. เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบฒเบกเบฒเบ”เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบœเปˆเบฒเบ™ HTTP เป„เบ”เป‰, เบกเบฑเบ™ เบˆเบณ เป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ›เปˆเบฝเบ™ tuples เป„เบ›เบชเบนเปˆเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ—เบตเปˆเบชเบฐเบ”เบงเบเบ•เปเปˆเบเบฒเบ™ serialization เบ•เปเปˆเบกเบฒ. เบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰ 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 เบŠเปˆเบญเบ‡. เบ‚เบฐเบซเบ™เบฒเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบชเบฒเบกเบฒเบ”เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบเบฒเบ™เบงเบฑเบ”เปเบ—เบเป€เบงเบฅเบฒเบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™. เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบซเบ™เป‰เบฒโ€‹เบ—เบตเปˆโ€‹เปƒเบซเบเปˆโ€‹เบ‚เบถเป‰เบ™โ€‹, เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เป„เบ›โ€‹เบเบฑเบšโ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ™เป‰เบญเบโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เป„เบ›โ€‹เบกเบฒโ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เบ‚เป‰เบฒเบ‡โ€‹เบชเบปเปˆเบ‡โ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบšโ€‹. เบงเบดเบ—เบตเบ™เบตเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบงเบฅเบฒเบฅเบงเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบฒเบงเป‚เบซเบผเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ–เป‰เบฒเบ‚เบฐเบซเบ™เบฒเบ”เบซเบ™เป‰เบฒเบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเป€เบเบตเบ™เป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒเบ”เบปเบ™เป€เบเบตเบ™เป„เบ›เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ serializing เบ•เบปเบงเบขเปˆเบฒเบ‡. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบญเบฒเบ”เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒเปƒเบ™เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบญเบทเปˆเบ™เป†เบ—เบตเปˆเบกเบฒเบฎเบญเบ”เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต 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 เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เป‚เบ—เบ„เบฑเป‰เบ‡เบชเบธเบ”เบ—เป‰เบฒเบ, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™ replication เบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒ.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบญเบญเบเบˆเบฒเบเบเบฒเบ™เบญเบญเบเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบœเปˆเบฒเบ™ 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 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 เป„เบ›เบซเบฒเบ—เบตเปˆเบขเบนเปˆ url เปเบฅเบฐเบชเบปเปˆเบ‡เบกเบฑเบ™ row_ver เป€เบ›เบฑเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš deserialized เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป.

เบŸเบฑเบ‡เบŠเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบ—เบถเบเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ™เบตเป‰:

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) เป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เปเบœเปˆเบ™.

เบชเบธเบ”เบ—เป‰เบฒเบ, เบŸเบฑเบ‡เบŠเบฑเบ™ synchronization เบŠเปˆเบญเบ‡เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™ 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 เบˆเบฒเบเปเบ–เบงเบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป‚เบซเบฅเบ”.

เป€เบžเบทเปˆเบญโ€‹เบ›เป‰เบญเบ‡โ€‹เบเบฑเบ™โ€‹เบเบฒเบ™โ€‹เบญเบธโ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เป€เบซเบ” looping (เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ‚เบญเบ‡โ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เปƒเบ™โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹) เป„เบ”เป‰โ€‹, loopโ€‹ while เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™เป‚เบ”เบ for:

for _ = 1, max_req do ...

เป€เบ›เบฑเบ™เบœเบปเบ™เบกเบฒเบˆเบฒเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆ sync_goods เบŠเปˆเบญเบ‡ goods เป€เบ„เบทเปˆเบญเบ‡เบฎเบฑเบšเบˆเบฐเบกเบตเบฅเบธเป‰เบ™เบซเบผเป‰เบฒเบชเบธเบ”เบ‚เบญเบ‡เบšเบฑเบ™เบ—เบถเบเบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบฑเบ‡เปเบปเบ” goods เปƒเบ™เปเบซเบผเปˆเบ‡.

เปเบ™เปˆเบ™เบญเบ™, เบเบฒเบ™เบฅเบถเบšเบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบญเบญเบเบญเบฒเบเบฒเบ”เบ”เป‰เบงเบเบงเบดเบ—เบตเบ™เบตเป‰. เบ–เป‰เบฒเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบกเบต, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบซเบกเบฒเบเบเบฒเบ™เบฅเบถเบš. เป€เบžเบตเปˆเบกเปƒเบชเปˆเบžเบทเป‰เบ™เบ—เบตเปˆ goods เบŠเปˆเบญเบ‡ boolean is_deleted เปเบฅเบฐเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบฅเบถเบšเบšเบฑเบ™เบ—เบถเบเบ—เบฒเบ‡เบฎเปˆเบฒเบ‡เบเบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบเบฒเบ™เบฅเบถเบšเบขเปˆเบฒเบ‡เบกเบตเป€เบซเบ”เบœเบปเบ™ - เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เบ„เปˆเบฒเบžเบฒเบเบชเบฐเบซเบ™เบฒเบก is_deleted เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ„เบงเบฒเบกเบซเบกเบฒเบ true. เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก boolean is_deleted เบกเบฑเบ™เบชเบฐเบ”เบงเบเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก deleted, เป€เบŠเบดเปˆเบ‡เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบงเบฑเบ™เบ—เบต-เป€เบงเบฅเบฒเบ‚เบญเบ‡เบเบฒเบ™เบฅเบถเบšเบšเบฑเบ™เบ—เบถเบเบขเปˆเบฒเบ‡เบกเบตเป€เบซเบ”เบœเบปเบ™. เบซเบผเบฑเบ‡เบˆเบฒเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบฅเบถเบšเบขเปˆเบฒเบ‡เบกเบตเป€เบซเบ”เบœเบปเบ™, เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบซเบกเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบถเบšเบˆเบฐเบ–เบทเบเป‚เบญเบ™เบˆเบฒเบเปเบซเบผเปˆเบ‡เป„เบ›เบซเบฒเบˆเบธเบ”เบซเบกเบฒเบเบ›เบฒเบเบ—เบฒเบ‡ (เบญเบตเบ‡เบ•เบฒเบกเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเป„เบ”เป‰เบชเบปเบ™เบ—เบฐเบ™เบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡).

เบฅเปเบฒเบ”เบฑเบš row_ver เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบŠเปˆเบญเบ‡เบญเบทเปˆเบ™: เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบฅเปเบฒเบ”เบฑเบšเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบŠเปˆเบญเบ‡เบ—เบตเปˆเบชเบปเปˆเบ‡.

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ‚เบญเบ‡เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเปƒเบŠเป‰ Tarantool DBMS.

เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบš

  1. Tarantool DBMS เป€เบ›เบฑเบ™เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบ—เบตเปˆเปœเป‰เบฒเบชเบปเบ™เปƒเบˆ, เป‚เบ”เบ”เป€เบ”เบฑเปˆเบ™เปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเป‚เบซเบผเบ”เป„เบ”เป‰เบชเบนเบ‡.
  2. เบเบฒเบ™เบˆเบณเบฅเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบกเบตเบ‚เปเป‰เบ”เบตเบซเบผเบฒเบเบ”เป‰เบฒเบ™เบ•เปเปˆเบเบฑเบšเบเบฒเบ™เบˆเบณเบฅเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบฅเบฐเบ”เบฑเบšเบ•เปเปˆเบฒ.
  3. เบงเบดเบ—เบตเบเบฒเบ™ replication เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบ—เบตเปˆเบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบซเบผเบธเบ”เบœเปˆเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเป‚เบญเบ™เปƒเบซเป‰เบซเบ™เป‰เบญเบเบฅเบปเบ‡เป‚เบ”เบเบเบฒเบ™เป‚เบญเบ™เบžเบฝเบ‡เปเบ•เปˆเบšเบฑเบ™เบ—เบถเบเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบญเบ‡เบ›เบฐเบŠเบธเบกเปเบฅเบเบ›เปˆเบฝเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™