Tarantool DBMS์˜ ๋†’์€ ์ˆ˜์ค€์˜ ๋ณต์ œ

์•ˆ๋…•ํ•˜์„ธ์š” DBMS์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€๋ž€ํˆด ๊ณ ์„ฑ๋Šฅ DBMS์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋ฅผ Lua ์–ธ์–ด๋กœ ๊ฒฐํ•ฉํ•œ Mail.ru Group์—์„œ ๊ฐœ๋ฐœํ•œ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. Tarantool ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์˜ ๋น ๋ฅธ ์†๋„๋Š” ํŠนํžˆ DBMS์˜ ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋“œ ์ง€์›๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋‹จ์ผ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์œผ๋กœ ์ธํ•ด ๋‹ฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ACID ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ง€์†์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค(WAL ๋กœ๊ทธ๊ฐ€ ๋””์Šคํฌ์— ์œ ์ง€๋จ). Tarantool์—๋Š” ๋ณต์ œ ๋ฐ ์ƒค๋”ฉ ์ง€์› ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „ 2.1๋ถ€ํ„ฐ SQL ์–ธ์–ด ์ฟผ๋ฆฌ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. Tarantool์€ ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ Simplified BSD ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ ๋ผ์ด์„ผ์Šค๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์ƒ์šฉ Enterprise ๋ฒ„์ „๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Tarantool DBMS์˜ ๋†’์€ ์ˆ˜์ค€์˜ ๋ณต์ œ
ํž˜์„ ๋Š๊ปด๋ผ! (โ€ฆ์ผ๋ช… ๊ณต์—ฐ์„ ์ฆ๊ธฐ์„ธ์š”)

์œ„์˜ ๋ชจ๋“  ์‚ฌํ•ญ ๋•๋ถ„์— 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. ์ด ์—ด์˜ ํ•„๋“œ ๊ฐ’์€ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ/์ˆ˜์ •๋  ๋•Œ๋งˆ๋‹ค ๊ณ„์† ์„ค์ •/์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ ํ•„๋“œ์—๋Š” ํ˜„์žฌ ๋‚ ์งœ-์‹œ๊ฐ„์ด ํ• ๋‹น๋˜์ง€ ์•Š๊ณ  ์ผ๋ถ€ ์นด์šดํ„ฐ์˜ ๊ฐ’์ด XNUMX์”ฉ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์นผ๋Ÿผ์€ row_ver ๊ณ ์œ ํ•œ ๊ฐ’์„ ํฌํ•จํ•˜๋ฉฐ "๋ธํƒ€" ๋ฐ์ดํ„ฐ(์ด์ „ ๊ตํ™˜ ์„ธ์…˜ ์ข…๋ฃŒ ์ดํ›„ ์ถ”๊ฐ€/๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ)๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ„๋‹จํ•˜๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ํŽ˜์ด์ง€๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์œ„ ์ˆ˜์ค€ ๋ณต์ œ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ ์–‘์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ง€๋ง‰์œผ๋กœ ์ œ์•ˆ๋œ ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ์ตœ์ ์ด๊ณ  ๋ณดํŽธ์ ์ธ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ–‰ ๋ฒ„์ „ ์นด์šดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

์„œ๋ฒ„/๋งˆ์Šคํ„ฐ ๋ถ€๋ถ„ ๊ตฌํ˜„

MS SQL Server์—๋Š” ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•˜๋Š” ํŠน๋ณ„ํ•œ ์—ด ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. rowversion. ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ด์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์— ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€/๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค XNUMX์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์นด์šดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. rowversion. ์ด ์นด์šดํ„ฐ์˜ ๊ฐ’์€ ์ถ”๊ฐ€/๋ณ€๊ฒฝ๋œ ๋ ˆ์ฝ”๋“œ์—์„œ ์ด ์—ด์˜ ํ•„๋“œ์— ์ž๋™์œผ๋กœ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. Tarantool DBMS์—๋Š” ์œ ์‚ฌํ•œ ๋‚ด์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Tarantool์—์„œ๋Š” ์ˆ˜๋™์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰๋˜๋Š”์ง€ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, ์•ฝ๊ฐ„์˜ ์šฉ์–ด์ž…๋‹ˆ๋‹ค. Tarantool์˜ ํ…Œ์ด๋ธ”์€ ๊ณต๋ฐฑ์ด๋ผ๊ณ  ํ•˜๋ฉฐ ๋ ˆ์ฝ”๋“œ๋Š” ํŠœํ”Œ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 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 ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธฐ์กด ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋„ XNUMX์”ฉ ์ฆ๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Tarantool์—๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๊ณต๊ฐ„ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. before_replace ะธ on_replace. ํŠธ๋ฆฌ๊ฑฐ๋Š” ๊ณต๊ฐ„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฐ ํŠœํ”Œ์— ๋Œ€ํ•ด ํŠธ๋ฆฌ๊ฑฐ ๊ธฐ๋Šฅ์ด ์‹œ์ž‘๋จ). ๊ฐ™์ง€ ์•Š์€ on_replace, before_replace-triggers๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์‹คํ–‰๋˜๋Š” ํŠœํ”Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰ ์œ ํ˜•์˜ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์šฐ๋ฆฌ์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

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

๋‹ค์Œ ํŠธ๋ฆฌ๊ฑฐ๋Š” ํ•„๋“œ ๊ฐ’์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. row_ver ์‹œํ€€์Šค์˜ ๋‹ค์Œ ๊ฐ’์— ํŠœํ”Œ์„ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. row_version.

์šฐ์ฃผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก goods ์—ด๋ณ„ row_ver, ์ƒ‰์ธ์„ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์ธ๋ฑ์Šค ์œ ํ˜• - ํŠธ๋ฆฌ(TREE), ์™œ๋ƒํ•˜๋ฉด ์—ด์— ์žˆ๋Š” ๊ฐ’์˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. row_ver.

๊ณต๊ฐ„์— ๋ช‡ ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

box.space.goods:insert{nil, 'pen', 123}
box.space.goods:insert{nil, 'pencil', 321}
box.space.goods:insert{nil, 'brush', 100}
box.space.goods:insert{nil, 'watercolour', 456}
box.space.goods:insert{nil, 'album', 101}
box.space.goods:insert{nil, 'notebook', 800}
box.space.goods:insert{nil, 'rubber', 531}
box.space.goods:insert{nil, 'ruler', 135}

์™œ๋ƒํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ํ•„๋“œ๋Š” ์ž๋™ ์ฆ๊ฐ€ ์นด์šดํ„ฐ์ด๋ฏ€๋กœ ๋Œ€์‹  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, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์–ธ๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Tarantool์˜ ๋ฐ์ดํ„ฐ ์ƒ˜ํ”Œ๋ง์€ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ get_goods ์ธ๋ฑ์Šค๋ณ„๋กœ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. row_ver ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž ์œ ํ˜•์€ GT(๋ณด๋‹ค ํผ, ๋ณด๋‹ค ํผ)์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ˜๋ณต์ž๊ฐ€ ์ „๋‹ฌ๋œ ํ‚ค(ํ•„๋“œ ๊ฐ’)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ธ๋ฑ์Šค ๊ฐ’์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆœํšŒํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. row_ver).

๋ฐ˜๋ณต์ž๋Š” ํŠœํ”Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„์— HTTP๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ํŠœํ”Œ์„ ํ›„์† ์ง๋ ฌํ™”์— ํŽธ๋ฆฌํ•œ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ์ด๋ฅผ ์œ„ํ•ด ํ‘œ์ค€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. tomap. ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  tomap ์ž์‹ ๋งŒ์˜ ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•„๋“œ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. name, ํ•„๋“œ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค code ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  comment:

local function unflatten_goods(tuple)
    local obj = {}
    obj.id = tuple.id
    obj.goods_name = tuple.name
    obj.comment = 'some comment'
    obj.row_ver = tuple.row_ver
    return obj
end

์ถœ๋ ฅ ๋ฐ์ดํ„ฐ์˜ ํŽ˜์ด์ง€ ํฌ๊ธฐ(ํ•œ ๋ถ€๋ถ„์˜ ๋ ˆ์ฝ”๋“œ ์ˆ˜)๋Š” ๋ณ€์ˆ˜์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. page_size. ์˜ˆ์—์„œ ๊ฐ’์€ page_size 5์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŽ˜์ด์ง€ ํฌ๊ธฐ๊ฐ€ ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต๊ฐ„ ํŠœํ”Œ์˜ ํ‰๊ท  ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ตœ์ ์˜ ํŽ˜์ด์ง€ ํฌ๊ธฐ๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜์—ฌ ๊ฒฝํ—˜์ ์œผ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ํฌ๊ธฐ๊ฐ€ ํด์ˆ˜๋ก ์†ก์‹ ์ธก๊ณผ ์ˆ˜์‹ ์ธก ๊ฐ„์˜ ์™•๋ณต ํšŸ์ˆ˜๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜๋Š” ์ „์ฒด ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŽ˜์ด์ง€ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด ์ƒ˜ํ”Œ์„ ์ง๋ ฌํ™”ํ•˜๋Š” ์„œ๋ฒ„์— ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋Š” ๋‹ค๋ฅธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ page_size ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์†ก๋œ ๊ฐ ๊ณต๊ฐ„์— ๋Œ€ํ•ด ๊ณ ์œ ํ•œ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ณต๊ฐ„์—์„œ๋Š” ๊ธฐ๋ณธ๊ฐ’(์˜ˆ: 100)์ด ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž get_goods:

tarantool> get_goods(0)

---
- - row_ver: 1
    code: 123
    name: pen
    id: 1
  - row_ver: 2
    code: 321
    name: pencil
    id: 2
  - row_ver: 3
    code: 100
    name: brush
    id: 3
  - row_ver: 4
    code: 456
    name: watercolour
    id: 4
  - row_ver: 5
    code: 101
    name: album
    id: 5
...

ํ•„๋“œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ž row_ver ๋งˆ์ง€๋ง‰ ์ค„๋ถ€ํ„ฐ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

tarantool> get_goods(5)

---
- - row_ver: 6
    code: 800
    name: notebook
    id: 6
  - row_ver: 7
    code: 531
    name: rubber
    id: 7
  - row_ver: 8
    code: 135
    name: ruler
    id: 8
...

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ํ•œ๋ฒˆ :

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

๋ณด์‹œ๋‹ค์‹œํ”ผ, ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๋Š” ๋ชจ๋“  ๊ณต๊ฐ„ ๋ ˆ์ฝ”๋“œ๋ฅผ ํŽ˜์ด์ง€๋ณ„๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. goods. ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ ๋’ค์—๋Š” ๋นˆ ์„ ํƒ ํ•ญ๋ชฉ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

๊ณต๊ฐ„์„ ๋ณ€๊ฒฝํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

ํ•„๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค name ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋ฐ˜๋ณตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

tarantool> get_goods(8)
---



- - row_ver: 9
    code: 800
    name: copybook
    id: 6
  - row_ver: 10
    code: 234
    name: clip
    id: 9
  - row_ver: 11
    code: 432
    name: folder
    id: 10
...

์ด ํ•จ์ˆ˜๋Š” ๋ณ€๊ฒฝ ๋ฐ ์ถ”๊ฐ€๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋Šฅ์€ get_goods ๊ณ ๋ ค ์ค‘์ธ ๋ณต์ œ ๋ฐฉ๋ฒ•์˜ ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ํ˜ธ์ถœ ์ดํ›„ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JSON ํ˜•์‹์œผ๋กœ HTTP๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์ด ๊ธฐ์‚ฌ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://habr.com/ru/company/mailru/blog/272141/

ํด๋ผ์ด์–ธํŠธ/์Šฌ๋ ˆ์ด๋ธŒ ๋ถ€๋ถ„ ๊ตฌํ˜„

์ˆ˜์‹  ์ธก์˜ ๊ตฌํ˜„์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์‹  ์ธก์— ๊ณต๊ฐ„์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

box.schema.space.create('goods', {
    format = {
        {
            name = 'id',
            type = 'unsigned'

        },
        {
            name = 'name',
            type = 'string'

        },
        {
            name = 'code',
            type = 'unsigned'

        }
    },
    if_not_exists = true
})

box.space.goods:create_index('primary', {
    parts = { 'id' },
    sequence = 'goods_id',
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

๊ณต๊ฐ„์˜ ๊ตฌ์กฐ๋Š” ์†Œ์Šค์˜ ๊ณต๊ฐ„ ๊ตฌ์กฐ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฏ€๋กœ ํ•ด๋‹น ์—ด์€ row_ver ์ˆ˜์‹ ์ž์˜ ๊ณต๊ฐ„์— ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฅ์—์„œ id ์†Œ์Šค ์‹๋ณ„์ž๊ฐ€ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ˆ˜์‹ ์ž ์ธก์—์„œ๋Š” ์ž๋™ ์ฆ๊ฐ€๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ๊ฐ€์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. row_ver:

box.schema.space.create('row_ver', {
    format = {
        {
            name = 'space_name',
            type = 'string'

        },
        {
            name = 'value',
            type = 'string'

        }
    },
    if_not_exists = true
})

box.space.row_ver:create_index('primary', {
    parts = { 'space_name' },
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

๋กœ๋“œ๋œ ๊ณต๊ฐ„๋งˆ๋‹ค(ํ•„๋“œ space_name) ์—ฌ๊ธฐ์— ๋งˆ์ง€๋ง‰์œผ๋กœ ๋กœ๋“œ๋œ ๊ฐ’์„ ์ €์žฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. row_ver (ํ•„๋“œ value). ์—ด์ด ๊ธฐ๋ณธ ํ‚ค ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. space_name.

๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. goods HTTP๋ฅผ ํ†ตํ•ด. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” HTTP ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค„์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๊ณ  HTTP ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค.

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

json ์—ญ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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) ๋””์Šคํฌ ์ž‘์—… ์ˆ˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋กœ์ปฌ ๊ณต๊ฐ„ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ 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. ๊ธฐ์‚ฌ์—์„œ ์„ค๋ช…ํ•œ ๋†’์€ ์ˆ˜์ค€์˜ ๋ณต์ œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ๊ตํ™˜ ์„ธ์…˜ ์ดํ›„ ๋ณ€๊ฒฝ๋œ ๋ ˆ์ฝ”๋“œ๋งŒ ์ „์†กํ•˜์—ฌ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€