๐ 93K RPM์ผ๋ก ํ์ฅ: SQL์์ Redis๋ก ์ฟผํฐ ๊ด๋ฆฌ ์ด๋
Source: Dev.to
๋ฌด์จ ์ผ์ด ์์๋์?
๋น์ ์ด ์ข์ํ๋ ์ํฐ์คํธ๊ฐ ๊ณง ์ฝ์ํธ๋ฅผ ์ฐ๋ค๊ณ ๋ฐํํ๊ณ , ๊ณ ๊ฐ๋ค์ ํฐ์ผ์ ์ฌ๊ธฐ ์ํด ๋ชฐ๋ ค๋ค์์ต๋๋ค. ์ ์ ํฐ์ผํ ํ๋ซํผ์ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ธฐ ์์ํ๊ณ , ์๋๊ฐ ์ฌํ๊ฒ ๋๋ ค์ก์ต๋๋ค.
๊ทผ๋ณธ ์์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค CPU ์ฌ์ฉ๋์ด 100โฏ%๊น์ง ๊ธ๋ฑํ ๊ฒ์ด์์ต๋๋ค. ์ด๋ ์ด๋ฒคํธ์ ํ ๋น๋์ ๊ณ์ฐํ๋ ๋จ์ผ โํซโ ํ์ด ์ง์์ ์ผ๋ก ์กฐํ๋๊ณ ์ ๋ฐ์ดํธ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
| eventId | showtimeId | quota | reserved |
|---|---|---|---|
| 1 | 1 | 15,000 | 10,000 |
๊ฐ ์์ฒญ์ด ์ด ํ์ ์ฝ๊ณ ์ฐ๋ฉด์ ๋ฝ ๊ฒฝํฉ์ด ๋ฐ์ํ๊ณ CPU ์์์ด ๊ณ ๊ฐ๋์์ต๋๋ค.
ํด๊ฒฐ์ฑ
ํ ๋น๋ ์นด์ดํฐ๋ฅผ Redis๋ก ์ด๋
Redis๋ ๋ฐ์ดํฐ๋ฅผ RAM์ ์ ์ฅํ๋ฏ๋ก ๋์คํฌ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณด๋ค ํจ์ฌ ๋ฎ์ ์ง์ฐ ์๊ฐ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ์ฅ ๋จ์ํ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ์ ์์ต๋๋ค:
function reserveTicket(showtimeId, amount) {
const reserved = parseInt(redis.get('{key}'));
if (reserved {
// โฆorder creation logicโฆ
const result = await redis.eval(reserveLuaScript, {
keys: ['{key}'],
arguments: [String(amount), String(quota)],
});
if (result !== 1) {
throw error('reservation failed');
}
});
// โฆother logicโฆ
}
์นด์ดํธ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ค์ ์ ์ฅ
Redis๋ ์บ์์ด๋ฏ๋ก ๊ถ์ ์๋ ์ง์ค ์์ค๋ ์ฌ์ ํ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ต๋๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ปค๊ฐ Redis๋ฅผ 5์ด๋ง๋ค ํด๋งํ๊ณ ํ์ฌ ์นด์ดํธ๋ฅผ DB์ ๊ธฐ๋กํจ์ผ๋ก์จ ์ฑ๋ฅ์ ํฌ์ํ์ง ์์ผ๋ฉด์ ์ต์ข ์ผ๊ด์ฑ์ ์ ๊ณตํฉ๋๋ค.
๊ฒฐ๊ณผ
- ๋ถ๋น ์ฃผ๋ฌธ ์๊ฐ 5,000์์ 93,240์ผ๋ก ์ฆ๊ฐํ์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถํ๊ฐ ํฌ๊ฒ ๊ฐ์ํ์ฌ CPU ๋ณ๋ชฉ ํ์์ด ์ฌ๋ผ์ก์ต๋๋ค.
- ์์คํ ์ด ํผํฌ ํฐ์ผ ํ๋งค ํธ๋ํฝ์ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋์์ต๋๋ค.
์ฃผ์ ๊ตํ
- ์ฑ๋ฅ ๋ฌธ์ ์ ์ค์ ์์ธ์ ์ง๋จํ์ธ์; ์ฌ๊ธฐ์๋ ํซ ํ์ด DB ๋ฝ ๊ฒฝํฉ์ ์ผ์ผ์ผฐ์ต๋๋ค.
- ์ค์ ์ฌ์ฉ ํจํด์ ๋ง๊ฒ ์์คํ ์ค๊ณ๋ฅผ ์กฐ์ ํ์ธ์โ๊ณ ์ฒ๋ฆฌ๋ ์๋๋ฆฌ์ค์์๋ ํซ ํ์ ๋ณ๋๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
- ์นด์ดํฐ๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ ค๋ฉด ์์์ ์ธ Lua ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ Redis(๋๋ ๋ค๋ฅธ ์ธโ๋ฉ๋ชจ๋ฆฌ ์คํ ์ด)๋ฅผ ํ์ฉํ์ธ์.
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ค์ ์์ฒ์ผ๋ก ์ ์งํ๊ณ , ๋ด๊ตฌ์ฑ์ ์ํด ๋น๋๊ธฐ์ ์ผ๋ก ๋๊ธฐํํ์ธ์.