ํฐ์คํ ๋ฆฌ ๋ทฐ
[๋์์ฑ] Redis Concurrency Control(incr, Lettuce, Redisson Lock)
Aaron 2024. 8. 18. 22:44๐ฏ Redis Concurrency Control
Race Condition
๊ฒฝ์์ํ๋ ๋ ๊ฐ ์ด์์ ์ค๋ ๋๊ฐ ๊ณต์ ๋ฐ์ดํฐ์ ์ก์ธ์ค ํ ์ ์๊ณ , ๋์์ ๋ณ๊ฒฝ์ ํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ ๋ฌธ์
- Race Condition ์ผ๋ก ๋์์ ๋ค์ด์ค๋ ์์ฒญ๋ค์ด ๊ฐฑ์ ์ ๊ฐ์ ์ฝ๊ณ , ์์ ํ๋ฉด์
- ์ค์ ๊ฐฑ์ ์ด ๋๋ฝ๋๋ ํ์์ด ๋ฐ์
Series
๐น Redis incr
Redis์
INCR
๋ช ๋ น์ ์ด์ฉํ์ฌ ํน์ ํค์ ๊ฐ์ ์์์ ์ผ๋ก ์ฆ๊ฐ์ํค๋ฉด์
์นด์ดํฐ๋ ์๊ณ๊ฐ ์ ์ด ๋ฑ์ ์์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
์ ์.
- Redis๋ ๋น ๋ฅธ ์๋์
์ฑ๊ธ ์ค๋ ๋
์ ํน์ฑ์ ํ์ฉํ์ฌ๋ ์ด์ค ์ปจ๋์
์ ํด๊ฒฐ - ๋น ๋ฅธ ์ฑ๋ฅ์ ๊ฐ์ง
INCR
๋ช ๋ น(ํค์ ๋ํ ๊ฐ์ 1์ฉ ์ฆ๊ฐ์ํค๋ ๋ช ๋ น์ด)์ ์ด์ฉํ์ฌ ์๊ณ๊ฐ์ ์ ์ด
๋์ ๋ฐฉ์.
INCR key
โ ์ฃผ์ด์งkey
์ ๊ฐ์ 1 ์ฆ๊ฐ- ํค๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ, ๋จผ์ ํด๋น ํค๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ ํ 1 ์ฆ๊ฐ
์ฅ์ .
์์์ ์ฐ์ฐ
INCR
๋ช ๋ น์ด๋ Redis์ ์ฑ๊ธ ์ค๋ ๋ ๊ตฌ์กฐ ๋๋ถ์ ์์์ ์ผ๋ก ์ํ- ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ๋์์
INCR
๋ช ๋ น์ด๋ฅผ ์คํํด๋ ์ค๋ณต๋๊ฑฐ๋ ์๋ชป๋ ๊ฐ์ด ์ ์ฅ๋์ง ์์
๊ฐ๋จํ๊ณ ๋น ๋ฆ
INCR
๋ช ๋ น์ด๋ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, Redis์ ๋น ๋ฅธ ์ฑ๋ฅ ๋๋ถ์ ์ค์๊ฐ ์นด์ดํ ์์ ์ ๋งค์ฐ ์ ๋ฆฌ
๋ถ์ฐ ํ๊ฒฝ์์ ์ฌ์ฉ ๊ฐ๋ฅ
- Redis๋ ๋ถ์ฐ ํ๊ฒฝ์์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ์๋ฒ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค์์ ์ค์ ์ง์ค์ ์นด์ดํ ์ ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
์๋ ์ด๊ธฐํ
- ํค๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ,
INCR
๋ช ๋ น์ด๋ ์๋์ผ๋ก ํค๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๊ณ ์ฆ๊ฐ(์ด๊ธฐํ ์์ ์ด ๋ถํ์)
- ํค๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ,
๋จ์ .
๋ฐ์ดํฐ ์ ์ค ๊ฐ๋ฅ์ฑ
- Redis๋ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ ์ฅ์์ด๋ฏ๋ก ์ง์์ฑ ์ต์ ์ ์ค์ ํ์ง ์์ผ๋ฉด Redis ์๋ฒ๊ฐ ์ฌ์์๋๊ฑฐ๋ ์ฅ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์ ์ค ๊ฐ๋ฅ์ฑ ์กด์ฌ
- ์นด์ดํฐ ๊ฐ์ด ์ค์ํ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ์ ์ค์ ๋๋นํ ์ถ๊ฐ์ ์ธ ์กฐ์น๊ฐ ํ์
์ ์ด๋ ์๊ณ๊ฐ ๊ด๋ฆฌ์ ์ด๋ ค์
- ํน์ ์๊ณ๊ฐ์ ๋์์ ๋ ์ด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด์๋ ์ถ๊ฐ์ ์ธ ๋ก์ง์ด ํ์
ํธ๋์ญ์ ๋ฐ ๋ณต์กํ ๋ก์ง ๊ตฌํ์ ์ด๋ ค์
- ๋ณต์กํ ํธ๋์ญ์
์ ๋ค๋ฃจ๊ฑฐ๋ ์ฌ๋ฌ ๋จ๊ณ์ ์ฐ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ,
INCR
๋ง์ผ๋ก๋ ์ ์ดํ๊ธฐ ์ด๋ ค์
- ๋ณต์กํ ํธ๋์ญ์
์ ๋ค๋ฃจ๊ฑฐ๋ ์ฌ๋ฌ ๋จ๊ณ์ ์ฐ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ,
์ฌ๋ก.
- API Rate Limiting โ API ์์ฒญ์ ํ์ ์ ํ
- ๋์์ฑ ์ ์ด โ ํน์ ๋ฆฌ์์ค๋ ์์ ์ ๋ํด ๋์์ ์ ๊ทผํ ์ ์๋ ํด๋ผ์ด์ธํธ์ ์ ์ ํ
- ์ด๋ฒคํธ ์นด์ดํ
โ ํน์ ์ด๋ฒคํธ ๋ฐ์ ํ์๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ธฐ๋กํด์ผ ํ ๊ฒฝ์ฐ
- ex) ๊ด๊ณ ํด๋ฆญ ์, ์ข์์ ์, ํ์ด์ง ๋ทฐ ์ ๋ฑ์ ์ค์๊ฐ์ผ๋ก ์นด์ดํ ํ์ฌ ์ถ์
- ๋ถ์ฐ ํ๊ฒฝ์์์ ์ค์ ์ง์ค์ ์นด์ดํ โ ์ฌ๋ฌ ์๋ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค์์ ๊ณตํต ์นด์ดํฐ๋ฅผ ์ ์งํ ๊ฒฝ์ฐ
.
.
๐ ๏ธ ์ฑ๋ฅ ํ ์คํธ.
- ํ์ ์๋: 50,000
- User: 296
- Processes: 8
- Threads: 37
- Duration: 3 min (01:40 ์ค๋จ)
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ ํํ๊ฒ 50,000 ๊ฑด๋ง ์ฑ๊ณต์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
Redis key ๋ 82,720 ์ธ๋ฐ 50,000(Successful) + 32,720(Errors) = 82,720 ๋ก ์ ํํ๊ฒ ์ ์ฅ๋์๋ค.
00:36 ์ดํ์๋ ๋ชจ๋ ์๋์ด 0์ผ๋ก ์กฐํ๋์ด, ์ฌ๊ณ ๋ถ์กฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
๐น Redis Lettuce Lock
Redis์ ๋ช ๋ น์ด์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ฝ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
์ฃผ๋กSET
๋ช ๋ น์ด์ TTL(Time-To-Live)์ ์ฌ์ฉํ์ฌ ํน์ ๋ฆฌ์์ค์ ๋ํ ์ ๊ธ์ ๊ด๋ฆฌ
์ ์.
- Lettuce๋ฅผ ์ฌ์ฉํด Redis์์ ๋ถ์ฐ ๋ฝ(Distributed Lock)์ ๊ตฌํ ๊ฐ๋ฅ
- MySQL์ Named Lock๊ณผ ์ ์ฌํ ๋ฐฉ์
setnx
(set if not exist) ๋ช ๋ น์ด๋ฅผ ํ์ฉํ์ฌ ๋ถ์ฐ๋ฝ ๊ตฌํSpin Lock
๋ฐฉ์- ๋ฝ์ ํ๋ํ๋ ค๋ ์ค๋ ๋๊ฐ ๋ฝ์ ์ฌ์ฉํ ์ ์๋์ง ๋ฐ๋ณต์ ์ผ๋ก ํ์ธํ๋ฉด์ ๋ฝ ํ๋์ ์๋ํ๋ ๋ฐฉ์
- ์ฌ์๋ ๋ก์ง ๊ฐ๋ฐ ํ์
๋์ ๋ฐฉ์.
- ๋ฝ ํ๋
- ํน์ ํค๋ฅผ ์์ฑํ๊ณ
SET
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ด ํค์ ๊ฐ๊ณผ TTL์ ์ค์ - ์ด๋
NX
(Key๊ฐ ์กด์ฌํ์ง ์์ ๋๋ง ์ค์ ) ์ต์ ๊ณผEX
(ํค์ ๋ง๋ฃ ์๊ฐ์ ์ด ๋จ์๋ก ์ค์ ) ์ต์ ์ ํจ๊ป ์ฌ์ฉ - ๋ฝ์ ์ฑ๊ณต์ ์ผ๋ก ํ๋ํ๋ฉด
OK
๋ฅผ ๋ฐํํ๊ณ , ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ๋ฝ์ ํ๋ ์คํจ
- ํน์ ํค๋ฅผ ์์ฑํ๊ณ
- ๋ฝ ํด์
- ์์ ์ด ์๋ฃ๋๋ฉด ๋ฝ์ ํด์ ํ๊ธฐ ์ํด ํด๋น ํค๋ฅผ ์ญ์
- ์ด ๊ณผ์ ์์ ํค๊ฐ ์ค์ ๋ก ์ ๊ธ์ ํ๋ํ ํ๋ก์ธ์ค์ ์ํด ์ญ์ ๋๋์ง ํ์ธํ๋ ๋ก์ง์ด ํ์ํ ์ ์์
- ์๋ ํด์
- TTL์ ์ค์ ํด ๋๋ฉด ์ง์ ๋ ์๊ฐ์ด ์ง๋๋ฉด ๋ฝ์ด ์๋์ผ๋ก ํด์
- ํ๋ก์ธ์ค๊ฐ ์๊ธฐ์น ์๊ฒ ์ข ๋ฃ๋๋ ์ํฉ์์๋ ์์คํ ์ด ๋ฌดํ์ ๋๊ธฐํ๋ ๊ฒ์ ๋ฐฉ์ง
์ฅ์ .
๊ฐ๋จํ ๊ตฌํ
- Redis์ ๊ธฐ๋ณธ ๋ช ๋ น์ด๋ง์ผ๋ก ๊ฐ๋จํ๊ฒ ๋ถ์ฐ ๋ฝ์ ๊ตฌํ ๊ฐ๋ฅ
- ๋ณต์กํ ์ค์ ์ด๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด๋ ํจ์จ์ ์ธ ๋ฝ ๋ฉ์ปค๋์ฆ์ ๊ตฌ์ถ
- (spring data redis ์ฌ์ฉ ์ ๊ธฐ๋ณธ์ ์ผ๋ก Lettuce ์ ์ฉ)
๋น๋๊ธฐ ์ฒ๋ฆฌ
- ๋น๋๊ธฐ ๋ฐ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ์ง์
- ๋์ ์ฑ๋ฅ๊ณผ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์๊ตฌ๋๋ ์์คํ ์์ ํจ์จ์ ์ผ๋ก ์๋
TTL์ ํตํ ์๋ ํด์
- TTL ์ค์ ์ ํตํด ์ ๊ธ์ ์๋์ผ๋ก ํด์
- ์๊ธฐ์น ์์ ์ค๋ฅ๋ ํ๋ก์ธ์ค ์ข ๋ฃ๋ก ์ธํ ์ ๊ธ ํด์ ๋ฅผ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์
ํ์ฅ์ฑ
- Lettuce Lock์ Redis๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์, ๋ถ์ฐ ์์คํ ์์ ์์ฝ๊ฒ ํ์ฅ ๊ฐ๋ฅ
- ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ๋์ผํ Redis ์๋ฒ๋ฅผ ํตํด ๋ฝ์ ๊ณต์ ๊ฐ๋ฅ
๋จ์ .
Spin Lock ๋ฐฉ์
- ๋์์ ๋ง์ ์ค๋ ๋๊ฐ ๋ฝ ํ๋ ๋๊ธฐ ์ํ๋ผ๋ฉด ๋ ๋์ค์ ๋ถํ๊ฐ ๊ฐ ์ ์์
- ๋ฝ ํ๋ ์ฌ์๋ ๊ฐ ๋๊ธฐ ์๊ฐ๋ ํ์
๋ถ์ฐ ๋ฝ์ ์ ๋ขฐ์ฑ ๋ฌธ์
- Redis๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ์ผ ๋ ธ๋์์ ์๋
- Redis ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋คํธ์ํฌ ๋ถํ (Partitioning)์ด ์ผ์ด๋๋ฉด ๋ฝ์ด ํด์ ๋์ง ์๊ฑฐ๋, ์๋ชป๋ ํ๋ก์ธ์ค์ ์ํด ๋ฝ์ด ํด์ ๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌ
๋ฝ ํด์ ๊ฒฝ์ ์กฐ๊ฑด
- ํ๋ก์ธ์ค๊ฐ ๋ฝ์ ํด์ ํ ๋, ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋์์ ๊ฐ์ ํค์ ๋ํด ๋ฝ์ ํ๋ํ๋ ค ํ ๊ฒฝ์ฐ Race Condition ๋ฐ์ ๊ฐ๋ฅ์ฑ ์กด์ฌ
- ๋ฐฉ์ง๋ฅผ ์ํด ๋ฝ ํด์ ์ ๊ณ ์ ํ ์๋ณ์๋ฅผ ํ์ธํ๋ ์ถ๊ฐ์ ์ธ ๋ก์ง์ด ํ์
TTL์ ํ๊ณ
- TTL์ด ์ง๋๋ฉด ์๋์ผ๋ก ๋ฝ์ด ํด์ ๋์ง๋ง, ์์ ์ด ์์๋ณด๋ค ์ค๋ ๊ฑธ๋ฆด ๊ฒฝ์ฐ ๋ฝ์ด ์ผ์ฐ ํด์ ๋ ์ํ์ด ์กด์ฌ
- ์ด๋ก ์ธํด ๋ ํ๋ก์ธ์ค๊ฐ ๋์์ ๊ฐ์ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ฒ ๋ ์ ์์
๋คํธ์ํฌ ์ง์ฐ ๋ฌธ์
- ๋ถ์ฐ ํ๊ฒฝ์์ ๋คํธ์ํฌ ์ง์ฐ์ผ๋ก ์ธํด ๋ฝ์ด ์์์ ์ ํ๊ฒ ํด์ ๋์ง ์๊ฑฐ๋, ๋ฐ๋๋ก ์ด๋ฏธ ํด์ ๋ ๋ฝ์ด ์์ง ํด์ ๋์ง ์์ ๊ฒ์ผ๋ก ์ธ์๋ ์ ์์ โ ์ ์ฌ์ ์ผ๋ก ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ฌธ์ ๋ฅผ ์ด๋
์ฌ๋ก.
- ๋ถ์ฐ ์์คํ
์์์ ๋ฆฌ์์ค ๋๊ธฐํ
- ์ฌ๋ฌ ์๋ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค์์ ๋์ผํ ๋ฆฌ์์ค(ex. ํ์ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ์ฝ๋)์ ์ ๊ทผํ ๋, Lettuce Lock์ ์ฌ์ฉํ์ฌ ๋์ ์ ๊ทผ์ ์ ์ด
- ์๋ฒ ๊ฐ ์์
์กฐ์
- ๋ถ์ฐ ํ๊ฒฝ์์ ์๋ฒ ๊ฐ์ ์์ ์ ์กฐ์ ํ๊ฑฐ๋ ํน์ ์์ ์ ๋จ์ผ ์๋ฒ์์๋ง ์ํ๋๋๋ก ๋ณด์ฅํ ๋ ์ ์ฉ
- ex) ๋ฐฐ์น ์์ ์ด๋ ํฌ๋ก ์์ ์ ์ค๋ณต ์คํ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ
- API Rate Limiting
- ํน์ ์ฌ์ฉ์๊ฐ ์ผ์ ๊ธฐ๊ฐ ๋ด์ API๋ฅผ ์ผ์ ํ์ ์ด์ ํธ์ถํ์ง ๋ชปํ๋๋ก ์ ํํ ๋, Redis์ TTL์ ํ์ฉํ Lettuce Lock ๋ฐฉ์์ผ๋ก Rate Limiting์ ๊ตฌํ
- ์ผํ์ฑ ์์
๋ณด์ฅ
- ํน์ ์ด๋ฒคํธ๋ ์์ ์ด ํ ๋ฒ๋ง ์คํ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ, Lettuce Lock์ ์ฌ์ฉํ์ฌ ๋์ผํ ์ด๋ฒคํธ๊ฐ ์ค๋ณต ์ฒ๋ฆฌ๋์ง ์๋๋ก ์ ํ
- ex) ์ด๋ฉ์ผ ๋ฐ์ก, ํธ๋์ญ์ ์ฒ๋ฆฌ ๋ฑ์์ ์ฌ์ฉ
.
.
๐ ๏ธ ์ฑ๋ฅ ํ ์คํธ.
- ํ์ ์๋: 50,000
- User: 296
- Processes: 8
- Threads: 37
- Duration: 3 min
๋์์ ๋ง์ ์ค๋ ๋๊ฐ ๋ฝ ํ๋ ๋๊ธฐ ์ํ์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฝ ํ๋ ํ์ธ์ ํ๋ค ๋ณด๋
CPU ์ฌ์ฉ๋์ด ๋๊ฒ ๋์๋์ง ์ฑ๋ฅ์ด ์ข์ง ์์๋ค.
๋์ผํ ์กฐ๊ฑด์ผ๋ก 31,380 ๊ฑด๋ฐ์ ์ฒ๋ฆฌ๋ฅผ ๋ชป ํ์๋ค.๊ทธ๋๋ ๋์์ฑ ์ฒ๋ฆฌ๊ฐ ์ ๋๊ณ ์๋์ง ํ์ธ์ ํด์ผ ํ๋ ํ์ ์๋์ 10,000 ์ผ๋ก ์ค์ฌ์ ํ์ธ์ ๋ฐ๋ก ํด๋ณด์๋๋ฐ ๋ฌธ์ ๋ ์์๋ค.
๐น Redis Redisson Lock
pub-sub
๊ธฐ๋ฐ์ผ๋ก Lock ๊ตฌํ ์ ๊ณต
์ ์.
- ์ฑ๋์ ๋ง๋ค๊ณ ๋ฝ์ ์ ์ ์ค์ธ ์ค๋ ๋๊ฐ ๋ฝ ํ๋์ ๋๊ธฐ ์ค์ธ ์ค๋ ๋์๊ฒ ๋ฝ ํด์ ๋ผ๋ ๋ฉ์์ง๋ฅผ ์ ์ก
- ๋ฉ์์ง๋ฅผ ์ ๋ฌ๋ฐ์ ์ค๋ ๋๊ฐ ๋ฝ ํ๋์ ์๋ํ๋ ๋ฐฉ์
- ๋ฝ ํ๋์ ์ํด ๋ฐ๋ณต์ ์ผ๋ก ๋ฝ ํ๋์ ์๋ํ๋ Lettuce ๋๋น ๋ถํ๋ฅผ ์ค์ผ ์ ์์
๋์ ๋ฐฉ์.
- ๋ฝ ํ๋
- ํด๋ผ์ด์ธํธ๊ฐ
lock()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, Redisson์ Redis์ ๋ฝ์ ์ค์ ํ๋ ๋ช ๋ น์ด๋ฅผ ์ ์ก - ์ด๋ ๋ฝ์ ๋ง๋ฃ ์๊ฐ(TTL)์ด ์ค์ ๋์ด, ์ค์ ๋ ์๊ฐ์ด ์ง๋๋ฉด ๋ฝ์ด ์๋์ผ๋ก ํด์
- ํด๋ผ์ด์ธํธ๊ฐ
- ๋ฝ ํด์
- ์์
์ด ์๋ฃ๋๋ฉด
unlock()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ฝ์ ํด์ - ์ด ๊ณผ์ ์์ ๋ฝ์ด ์ค์ ๋ก ํด๋น ํด๋ผ์ด์ธํธ์ ์ํด ์ค์ ๋ ๊ฒ์ธ์ง ํ์ธํ์ฌ, ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๊ฐ ์๋ชป๋ ๋ฝ ํด์ ๋ฅผ ํ์ง ์๋๋ก ๋ณดํธ
- ์์
์ด ์๋ฃ๋๋ฉด
- ์๋ ์ฐ์ฅ
- Redisson์ ๋ฝ์ด ์ค์ ๋ ๋์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ง๋ฃ ์๊ฐ์ ์ฐ์ฅํ๋ ๊ธฐ๋ฅ์ ์ ๊ณต
- ์์ ์ด ์์๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ์๋ ๋ฝ์ด ์ ์ง๋๋๋ก ์ง์
์ฅ์ .
pub-sub ๊ธฐ๋ฐ ๊ตฌํ
- Lettuce Lock ๋๋น ๋ ๋์ค์ ์ ์ ๋ถํ
- ๋ฝ ํ๋ ์ฌ์๋๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต
๊ณ ๊ฐ์ฉ์ฑ
- Redis ํด๋ฌ์คํฐ ํ๊ฒฝ์ ์ง์
- ๊ณ ๊ฐ์ฉ์ฑ์ ์ํด ์ฌ๋ฌ ๋ ธ๋์ ๋ถ์ฐ๋ Redis ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋จ์ผ ๋ ธ๋ ์ฅ์ ์์๋ ๋ฝ์ด ์์ ์ ์ผ๋ก ์ ์ง
์๋ ์ฐ์ฅ ๊ธฐ๋ฅ
- Watchdog ๊ธฐ๋ฅ์ ํตํด ๋ฝ์ ๋ง๋ฃ ์๊ฐ์ ์๋์ผ๋ก ์ฐ์ฅ
- ๊ธด ์์ ์ ์ํํ ๋ ๋ฝ์ด ์๋์น ์๊ฒ ํด์ ๋๋ ๊ฒ์ ๋ฐฉ์ง
๋ค์ํ ๋ฝ ์ ํ ์ง์
- ๊ธฐ๋ณธ์ ์ธ ๋ฝ๋ฟ๋ง ์๋๋ผ, ์ฌ์ง์ ๋ฝ(Reentrant Lock), ๊ณต์ ๋ฝ(Fair Lock), ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ฝ(ReadWrite Lock) ๋ฑ ๋ค์ํ ๋ฝ ์ ํ์ ์ง์
ํธ๋ฆฌํ API
- ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ API๋ฅผ ์ ๊ณตํ์ฌ, ๋ณต์กํ ๋ถ์ฐ ๋ฝ ๋ก์ง์ ์ฝ๊ฒ ๊ตฌํ
๋ถ์ฐ ๋ฝ ๊ด๋ฆฌ
- ๋ถ์ฐ ๋ฝ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ค์ํ ๋๊ตฌ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ, ๋ถ์ฐ ํ๊ฒฝ์์ ๋์์ฑ์ ํจ๊ณผ์ ์ผ๋ก ์ ์ด
๋จ์ .
๋ณต์ก์ฑ
- ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ค์ ๊ณผ ์ฌ์ฉ๋ฒ์ ๋ํ ๊น์ ์ดํด๊ฐ ํ์ + ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์
- ํนํ Redis ํด๋ฌ์คํฐ ํ๊ฒฝ์์์ ์ค์ ์ ๋ณต์ก
๋คํธ์ํฌ ์ง์ฐ ๋ฐ ์ฅ์
- ๋ถ์ฐ ๋ฝ์ ๋คํธ์ํฌ ์ง์ฐ์ด๋ Redis ๋ ธ๋ ์ฅ์ ๋ก ์ธํด ์ฑ๋ฅ ์ ํ ๋๋ ์ ๊ธ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์
- ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ต์ํํ๊ธฐ ์ํด ์ค๊ณ๋์์ง๋ง, ์์ ํ ๋ฐฉ์งํ ์๋ ์์
์ค๋ฒํค๋
- ์๋ ์ฐ์ฅ ๊ธฐ๋ฅ๊ณผ ๊ณ ๊ฐ์ฉ์ฑ ์ง์ ๊ธฐ๋ฅ์ ์ถ๊ฐ์ ์ธ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํฌ ์ ์์
- ๋งค์ฐ ๋์ ์ฑ๋ฅ์ด ์๊ตฌ๋๋ ์์คํ ์์๋ ์ฃผ์ ํ์
๋ฐ์ดํฐ ์ ์ค ๊ฐ๋ฅ์ฑ
- ๋ถ์ฐ ๋ฝ์ ์ ๋ณด๊ฐ Redis์ ์ฅ์ ๋ ์ฌ์์์ผ๋ก ์ธํด ์ ์ค๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌ
- ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ ์ง์์ฑ ์ค์ ์ด ํ์
์ฌ๋ก.
- ๋ถ์ฐ ํธ๋์ญ์
๊ด๋ฆฌ
- ๋ถ์ฐ ์์คํ ์์ ํธ๋์ญ์ ์ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ ๋ฐ ์ ์ฉ
- ex) ์ฌ๋ฌ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ๋ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ
- ๋์ ์์
์ ํ
- ์ฌ๋ฌ ์๋ฒ์์ ๋์์ ์คํ๋๋ ์์ ์ ์๋ฅผ ์ ํํด์ผ ํ ๋ ์ฌ์ฉ
- ex) ๋ถ์ฐ๋ ์น ์๋ฒ๊ฐ ๋์ผํ ํ์ผ์ ๋์์ ์์ ํ์ง ๋ชปํ๊ฒ ํ๊ฑฐ๋, ๋์ผํ ์ธ๋ถ API์ ๋ํ ๋์ ์์ฒญ ์๋ฅผ ์ ํํ๋ ๋ฐ ํ์ฉ
- ์ฌ์ง์
๋ฝ ํ์์
- ๋์ผํ ํด๋ผ์ด์ธํธ์์ ๋ฝ์ ์ฌ๋ฌ ๋ฒ ํ๋ํ๊ณ ํด์ ํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ, Redisson์ ์ฌ์ง์ ๋ฝ ๊ธฐ๋ฅ์ ํตํด ์ด ์์ ์ ์์ ํ๊ฒ ์ฒ๋ฆฌ
- ๋ณต์กํ ๋๊ธฐํ ๋ก์ง
- ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ฝ, ๊ณต์ ๋ฝ ๋ฑ ๋ณต์กํ ๋๊ธฐํ ์๊ตฌ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ ์๋๋ฆฌ์ค ๊ตฌํ ๊ฐ๋ฅ
์ค๋ฌด์์๋ ๋ณดํต
์ฌ์๋๊ฐ ํ์ํ์ง ์์ ๋ฝ์ Lettuce๋ฅผ ํ์ฉํ๊ณ ,
์ฌ์๋๊ฐ ํ์ํ ๊ฒฝ์ฐ Redisson์ ํ์ฉ
์ฐธ๊ณ .
- Redisson trylock() ๋ด๋ถ๋ก์ง ์ดํด๋ณด๊ธฐ
- ๋ ๋์ค๊ฐ ์ ๊ณตํ๋ ๋ถ์ฐ๋ฝ(RedLock)์ ํน์ง๊ณผ ํ๊ณ
.
.
๐ ๏ธ ์ฑ๋ฅ ํ ์คํธ.
- ํ์ ์๋: 50,000
- User: 296
- Processes: 8
- Threads: 37
- Duration: 3 min
Lettuce ์ Spin Lock ๋ฐฉ์ ๋ํ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํ ์ฐจ์ ์ฑ ์ผ๋ก Redisson ์ด ์ฌ์ฉ๋๋๋ฐ,
Redisson ์์๋ lua script์ ์ธ๋งํฌ์ด๊ฐ ์ฌ์ฉ๋ ๋ค๊ณค ํ๋ค.ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ง๋ง Redisson Lock ๋ฐฉ์๋ ์ฑ๋ฅ์ด ์ข์ง๋ง์ ์์๋ค.
๋์ผํ ์กฐ๊ฑด์ผ๋ก 28,816 ๊ฑด๋ฐ์ ์ฒ๋ฆฌ๋ฅผ ๋ชป ํ์๋ค. (Lettuce Lock ๋ณด๋ค ๋ ์ ์ข์ ์ฑ๋ฅ)๊ทธ๋๋ ๋์์ฑ ์ฒ๋ฆฌ๊ฐ ์ ๋๊ณ ์๋์ง ํ์ธ์ ํด์ผ ํ๋ ํ์ ์๋์ 10,000 ์ผ๋ก ์ค์ฌ์ ํ์ธ์ ๋ฐ๋ก ํด๋ณด์๋๋ฐ ๋ฌธ์ ๋ ์์๋ค.
'Web > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋์์ฑ] Java, Database, Redis, Kafka ๋ฐฉ์ ์ฑ๋ฅ ๋น๊ต (0) | 2024.08.25 |
---|---|
[๋์์ฑ] Kafka Concurrency Control(feat. Redis) (0) | 2024.08.20 |
[๋์์ฑ] DataBase Concurrency Controll(Pessimistic, Optimistic, Named Lock) (0) | 2024.08.17 |
[๋์์ฑ] Java Concurrency Control(asynchronous, synchronized) (2) | 2024.08.16 |
[Spring] Transaction Propagation (0) | 2024.07.12 |