์๋
ํ์ธ์ DBMS์ฉ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๊ณ ์์ต๋๋ค.
ํ์ ๋๊ปด๋ผ! (โฆ์ผ๋ช
๊ณต์ฐ์ ์ฆ๊ธฐ์ธ์)
์์ ๋ชจ๋ ์ฌํญ ๋๋ถ์ Tarantool์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํจ๊ป ์๋ํ๋ ๊ณ ๋ถํ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํ๊ธฐ ์ํ ๋งค๋ ฅ์ ์ธ ํ๋ซํผ์ด ๋์์ต๋๋ค. ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ๋ฐ์ดํฐ ๋ณต์ ๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด Tarantool์๋ ๋ฐ์ดํฐ ๋ณต์ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ต๋๋ค. ์๋ ์๋ฆฌ๋ ๋ง์คํฐ ๋ก๊ทธ(WAL)์ ํฌํจ๋ ๋ชจ๋ ํธ๋์ญ์
์ ๋ณต์ ๋ณธ์์ ์์ฐจ์ ์ผ๋ก ์คํํ๋ ๊ฒ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ๋ณต์ (์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ถ๊ฐ๋ก ํธ์ถํฉ๋๋ค. ๋ฎ์ ์์ค์)์ ์ ํ๋ฆฌ์ผ์ด์
๋ด๊ฒฐํจ์ฑ์ ๋ณด์ฅํ๊ฑฐ๋ ํด๋ฌ์คํฐ ๋
ธ๋ ๊ฐ์ ์ฝ๊ธฐ ๋ก๋๋ฅผ ๋ถ์ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์. 1. ํด๋ฌ์คํฐ ๋ด ๋ณต์
๋์ฒด ์๋๋ฆฌ์ค์ ์๋ก๋ ์ฒ๋ฆฌ/๋ชจ๋ํฐ๋ง์ ์ํด ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์กํ๋ ๊ฒ์ ๋๋ค. ํ์์ ๊ฒฝ์ฐ์๋ ๋ค์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํธ๋ฆฌํ ์๋ฃจ์ ์ด ๋ ์ ์์ต๋๋ค. ๋์ ๋ ๋ฒจ ๋ณต์ - ์ ํ๋ฆฌ์ผ์ด์ ๋น์ฆ๋์ค ๋ก์ง ์์ค์ ๋ฐ์ดํฐ ๋ณต์ ์ ๋๋ค. ์ ๊ฒ๋ค. DBMS์ ๋ด์ฅ๋ ๊ธฐ์ฑ ์๋ฃจ์ ์ ์ฌ์ฉํ์ง ์๊ณ , ๊ฐ๋ฐ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์์ฒด์ ์ผ๋ก ๋ณต์ ๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์๋ ์ฅ์ ๊ณผ ๋จ์ ์ด ๋ชจ๋ ์์ต๋๋ค. ์ฅ์ ์ ๋์ดํด๋ณด์.
1. ํธ๋ํฝ ์ ๊ฐ:
- ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์๋ ์๊ณ ์ผ๋ถ๋ง ์ ์กํ ์ ์์ต๋๋ค(์๋ฅผ ๋ค์ด ํน์ ๊ธฐ์ค์ ์ถฉ์กฑํ๋ ์ผ๋ถ ํ ์ด๋ธ, ํด๋น ์ด ๋๋ ๋ ์ฝ๋ ์ค ์ผ๋ถ๋ง ์ ์กํ ์ ์์).
- ๋น๋๊ธฐ(ํ์ฌ ๋ฒ์ ์ Tarantool - 1.10์์ ๊ตฌํ) ๋๋ ๋๊ธฐ(ํฅํ ๋ฒ์ ์ Tarantool์์ ๊ตฌํ ์์ ) ๋ชจ๋์์ ์ง์์ ์ผ๋ก ์ํ๋๋ ํ์ ์์ค ๋ณต์ ์ ๋ฌ๋ฆฌ ์์ ์์ค ๋ณต์ ๋ ์ธ์ (์: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋จผ์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํฉ๋๋ค(๊ตํ ์ธ์ ๋ฐ์ดํฐ, ๊ทธ๋ฐ ๋ค์ ๋ณต์ ๊ฐ ์ผ์ ์ค์ง๋ ํ ๋ค์ ๊ตํ ์ธ์ ์ด ๋ฐ์ํ๋ ๋ฑ).
- ๋ ์ฝ๋๊ฐ ์ฌ๋ฌ ๋ฒ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์ต์ ๋ฒ์ ๋ง ์ ์กํ ์ ์์ต๋๋ค(๋ง์คํฐ์ ๋ํ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ณต์ ๋ณธ์์ ์์ฐจ์ ์ผ๋ก ์ฌ์๋๋ ํ์ ์์ค ๋ณต์ ์๋ ๋ค๋ฆ).
2. ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋๊ธฐํํ ์ ์๋ HTTP ๊ตํ์ ๊ตฌํํ๋ ๋ฐ ์ด๋ ค์์ด ์์ต๋๋ค.
์. 2. HTTP๋ฅผ ํตํ ๋ณต์
3. ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ ๋์ผํ ํ์๊ฐ ์์ต๋๋ค(๊ฒ๋ค๊ฐ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์๋ ์๋ก ๋ค๋ฅธ 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๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ด ๊ธฐ์ฌ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด์ ๋ํ ๋ด์ฉ์ ์ฌ๊ธฐ์์ ์ฝ์ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ/์ฌ๋ ์ด๋ธ ๋ถ๋ถ ๊ตฌํ
์์ ์ธก์ ๊ตฌํ์ด ์ด๋ป๊ฒ ๋ณด์ด๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ค์ด๋ก๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์์ ์ธก์ ๊ณต๊ฐ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
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๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋์ ์์ค์ ๋ฐ์ดํฐ ๋ณต์ ๋ฅผ ์ํํ๋ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์์ต๋๋ค.
์กฐ์ฌ ๊ฒฐ๊ณผ
- Tarantool DBMS๋ ๊ณ ๋ถํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๋ ๋ฐ ์์ด ๋งค๋ ฅ์ ์ด๊ณ ์ ๋งํ ์ ํ์ ๋๋ค.
- ๋์ ์์ค์ ๋ฐ์ดํฐ ๋ณต์ ๋ ๋ฎ์ ์์ค์ ๋ณต์ ์ ๋นํด ์ฌ๋ฌ ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค.
- ๊ธฐ์ฌ์์ ์ค๋ช ํ ๋์ ์์ค์ ๋ณต์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ง์ง๋ง ๊ตํ ์ธ์ ์ดํ ๋ณ๊ฒฝ๋ ๋ ์ฝ๋๋ง ์ ์กํ์ฌ ์ ์ก๋๋ ๋ฐ์ดํฐ์ ์์ ์ต์ํํ ์ ์์ต๋๋ค.
์ถ์ฒ : habr.com