Tarantool Data Grid์˜ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋Šฅ

Tarantool Data Grid์˜ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋Šฅ

2017๋…„์—๋Š” Alfa-Bank ํˆฌ์ž์‚ฌ์—…์˜ ๊ฑฐ๋ž˜ํ•ต์‹ฌ ๊ฐœ๋ฐœ ๊ณต๋ชจ์ „์—์„œ ์šฐ์Šนํ•˜์—ฌ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค. (HighLoad++ 2018์—์„œ ํˆฌ์ž์‚ฌ์—…์˜ ํ•ต์‹ฌ์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ ๋ฐœํ‘œ) ์ˆ˜ํ–‰ ํ•œ Alfa Bank ํˆฌ์ž ์‚ฌ์—…์˜ ๊ฑฐ๋ž˜ ํ•ต์‹ฌ ์ฑ…์ž„์ž์ธ Vladimir Drynkin์ž…๋‹ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ์€ ๋‹ค์–‘ํ•œ ํ˜•์‹์˜ ๋‹ค์–‘ํ•œ ์†Œ์Šค์—์„œ ๊ฑฐ๋ž˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘๊ณ„ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต์ผ๋œ ํ˜•์‹์œผ๋กœ ๊ฐ€์ ธ์™€ ์ €์žฅํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์‹œ์Šคํ…œ์€ ๋ฐœ์ „ํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ํš๋“ํ–ˆ์œผ๋ฉฐ ์–ด๋Š ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ์—„๊ฒฉํ•˜๊ฒŒ ์ •์˜๋œ ์ž‘์—… ๋ฒ”์œ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์†Œํ”„ํŠธ์›จ์–ด ์ด์ƒ์˜ ๊ฒƒ์„ ๊ฒฐ์ •ํ™”ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ฐ–์ถ˜ ๋ถ„์‚ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ. ์šฐ๋ฆฌ๊ฐ€ ์–ป์€ ๊ฒฝํ—˜์€ ์ƒˆ๋กœ์šด ์ œํ’ˆ์˜ ๊ธฐ์ดˆ๋ฅผ ํ˜•์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. Tarantool ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ (TDG).

์ €๋Š” TDG ์•„ํ‚คํ…์ฒ˜์™€ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฐพ์•„๋‚ธ ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ , ์ฃผ์š” ๊ธฐ๋Šฅ์„ ์†Œ๊ฐœํ•˜๊ณ , ์šฐ๋ฆฌ ์ œํ’ˆ์ด ์–ด๋–ป๊ฒŒ ์™„์ „ํ•œ ์†”๋ฃจ์…˜ ๊ตฌ์ถ•์˜ ๊ธฐ์ดˆ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์„ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค. ์—ญํ• , ๊ฐ๊ฐ์€ ํŠน์ • ๋ฒ”์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์ธ ๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์—ญํ•  ์œ ํ˜•์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ๋™์ผํ•œ ์œ ํ˜•์˜ ์—ฌ๋Ÿฌ ์—ญํ• ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tarantool Data Grid์˜ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋Šฅ

์ปค๋„ฅํ„ฐ

์ปค๋„ฅํ„ฐ๋Š” ์™ธ๋ถ€ ์„ธ๊ณ„์™€์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ž„๋ฌด๋Š” ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ ๋‹ค์Œ, ์ด๊ฒƒ์ด ์„ฑ๊ณตํ•˜๋ฉด ์ฒ˜๋ฆฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ ํ”„๋กœ์„ธ์„œ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” HTTP, SOAP, Kafka, FIX ํ˜•์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด IBM MQ์— ๋Œ€ํ•œ ์ง€์›์ด ๊ณง ์ œ๊ณต๋  ์˜ˆ์ •์ด๋ฏ€๋กœ ์ƒˆ๋กœ์šด ํ˜•์‹์— ๋Œ€ํ•œ ์ง€์›์„ ๊ฐ„๋‹จํžˆ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ๊ตฌ๋ฌธ ๋ถ„์„์— ์‹คํŒจํ•˜๋ฉด ์ปค๋„ฅํ„ฐ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๊ณ  ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์š”์ฒญ์„ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฑฐ๋‚˜ ๋ฐ˜๋Œ€๋กœ ๋„ˆ๋ฌด ์ง€์†์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ์Šคํ…œ๊ณผ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณต๊ตฌ ๋Œ€๊ธฐ์—ด์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋Š” ๋จผ์ € ๊ฐœ์ฒด์— ๋“ค์–ด๊ฐ€๊ณ  ์„ฑ๊ณต์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐœ์ฒด์—์„œ ์ œ๊ฑฐ๋œ ํ›„์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๋Š” ์ˆ˜๋ฆฌ ๋Œ€๊ธฐ์—ด์— ๋‚จ์•„ ์žˆ๋Š” ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์†Œํ”„ํŠธ์›จ์–ด ์˜ค๋ฅ˜๋‚˜ ํ•˜๋“œ์›จ์–ด ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž…๋ ฅ ํ”„๋กœ์„ธ์„œ

์ž…๋ ฅ ํ”„๋กœ์„ธ์„œ๋Š” ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์ ์ ˆํ•œ ํ”„๋กœ์„ธ์„œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ๋Š” ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ์‹คํ–‰๋˜๋Š” Lua ์ฝ”๋“œ์ด๋ฏ€๋กœ ์‹œ์Šคํ…œ ๊ธฐ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”ํ•œ ํ˜•์‹์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ๋…ผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์˜์˜ ์ˆ˜์˜ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Tarantool Data Grid๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ MDM(๋งˆ์Šคํ„ฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ) ์ œํ’ˆ์—์„œ๋Š” ์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์š”์ฒญ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๊ณจ๋“  ๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ์„ ๋ณ„๋„์˜ ์ž‘์—…์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ƒŒ๋“œ๋ฐ•์Šค๋Š” ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ, ๋ณ€๊ฒฝ ๋ฐ ์ถ”๊ฐ€์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ง€์›ํ•˜๊ณ , ์ €์žฅ์†Œ ์œ ํ˜•์˜ ๋ชจ๋“  ์—ญํ• ๊ณผ ๊ฒฐ๊ณผ ์ง‘๊ณ„(๋งต/๊ฐ์†Œ)์— ๋Œ€ํ•ด ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

ํ•ธ๋“ค๋Ÿฌ๋Š” ํŒŒ์ผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sum.lua

local x, y = unpack(...)
return x + y

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ตฌ์„ฑ์—์„œ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

functions:
  sum: { __file: sum.lua }

์™œ ๋ฃจ์•„์ธ๊ฐ€? Lua๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์‚ฌ๋žŒ๋“ค์€ ๋ฌธ์ œ๋ฅผ ์•Œ๊ฒŒ ๋œ ์ง€ ๋ช‡ ์‹œ๊ฐ„ ํ›„์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ์ „๋ฌธ ๊ฐœ๋ฐœ์ž๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ถ„์„๊ฐ€์ž…๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ jit ์ปดํŒŒ์ผ๋Ÿฌ ๋•๋ถ„์— Lua๋Š” ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์Šคํ† ๋ฆฌ์ง€

์Šคํ† ๋ฆฌ์ง€๋Š” ์˜๊ตฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํšŒ๋กœ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ํ™•์žฅ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•„ํŒŒ์น˜ ์•„๋ธŒ๋กœ. ์˜ˆ:

{
    "name": "User",
    "type": "record",
    "logicalType": "Aggregate",
    "fields": [ 
        { "name": "id", "type": "string"}, 
        {"name": "first_name", "type": "string"}, 
        {"name": "last_name", "type": "string"} 
    ], 
    "indexes": ["id"] 
}

์ด๋Ÿฌํ•œ ์„ค๋ช…์„ ๋ฐ”ํƒ•์œผ๋กœ Tarantula DBMS์— ๋Œ€ํ•œ DDL(Data Definition Language)์ด ์ž๋™ ์ƒ์„ฑ๋˜๋ฉฐ, GraphQL ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•œ ์Šคํ‚ค๋งˆ.

๋น„๋™๊ธฐ์‹ ๋ฐ์ดํ„ฐ ๋ณต์ œ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค(๋™๊ธฐ์‹ ์ถ”๊ฐ€ ๊ณ„ํš ์žˆ์Œ).

์ถœ๋ ฅ ํ”„๋กœ์„ธ์„œ

๋•Œ๋กœ๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์˜ ๋„์ฐฉ์„ ์™ธ๋ถ€ ์†Œ๋น„์ž์—๊ฒŒ ์•Œ๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด ์ถœ๋ ฅ ํ”„๋กœ์„ธ์„œ ์—ญํ• ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ํ›„ ํ•ด๋‹น ํ•ธ๋“ค๋Ÿฌ์— ์ „๋‹ฌ(์˜ˆ: ์†Œ๋น„์ž๊ฐ€ ์š”๊ตฌํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ)ํ•œ ๋‹ค์Œ ์ „์†ก์„ ์œ„ํ•ด ์ปค๋„ฅํ„ฐ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ์ˆ˜๋ฆฌ ๋Œ€๊ธฐ์—ด๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๊ฐœ์ฒด๋ฅผ ์ˆ˜๋ฝํ•˜์ง€ ์•Š์œผ๋ฉด ๊ด€๋ฆฌ์ž๋Š” ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค์ผ€์ผ๋ง

์ปค๋„ฅํ„ฐ, ์ž…๋ ฅ ํ”„๋กœ์„ธ์„œ ๋ฐ ์ถœ๋ ฅ ํ”„๋กœ์„ธ์„œ ์—ญํ• ์€ ์ƒํƒœ ๋น„์ €์žฅ์ด๋ฏ€๋กœ ์›ํ•˜๋Š” ์—ญํ•  ์œ ํ˜•์ด ํ™œ์„ฑํ™”๋œ ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์‹œ์Šคํ…œ์„ ์ˆ˜ํ‰์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ์ง€๋Š” ์ˆ˜ํ‰ ํ™•์žฅ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผ ๊ฐ€์ƒ ๋ฒ„ํ‚ท์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„์—๋Š” ์ด์ „ ์„œ๋ฒ„์˜ ๋ฒ„ํ‚ท ์ค‘ ์ผ๋ถ€๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ƒˆ ์„œ๋ฒ„๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋ฉฐ ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์ž‘๋™์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์†์„ฑ

๊ฐœ์ฒด๋Š” ๋งค์šฐ ํด ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ๊ฐœ์ฒด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๊ฐ€์ƒ ๋ฒ„ํ‚ท์— ๋ชจ๋“  ์ข…์†์„ฑ์ด ํฌํ•จ๋œ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๋ฐ ์—…๋ฐ์ดํŠธ์˜ ์›์ž์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐœ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ๋ฌผ๋ฆฌ์  ์„œ๋ฒ„์— "ํ™•์‚ฐ"๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ ๋ฒ„์ „์ด ์ƒ์„ฑ๋˜๋ฉฐ, ์–ธ์ œ๋“ ์ง€ ์‹œ๊ฐ„ ์กฐ๊ฐ์„ ๊ฐ€์ ธ์™€ ๋‹น์‹œ ์„ธ์ƒ์ด ์–ด๋–ป๊ฒŒ ๋ณด์˜€๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธด ๊ธฐ๋ก์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ ๋ฒ„์ „ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๊ฑฐ๋‚˜ ์ตœ์‹  ๋ฒ„์ „๋งŒ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŠน์ • ์œ ํ˜•์— ๋Œ€ํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ๋ก์„ ์‹œ๊ฐ„๋ณ„๋กœ ์ œํ•œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 1๋…„์ด ๋„˜์€ ํŠน์ • ์œ ํ˜•์˜ ๋ชจ๋“  ๊ฐœ์ฒด๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋ณด๊ด€๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ์‹œ๊ฐ„๋ณด๋‹ค ์˜ค๋ž˜๋œ ๊ฐœ์ฒด๋ฅผ ์–ธ๋กœ๋“œํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…

ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ ์ค‘์—๋Š” ์ผ์ •์— ๋”ฐ๋ผ, ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๋˜๋Š” ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Tarantool Data Grid์˜ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋Šฅ

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

๋กœ๊ฑฐ

๋˜ ๋‹ค๋ฅธ ์—ญํ• ์€ ๋กœ๊ฑฐ(logger)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๊ตฌ์„ฑ์›์œผ๋กœ๋ถ€ํ„ฐ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์›น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค

์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์„œ๋น„์Šค ์ƒ์„ฑ์ด ์‰ฌ์›Œ์ง„๋‹ค๋Š” ์ ์€ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ์‚ฌ์šฉ์ž ์ž‘์„ฑ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ „์†ก๋˜๋Š” ์š”์ฒญ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ์ฒ˜๋ฆฌ๊ธฐ์—์„œ๋Š” ์ผ์ข…์˜ ๋ถ„์„ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

services:
   sum:
      doc: "adds two numbers"
      function: sum
      return_type: int
      args:
         x: int
         y: int

GraphQL API๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

query {
   sum(x: 1, y: 2) 
}

๊ทธ๋Ÿฌ๋ฉด ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. sum๊ทธ๋Ÿฌ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

3

์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ์ธก์ •ํ•ญ๋ชฉ

์‹œ์Šคํ…œ ์ž‘๋™ ๋ฐ ์š”์ฒญ ํ”„๋กœํŒŒ์ผ๋ง์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด OpenTracing ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ ํ•„์š”์— ๋”ฐ๋ผ ์ด ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ(์˜ˆ: Zipkin)์— ์ •๋ณด๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tarantool Data Grid์˜ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋Šฅ

๋‹น์—ฐํžˆ ์‹œ์Šคํ…œ์€ Prometheus๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ง‘ํ•˜๊ณ  Grafana๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ์ธก์ •ํ•ญ๋ชฉ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํฌ

Tarantool Data Grid๋Š” ๋ฐฐํฌ ๋˜๋Š” Ansible์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RPM ํŒจํ‚ค์ง€ ๋˜๋Š” ์•„์นด์ด๋ธŒ์—์„œ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Kubernetes(Tarantool Kubernetes ์šด์˜์ž).

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(๊ตฌ์„ฑ, ํ•ธ๋“ค๋Ÿฌ)์„ ๊ตฌํ˜„ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ UI๋ฅผ ํ†ตํ•ด ๋˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„์นด์ด๋ธŒ ํ˜•ํƒœ๋กœ ๋ฐฐํฌ๋œ Tarantool Data Grid ํด๋Ÿฌ์Šคํ„ฐ์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

Tarantool Data Grid๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์ž‘์—…์€ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์ฒ˜๋ฆฌ, ์ €์žฅ ๋ฐ ์•ก์„ธ์Šค์™€ ์–ด๋Š ์ •๋„ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•˜๊ณ  ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹น์‚ฌ ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋งŽ์ด ์ ˆ์•ฝํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๋Š” ๋ถ€๋™์‚ฐ ์‹œ์žฅ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ๋ฏธ๋ž˜์— ์ตœ๊ณ ์˜ ์ œ์•ˆ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์Œ ์ž‘์—…์„ ๊ฐ•์กฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์˜คํ”ˆ ์†Œ์Šค์—์„œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋กœ๋ด‡์ด ์šฐ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์„ฑ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์–ด๋–ค ์–ธ์–ด๋กœ๋“  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋‹ค์Œ์œผ๋กœ Tarantool Data Grid๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜๋ฝํ•˜๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์†Œ์Šค์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ Lua์—์„œ ๋‹จ์ผ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „ ์ฒ˜๋ฆฌ ๋‹จ๊ณ„์—์„œ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์ค‘๋ณต ์ œ์•ˆ์„ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‹œ์žฅ์—์„œ ์ผํ•˜๋Š” ์—์ด์ „ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ด์ œ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์šฐ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ํ•˜๋ฃจ์— ๊ฐ€์žฅ ์œ ๋ฆฌํ•œ ์ œ์•ˆ์„ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๋ช‡ ์ค„๊ณผ ์•ฝ๊ฐ„์˜ Lua ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ญ์ง€?

์šฐ๋ฆฌ์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์˜ ์šฉ์ด์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Tarantool ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Š” ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋””๋ฒ„๊น…์„ ์ง€์›ํ•˜๋Š” IDE์ž…๋‹ˆ๋‹ค.

์•ˆ์ „ ๋ฌธ์ œ์—๋„ ๋งŽ์€ ๊ด€์‹ฌ์„ ๊ธฐ์šธ์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‹น์‚ฌ๋Š” ๊ฐœ์ธ์ •๋ณด์‹œ์Šคํ…œ ๋ฐ ์ •๋ถ€์ •๋ณด์‹œ์Šคํ…œ์— ์‚ฌ์šฉ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์ œํ’ˆ์— ๋Œ€ํ•œ ๋†’์€ ๋ณด์•ˆ ์ˆ˜์ค€์„ ํ™•์ธํ•˜๊ณ  ์ธ์ฆ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฌ์‹œ์•„ FSTEC์œผ๋กœ๋ถ€ํ„ฐ ์ธ์ฆ์„ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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