Project/์‹นํ‹”์›€

[์‹นํ‹”์›€] 11/14 ๊ฐœ๋ฐœ์ผ์ง€ ์ฟ ํฐ ๋ฐœ๊ธ‰ ์‹œ ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ 2 : ๋น„๊ด€์  ๋ฝ, ๋ถ„์‚ฐ ๋ฝ ( Redisson ), Redis, Lua Script ์ ์šฉ ๋ฐ ์˜์‚ฌ๊ฒฐ์ •

ํ•œ33 2024. 11. 18. 16:11

๐Ÿ’ก ์ด์ „ ๊ธ€

https://hanstory33.tistory.com/262

 

[์‹นํ‹”์›€] 11/13 ๊ฐœ๋ฐœ์ผ์ง€ ์ฟ ํฐ ๋ฐœ๊ธ‰ ์‹œ ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ 1 : ๋™์‹œ์„ฑ ๋ฌธ์ œ ๋ฐœ์ƒ ๋ฐ ๋‚™๊ด€์ , ๋น„๊ด€์ ,

๐Ÿ’ก ๋ชฉํ‘œ์ฟ ํฐ 300 ๊ฐœ๋ฅผ ์œ ์ € 1000 ๋ช…์ด 5์ดˆ๋™์•ˆ ๋ฐœ๊ธ‰์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ, ์ค‘๋ณต๋œ ์ฟ ํฐ์ด ๋ฐœ๊ธ‰๋œ๋‹ค๋“ ์ง€, ์ˆ˜๋Ÿ‰ 300 ๊ฐœ๋ฅผ ๋„˜์–ด์„œ์„œ ๋ฐœ๊ธ‰์ด ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ

hanstory33.tistory.com

 

๐Ÿ’ก ๋ชฉํ‘œ

๋น„๊ด€์  ๋ฝ๊ณผ ๋ถ„์‚ฐ ์บ์‹œ ์‹œ์Šคํ…œ์ธ Redisson ์„ ์ด์šฉํ•œ ๋ถ„์‚ฐ๋ฝ์„ ๊ฑธ์–ด ๊ธฐ์กด์— ๋ฝ์„ ๊ฑธ์ง€ ์•Š์•˜๋˜ ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•ด Test ๋ฅผ ์ง„ํ–‰.

 

+ python script ๋ฅผ ํ™œ์šฉํ•ด ์ด ๋ฐœ๊ธ‰๋œ ์ฟ ํฐ ์ˆ˜์™€ ์ค‘๋ณต๋œ ์ฟ ํฐ ์ฝ”๋“œ๋ฅผ ํ™•์ธ

 

๐Ÿ“ Test : DB ๋‚™๊ด€์  ๋ฝ ( Skip )

๋งค ๋ฐœ๊ธ‰ ๋งˆ๋‹ค ์ฟ ํฐ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ์ง€๊ธˆ ์ƒํ™ฉ์—์„œ๋Š” ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ๋งค ๋ฒˆ ์žฌ์‹œ๋„๋ฅผ ํ•ด์•ผํ•˜๋Š” ๋‚™๊ด€์  ๋ฝ์€ ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ

 

๐Ÿ“ Test : DB ๋น„๊ด€์  ๋ฝ

- ๊ฐ•๋ ฅํ•œ ๋ฝ์„ ๊ฑธ๊ธฐ ์œ„ํ•ด์„œ ์„ฑ๋Šฅ์ƒ ์†ํ•ด๋ฅผ ๋ณด๋”๋ผ๋„ ๋น„๊ด€์  ๋ฝ์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ง„ํ–‰

  • Number of Threads (users) : 1000
  • Ramp-up period (seconds) : 5
  • Loop Count : 1
  • ๋ฐœ๊ธ‰ํ•œ ์œ ํšจ ์ฟ ํฐ ์ˆ˜ : 300
  • ์‹ค์ œ ์ฟ ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์€ ์œ ์ € ์ˆ˜ : 300
@Lock(LockModeType.PESSIMISTIC_WRITE)

 

300 ๊ฐœ์˜ ์ฟ ํฐ์ด ๋ฐœ๊ธ‰๋œ ๊ฒƒ์œผ๋กœ ๋ณด์•„ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

ํ‰๊ท  ์‘๋‹ต ์†๋„ 1609 ms ๊ฐ€ ๋‚˜์™”๊ณ ,  ์ดˆ๋‹น ์ฒ˜๋ฆฌ์ˆ˜์€ 174.7 ๊ฑด์œผ๋กœ ์•ˆ์ •์ ์ธ ๊ฐ’์ด ๋‚˜์™”๋‹ค.

 

๐Ÿ“š ๊ฒฐ๋ก 

๊ธฐ์กด์— ๋ฝ์„ ๊ฑธ๊ธฐ ์ „์— ํ‰๊ท  ์‘๋‹ต ์†๋„๊ฐ€ 171 ms ์˜€๋˜ ๊ฒƒ์— ๋น„ํ•ด ํ‰๊ท  ์‘๋‹ต์†๋„๊ฐ€ 1609 ms ์„ฑ๋Šฅ์ ์œผ๋กœ ์•ฝ 841% ๊ฐ์†Œ๋์ง€๋งŒ, ๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” ํ™•์‹คํ•˜๊ฒŒ ํ•ด๊ฒฐ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๐Ÿ“ Test : ๋ถ„์‚ฐ ๋ฝ - Redisson

- ๊ธฐ์กด CouponService ํŠธ๋žœ์žญ์…˜์„ CouponLockService ๋กœ Rapping ํ•ด์„œ Redisson ์„ ํ™œ์šฉํ•ด ๋ฝ์„ ๋งŒ๋“ค๊ณ  ํ•ด์ œํ–ˆ๋‹ค.

- ๋™์‹œ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฝ ํš๋“ ์‹œ๋„ ์‹œ๊ฐ„๊ณผ ๋ฝ ์œ ์ง€ ์‹œ๊ฐ„์„ ์ง€์ •ํ•ด์คฌ๋‹ค.

- ์‹œ๊ฐ„์„ ์ง€์ •ํ•˜๋‹ค๋ณด๋‹ˆ ์„ฑ๋Šฅ์ ์œผ๋กœ ์–ด๋Š ์ •๋„ ์†ํ•ด๋ฅผ ๋ณผ ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค.

- ๋‚ด ์ปดํ“จํ„ฐ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์„ ๋•Œ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„ ์„ค์ •์ด์—ˆ๋‹ค. 

// ๋ฝ ํš๋“ ์‹œ๋„ ์‹œ๊ฐ„ 2์ดˆ, ๋ฝ ์œ ์ง€ ์‹œ๊ฐ„ 3์ดˆ
boolean isLocked = lock.tryLock(2, 3, TimeUnit.SECONDS);

 

  • Number of Threads (users) : 1000
  • Ramp-up period (seconds) : 5
  • Loop Count : 1
  • ๋ฐœ๊ธ‰ํ•œ ์œ ํšจ ์ฟ ํฐ ์ˆ˜ : 300
  • ์‹ค์ œ ์ฟ ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์€ ์œ ์ € ์ˆ˜ : 300

๐Ÿ“š ๊ฒฐ๋ก 

Redisson ์„ ํ™œ์šฉํ•ด ๋ถ„์‚ฐ ๋ฝ์„ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์•˜๋Š”๋ฐ, ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฝ ํš๋“ ์‹œ๋„ ์‹œ๊ฐ„๊ณผ ๋ฝ ์œ ์ง€ ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ปดํ“จํ„ฐ ์„ฑ๋Šฅ ์ด์Šˆ๋กœ ๊ณผํ•˜๊ฒŒ ์„ค์ •์ด ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

๊ทธ ๋•Œ๋ฌธ์— ํ‰๊ท  ์‘๋‹ต์†๋„๊ฐ€ 2870 ms ๋ผ๋Š” ๋‹ค์†Œ ์•„์‰ฌ์šด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค.

Redis ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ๊ณ  ๋ฐ›์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น ๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์ดํ›„ ์ถ”๊ฐ€๋กœ ์ด ๊ณผ์ •์„ ๋” ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค.


๐Ÿ“ Test : Redis ์ ์šฉ (๋ฝX)

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

  • Number of Threads (users) : 1000
  • Ramp-up period (seconds) : 5 / 10 / 15 / 20
  • Loop Count : 1
  • ๋ฐœ๊ธ‰ํ•œ ์œ ํšจ ์ฟ ํฐ ์ˆ˜ : 300
  • ์‹ค์ œ ์ฟ ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์€ ์œ ์ € ์ˆ˜ : 440 / 400 / 320 / 305

๊ธฐ์กด๊ณผ ๋™์ผํ•˜๊ฒŒ 1000 ๋ช…์˜ ์œ ์ €๊ฐ€ 5์ดˆ ๋™์•ˆ ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ํ•˜๋‹ˆ๊นŒ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ์‹ฌํ•˜๊ฒŒ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

์›์ธ ๋ถ„์„ : ์›์ž์„ฑ ๋ณด์žฅ ๋ถ€์กฑ

Redis๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช…๋ น์–ด๊ฐ€ ์›์ž์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€๋งŒ, ๋ณต์žกํ•œ ํŠธ๋žœ์žญ์…˜์ด๋‚˜ ๋‹ค์ˆ˜์˜ ๋ช…๋ น์–ด๊ฐ€ ๊ฒฐํ•ฉ๋œ ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋Š” ์›์ž์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

  • ์ฟ ํฐ์˜ ์ž‰์—ฌ ์ˆ˜๋Ÿ‰์„ ํ™•์ธ.
  • ์ˆ˜๋Ÿ‰์ด ๋‚จ์•„์žˆ์œผ๋ฉด ์ฟ ํฐ์„ ๋ฐœ๊ธ‰.
  • ๋ฐœ๊ธ‰๋œ ์ฟ ํฐ ์ˆ˜๋Ÿ‰์„ ์—…๋ฐ์ดํŠธ

ํ˜„์žฌ ์œ„์™€ ๊ฐ™์€ ๋กœ์ง์œผ๋กœ ์ค‘๋ณต ๋ฐœ๊ธ‰์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋‹ค์‹œํ”ผ 1000๋ช…์˜ ์œ ์ €๊ฐ€ 20 ์ดˆ ๋™์•ˆ 300๊ฐœ์˜ ์ฟ ํฐ๋ฐœ๊ธ‰์„ ์‹œ๋„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ ๋ถ€ํ„ฐ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๊ฑฐ์˜ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

๐Ÿ“š ๊ฒฐ๋ก 

redis ๋ฅผ ํ™œ์šฉํ•ด ํ‰๊ท  ์‘๋‹ต์†๋„๊ฐ€ 8ms ๋กœ ๋Œ€ํญ ์ƒ์Šนํ–ˆ๋‹ค.

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


๐Ÿ“ Test : Lua Script ์ ์šฉ

- Redis ์˜ Lua Script ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๋ช…๋ น์„ ํ•˜๋‚˜์˜ ์›์ž์  ์ž‘์—…์œผ๋กœ ๋ฌถ์–ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฟ ํฐ ๋ฐœ๊ธ‰ ๋ฉ”์„œ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋“ค์„ Lua Script ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

- Lua Script ๋ฅผ ์‚ฌ์šฉํ•ด Redis ์˜ ์„ฑ๋Šฅ์ ์ธ ์ด์ ๊ณผ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ๋‘˜ ๋‹ค ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ์˜ˆ์ƒ๋˜์–ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

 

  • Number of Threads (users) : 1000
  • Ramp-up period (seconds) : 5
  • Loop Count : 1
  • ๋ฐœ๊ธ‰ํ•œ ์œ ํšจ ์ฟ ํฐ ์ˆ˜ : 300
  • ์‹ค์ œ ์ฟ ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์€ ์œ ์ € ์ˆ˜ : 300

๋‹จ์ผ ์ฟ ํฐ ๋ฐœ๊ธ‰ ์š”์ฒญ ํ…Œ์ŠคํŠธ 13 ms
ํ‰๊ท  ์‘๋‹ต์†๋„ 16 ms
๋ฐœ๊ธ‰๋œ ์ฟ ํฐ์ด 300๊ฐœ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” redis insight

๐Ÿ“š ๊ฒฐ๋ก 

Redis์˜ Lua ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•œ ๊ฒฐ๊ณผ, ํ‰๊ท  ์‘๋‹ต ์†๋„๊ฐ€ 16ms์— ๋„๋‹ฌํ•˜์—ฌ, Redis์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์—์„œ ํ™•์ธ๋œ ์„ฑ๋Šฅ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ๋†’์€ ํผํฌ๋จผ์Šค๋ฅผ ์œ ์ง€ํ–ˆ๋‹ค.

์ด๋Š” ๋‹จ์ˆœํžˆ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๊ทธ์น˜์ง€ ์•Š๊ณ , ๋™์‹œ์„ฑ ๋ฌธ์ œ๊นŒ์ง€ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค.

Redis Lua ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•ด ํšจ์œจ์ ์ธ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ์ œ๊ณตํ•  ๋ฟ ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ์š”์ฒญ์ด ๋ชฐ๋ฆด ๋•Œ๋„ ์•ˆ์ •์ ์ธ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋™์‹œ์„ฑ ๊ด€๋ฆฌ๋ฅผ ๊ฐ•ํ™”ํ–ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด Redis๋Š” ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์—์„œ๋„ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ, ํŠนํžˆ ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ํ™•์‹คํ•œ ์‹ ๋ขฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.


๐Ÿ’ก ์ตœ์ข… ์˜์‚ฌ ๊ฒฐ์ •

  • ๊ทธ๋ž˜ํ”„๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐํ•œ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ DB ๋น„๊ด€์  ๋ฝ, Redisson์„ ํ™œ์šฉํ•œ ๋ถ„์‚ฐ ๋ฝ, ๊ทธ๋ฆฌ๊ณ  Lua Script ํ™œ์šฉ์ด๋‹ค.
  • ์ด ์ค‘์—์„œ Lua Script๋ฅผ ํ™œ์šฉํ•œ ๋ฐฉ์‹์ด ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ๋„ ๊ฐ€์žฅ ๋น ๋ฅธ ์‘๋‹ต ์†๋„๋ฅผ ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์ด์ƒ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ค์ œ๋กœ, ๋น„๊ด€์  ๋ฝ ๋ฐฉ์‹์—์„œ 1609ms์˜ ์‘๋‹ต ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์—ˆ๋˜ ๊ฒƒ์— ๋น„ํ•ด,  Lua Script๋ฅผ ํ™œ์šฉํ•œ ํ›„์—๋Š” 16ms๋กœ ์„ฑ๋Šฅ์ด ๋Œ€ํญ ํ–ฅ์ƒ๋˜์—ˆ๋‹ค.