ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐ŸŽฏ Redis Concurrency Control

Race Condition

๊ฒฝ์Ÿ์ƒํƒœ๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๊ณ , ๋™์‹œ์— ๋ณ€๊ฒฝ์„ ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

  • Race Condition ์œผ๋กœ ๋™์‹œ์— ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋“ค์ด ๊ฐฑ์‹  ์ „ ๊ฐ’์„ ์ฝ๊ณ , ์ˆ˜์ •ํ•˜๋ฉด์„œ
  • ์‹ค์ œ ๊ฐฑ์‹ ์ด ๋ˆ„๋ฝ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒ

Series

Java Concurrency Control

Database Concurrency Control

Redis Concurrency Control

Kafka Concurrency Control

Compare Concurrency Control

๐Ÿน 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) ๊ด‘๊ณ  ํด๋ฆญ ์ˆ˜, ์ข‹์•„์š” ์ˆ˜, ํŽ˜์ด์ง€ ๋ทฐ ์ˆ˜ ๋“ฑ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์นด์šดํŒ…ํ•˜์—ฌ ์ถ”์ 
  • ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ์ค‘์•™ ์ง‘์ค‘์‹ ์นด์šดํŒ… โ†’ ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค์—์„œ ๊ณตํ†ต ์นด์šดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ๊ฒฝ์šฐ

.

redis incr example

.

๐Ÿ› ๏ธ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ.

  • ํ•œ์ • ์ˆ˜๋Ÿ‰: 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์œผ๋กœ ์กฐํšŒ๋˜์–ด, ์žฌ๊ณ  ๋ถ€์กฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

Result

๐Ÿน 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) ์ด๋ฉ”์ผ ๋ฐœ์†ก, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋“ฑ์—์„œ ์‚ฌ์šฉ

.

redis lettuce lock example

.

๐Ÿ› ๏ธ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ.

  • ํ•œ์ • ์ˆ˜๋Ÿ‰: 50,000
  • User: 296
  • Processes: 8
  • Threads: 37
  • Duration: 3 min

๋™์‹œ์— ๋งŽ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฝ ํš๋“ ๋Œ€๊ธฐ ์ƒํƒœ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฝ ํš๋“ ํ™•์ธ์„ ํ•˜๋‹ค ๋ณด๋‹ˆ

CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๋Š˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์•˜๋‹ค.

๋™์ผํ•œ ์กฐ๊ฑด์œผ๋กœ 31,380 ๊ฑด๋ฐ–์— ์ฒ˜๋ฆฌ๋ฅผ ๋ชป ํ•˜์˜€๋‹ค.

๊ทธ๋ž˜๋„ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ์€ ํ•ด์•ผ ํ•˜๋‹ˆ ํ•œ์ • ์ˆ˜๋Ÿ‰์„ 10,000 ์œผ๋กœ ์ค„์—ฌ์„œ ํ™•์ธ์„ ๋”ฐ๋กœ ํ•ด๋ณด์•˜๋Š”๋ฐ ๋ฌธ์ œ๋Š” ์—†์—ˆ๋‹ค.

Result

๐Ÿน 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์„ ํ™œ์šฉ

์ฐธ๊ณ .

.

redis redisson lock example

.

๐Ÿ› ๏ธ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ.

  • ํ•œ์ • ์ˆ˜๋Ÿ‰: 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 ์œผ๋กœ ์ค„์—ฌ์„œ ํ™•์ธ์„ ๋”ฐ๋กœ ํ•ด๋ณด์•˜๋Š”๋ฐ ๋ฌธ์ œ๋Š” ์—†์—ˆ๋‹ค.

Result

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
๋งํฌ
Total
Today
Yesterday