[Concurrency Control] ๐Ÿ”’ ๋™์‹œ์„ฑ ์ œ์–ด ๊ธฐ๋ฒ• - Locking, MVCC, ๋ถ„์‚ฐ ์ž‘์—… ํ

๊น€์‹œ์›ยท2023๋…„ 5์›” 27์ผ
3

1. ๋™์‹œ์„ฑ ์ œ์–ด ์ •์˜

๋™์‹œ์„ฑ ์ œ์–ด(Concurrency Control)๋ž€,ย ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด ํŠธ๋žœ์žญ์…˜์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋ฉด์„œ๋„ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

2. ๋™์‹œ์„ฑ ์ œ์–ด ๋ชฉ์ 

  • ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ DB์— ์ ‘๊ทผํ•˜๋”๋ผ๋„ย ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€
  • ์œ„๋ฅผ ๋งŒ์กฑํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ
  1. ๋ถ„์‹ค๋œ ๊ฐฑ์‹ (Lost Update)
    • ๋‘๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ํ•˜๋‚˜์˜ ์ž‘์—…์ด ์ง„ํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
  2. ๋ชจ์ˆœ์„ฑ(Inconsistency)
    • ๋‘๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ๊ฐฑ์‹ ํ•˜๊ฒŒ๋˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ
  3. ์—ฐ์‡„๋ณต๊ท€(Cascading Rollback)
    • ๋‘๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ์‹คํŒจํ•˜๋ฉด ์›์ž์„ฑ์— ์˜ํ•ด ๋‘ ํŠธ๋žœ์žญ์…˜ ๋ชจ๋‘ ๋ณต๊ท€ํ•˜๋Š” ๊ฒฝ์šฐ
  4. ๋น„์™„๋ฃŒ ์˜์กด์„ฑ(Uncommitted Dependency)
    • ํ•œ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์ด ์‹คํŒจํ•˜์˜€์„๋•Œ, ์ด ํŠธ๋žœ์žฌ์…˜์ด ํšŒ๋ณตํ•˜๊ธฐ์ „์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์‹คํŒจํ•œ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ

3. ๋™์‹œ์„ฑ ์ œ์–ด ๋ฐฉ๋ฒ•

3-1. Locking

Locking์ด๋ž€?

  • Locking์€ ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ๋™์‹œ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” ์ „ํ†ต์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋˜๋Š” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค์—์„œ๋งŒ ๋™์ž‘ํ•˜๋ฉฐ, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ๊ณต์œ  ์ž์›์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ ๋ขฐ์„ฑ๊ณผ ์•ˆ์ „์„ฑ์ด ๋†’์œผ๋ฉฐ, ์–ด๋–ค ์ˆ˜์ค€์˜ locking์„ ์ ์šฉํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๊ต์ฐฉ ์ƒํƒœ๋‚˜ ๊ฒฝ์Ÿ ์กฐ๊ฑด๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ์ €ํ•˜๋  ์ˆ˜ ์žˆ๊ณ , ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ lock ์—ฐ์‚ฐ๊ณผ unlock ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•œ๋‹ค.

Locking์˜ ์ข…๋ฅ˜

  • ๊ณต์œ  ์ž ๊ธˆ (shared lock/s-lock): ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฝ
    • ๊ณต์œ ์ž ๊ธˆ์„ ์„ค์ •ํ•œ ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ฝ๊ธฐ ์—ฐ์‚ฐ(read)๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
      • T1์—์„œ x์— ๋Œ€ํ•ด S-lock์„ ์„ค์ •ํ–ˆ๋‹ค๋ฉด, T1์€ read(x) ์—ฐ์‚ฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ณต์œ ์ž ๊ธˆ์ด(S-lock) ๊ฐ€๋Šฅํ•˜๋‹ค.
      • T1์—์„œ x์— ๋Œ€ํ•ด S-lock์„ ์„ค์ •ํ•œ ๊ฒฝ์šฐ, ๋™์‹œ์— T2์—์„œ๋„ x์— ๋Œ€ํ•ด S-lock์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜๋„ ์ฝ๊ธฐ ์—ฐ์‚ฐ(read) ๋งŒ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • T1์—์„œ x์— ๋Œ€ํ•ด S-lock์„ ์„ค์ •ํ–ˆ๋‹ค๋ฉด, T2์—์„œ๋„ T1์ด S-lock(x)์„ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ read(x) ์—ฐ์‚ฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฐฐํƒ€ ์ž ๊ธˆ (exclusive lock/x-lock): ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฝ
    • ๋ฐฐํƒ€์ž ๊ธˆ์„ ์„ค์ •ํ•œ ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ ์ฝ๊ธฐ ์—ฐ์‚ฐ(read)๊ณผ ์“ฐ๊ธฐ ์—ฐ์‚ฐ(write) ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค.
      • T1์—์„œ x์— ๋Œ€ํ•ด S-lock์„ ์„ค์ •ํ–ˆ๋‹ค๋ฉด, T1์€ read(x) ์—ฐ์‚ฐ๊ณผ write(x) ์—ฐ์‚ฐ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‚˜์˜ ๋ฐฐํƒ€์ž ๊ธˆ(X-lock)๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐฐํƒ€์ž ๊ธˆ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
      • T1์—์„œ x์— ๋Œ€ํ•ด X-lock์„ ์„ค์ •ํ–ˆ๋‹ค๋ฉด, T1์—์„œ unlock(x)๋ฅผ ํ•˜๊ธฐ ์ „๊นŒ์ง€ T2์—์„œ x์— ๋Œ€ํ•ด X-lock์„ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค.
    • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ์ฝ๊ธฐ ์—ฐ์‚ฐ(read)์™€ ์“ฐ๊ธฐ ์—ฐ์‚ฐ(write) ๋ชจ๋‘ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
      • T1์—์„œ x์— ๋Œ€ํ•ด X-lock์„ ์„ค์ •ํ–ˆ๋‹ค๋ฉด, T2์—์„œ๋Š” T1์—์„œ unlock(x)๋ฅผ ํ•˜๊ธฐ ์ „๊นŒ์ง€ read(x), write(x) ์—ฐ์‚ฐ์ด ๋ชจ๋‘ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ถ”๊ฐ€) ๊ต์ฐฉ์ƒํƒœ (deadlock)
    • ๋ชจ๋“  transaction์ด ๋Œ€๊ธฐ ์ƒํƒœ์— ๋“ค์–ด๊ฐ€ ์•„๋ฌด๋Ÿฐ ์ง„ํ–‰์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ์ƒํƒœ๋ฅผ ๊ต์ฐฉ์ƒํƒœ๋ผ๊ณ  ํ•œ๋‹ค. ๊ต์ฐฉ์ƒํƒœ์— ๋น ์ง€๋ฉด ์™ธ๋ถ€์—์„œ ๊ฐ•์ œ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ค‘๋‹จํ•˜๊ฑฐ๋‚˜ ์ž ๊ธˆ์„ ํ•ด์ œํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ๋ฌดํ•œ์ • ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋‚จ๊ฒŒ ๋œ๋‹ค.

Locking์„ ํ™œ์šฉํ•œ ๋™์‹œ์„ฑ ์ œ์–ด ๊ธฐ๋ฒ•

  • ๋‚™๊ด€์  ๋ฝ (optimistic lock)
    • ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ๋˜๋Š” ๋™์‹œ์„ฑ ์ œ์–ด ๊ธฐ๋ฒ•์ด๋‹ค.
    • ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ์žฌ์‹œ๋„ ๋˜๋Š” ๋ณ‘ํ•ฉ์„ ํ†ตํ•ด ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ๋‹ค.
    • ์‹ค์ œ๋กœ lock์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  version์„ ์ด์šฉํ•จ์œผ๋กœ์„œ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถ”๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ lock์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์—…๋ฐ์ดํŠธ ์‹œ ๋‚ด๊ฐ€ ์ฝ์€ version์ด ๋งž๋Š”์ง€ ์ถฉ๋Œ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • ์ฆ‰, ์ž์›์— lock์„ ์ง์ ‘ ๊ฑธ์–ด์„œ ์„ ์ ํ•˜์ง€ ์•Š๊ณ , ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ๋•Œ๊ฐ€์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ๋น„๊ด€์  ๋ฝ (pessimistic lock)
    • ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ๋˜๋Š” ๋™์‹œ์„ฑ ์ œ์–ด ๊ธฐ๋ฒ•์ด๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— lock์„ ํš๋“ํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์•ก์„ธ์Šค๋ฅผ ์ฐจ๋‹จํ•˜๊ณ , lock์„ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ์ œ์–ดํ•œ๋‹ค.
    • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ฐฐํƒ€์ ์ธ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ณด์žฅํ•˜์—ฌ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
    • ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ์— lock์„ ๊ฑธ์–ด์„œ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถ”๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์ž์› ์š”์ฒญ์— ๋”ฐ๋ฅธ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•˜๊ณ  lock์„ ๊ฑธ์–ด๋ฒ„๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • ์ฆ‰, ํŠธ๋žœ์ ์…˜์ด ์‹œ์ž‘ํ•  ๋•Œ s-lock์ด๋‚˜ x-lock์„ ์‹ค์ œ๋กœ ๊ฑธ๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.
  • ๋‚™๊ด€์  ๋ฝ vs. ๋น„๊ด€์  ๋ฝ
๋‚™๊ด€์  ๋ฝ๋น„๊ด€์  ๋ฝ
์žฅ์ ํŠธ๋žœ์ ์…˜์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๊ณ , ๋ณ„๋„์˜ lock์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ์ ์œผ๋กœ ์ข‹๋‹ค.๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚œ๋‹ค๋ฉด rollback์˜ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ ์œผ๋กœ ์ข‹๋‹ค.
๋‹จ์ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋ฉด ๊ณ„์† rollback ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฉฐ, ์—…๋ฐ์ดํŠธ๊ฐ€ ์‹คํŒจํ–ˆ์„ ๋•Œ ์žฌ์‹œ๋„ ๋กœ์ง๋„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.๋ชจ๋“  ํŠธ๋žœ์ ์…˜์— lock์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, lock์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์ด๋”๋ผ๋„ ๋ฌด์กฐ๊ฑด lock์„ ๊ฑธ์–ด์„œ ์„ฑ๋Šฅ์ƒ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ read ์ž‘์—…์ด ๋งŽ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ๋‹จ์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ์„ ์ฐฉ์ˆœ ์ด๋ฒคํŠธ๊ฐ™์ด ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์ด ๋ชฐ๋ฆฌ๋Š” ์ƒํ™ฉ์ด๋‚˜ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์— lock์„ ๊ฑธ๋ฉด์„œ ์„œ๋กœ ์ž์›์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋Š” ๋น„๊ด€์  ๋ฝ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋ถ€๋ถ„์ด๋‹ค.
  • ๋ถ„์‚ฐ๋ฝ (distributed lock)
    • ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ๊ณต์œ ๋œ ์ž์›์— ๋Œ€ํ•œ ๋™์‹œ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
    • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ถ„์‚ฐ๋œ ์„œ๋ฒ„ ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•˜๋‹ค.
    • ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ๋ฉ”์‹œ์ง€ ํ ๋“ฑ์˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.
    • ๋Œ€ํ‘œ์ ์ธ ๋ถ„์‚ฐ๋ฝ ๊ธฐ๋ฒ•์œผ๋กœ๋Š” ZooKeeper, Redis ๋“ฑ์ด ์žˆ๋‹ค.
    • Redis๋Š” RedLock์ด๋ผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ์•ˆํ•˜๋ฉฐ 3๊ฐ€์ง€ ํŠน์„ฑ์„ ๋ณด์žฅํ•ด์•ผํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
      • ์˜ค์ง ํ•œ ์ˆœ๊ฐ„์— ํ•˜๋‚˜์˜ ์ž‘์—…์ž๋งŒ์ด ๋ฝ(lock) ์„ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค.
      • ๋ฝ ์ดํ›„, ์–ด๋– ํ•œ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฝ์„ ํ’€์ง€ ๋ชปํ•˜๊ณ , ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ๋ผ๋„ ๋‹ค๋ฅธ ์ž‘์—…์ž๊ฐ€ ๋ฝ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
      • Redis ๋…ธ๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋Š”ํ•œ, ๋ชจ๋“  ์ž‘์—…์ž๋Š” ๋ฝ์„ ๊ฑธ๊ณ  ํ•ด์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
    • ๋ถ„์‚ฐ ๋ฝ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด lock์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ Redis์— ์ €์žฅํ•˜๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ๋Œ€์˜ ์„œ๋ฒ„๋“ค์€ ๊ณตํ†ต๋œ Redis๋ฅผ ๋ฐ”๋ผ๋ณด๋ฉฐ, ์ž์‹ ์ด ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • ์Šคํ•€๋ฝ (spin lock)
    • ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ํ•„์š”ํ•  ๋•Œ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ™•์ธํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ lock์„ ํ•ด์ œํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.
    • ๊ฒฝ์Ÿ ์ƒํƒœ (2๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ  ์ž์›์„ ๋™์‹œ์— ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ์ƒํ™ฉ)๊ฐ€ ์งง๊ณ  ์ž์› ์ ์œ  ์‹œ๊ฐ„์ด ๊ธธ์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ํšจ๊ณผ์ ์ด๋‹ค.
    • ์ฃผ๋กœ ๋ฉ€ํ‹ฐ์ฝ”์–ด ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ฝ ํš๋“์„ ์œ„ํ•ด CPU๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์„œ๋ฒ„์— ๋งŽ์€ ๋ถ€ํ•˜๋ฅผ ์ฃผ์–ด ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ฐธ๊ณ  ์ž๋ฃŒ

3-2. MVCC (Multi-Version Concurrency Control)

MVCC ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ: Locking์˜ ํ•œ๊ณ„

  • lock์€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์„ ์ ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ์˜ lock์„ ํ•ด์ œํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ปจํŠธ๋กคํ•˜๋Š”๋ฐ ์ œ์•ฝ์ด ์žˆ๋‹ค
    • ํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด s-lock์ด ๊ฑธ๋ ธ์œผ๋ฉด ๋‹ค๋ฅธ ํŠธ๋žœ์ ์…˜์€ read๋Š” ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ write๋Š” ํ•  ์ˆ˜ ์—†๋‹ค.
    • ํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด x-lock์ด ๊ฑธ๋ ธ์œผ๋ฉด ๋‹ค๋ฅธ ํŠธ๋žœ์ ์…˜์€ read์™€ write ๋ชจ๋‘ ํ•  ์ˆ˜ ์—†๋‹ค.
  • MVCC๋Š” ์ด๋Ÿฐ locking์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค.

MVCC๋ž€?

  • ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ์— ์—ฌ๋Ÿฌ ๋ฒ„์ „์ด ๊ด€๋ฆฌ๋œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์ฆ‰, MVCC๋Š” ๋ฐ์ดํ„ฐ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ๋•Œ ๊ธฐ์กด์˜ ๋‚ด์šฉ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ , ๊ทธ ๋ฐ์ดํ„ฐ์˜ ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ๋งŒ๋“ ๋‹ค.
  1. Versioning (๋ฒ„์ „ ๊ด€๋ฆฌ): ๊ฐ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์ฆ‰, ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋  ๋•Œ์˜ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
  2. Snapshot Isolation (์Šค๋ƒ…์ƒท ๊ฒฉ๋ฆฌ): ํŠธ๋žœ์žญ์…˜์€ ๋™์‹œ์— ์‹คํ–‰๋˜์ง€๋งŒ ์„œ๋กœ ๊ฒฉ๋ฆฌ๋œ ์Šค๋ƒ…์ƒท์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•œ๋‹ค. ๊ฐ ํŠธ๋žœ์žญ์…˜์€ ์ž์‹ ์ด ์‹œ์ž‘๋œ ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ ์Šค๋ƒ…์ƒท์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
  • ํŠน์ง•
    • MVCC์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ž ๊ธˆ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ RDBMS๋ณด๋‹ค ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•œ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋Œ€์‹  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์† ์Œ“์ด๊ฒŒ ๋˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•˜๋‹ค.
    • MVCC ๋ชจ๋ธ์€ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๋ฒ„์ „์ด ์ถฉ๋Œ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜์—ญ์—์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.
    • UNDO ๋ธ”๋ก I/O, CR Copy ์ƒ์„ฑ, CR ๋ธ”๋ก ์บ์‹ฑ ๊ฐ™์€ ๋ถ€๊ฐ€์ ์ธ ์ž‘์—…์˜ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒํ•œ๋‹ค.
  • ์ฐธ๊ณ  ์ž๋ฃŒ

3-3. BullQueue

BullQueue๋ž€?

  • Nest.js์—์„œ ์ œ๊ณตํ•˜๋Š” Redis ๊ธฐ๋ฐ˜ ๋ถ„์‚ฐ ์ž‘์—… ํ๋กœ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Queue Design Pattern์„ ํ™œ์šฉํ•ด ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—…๋“ค์„ ํ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ž‘์—…๋“ค์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ํ์— ์ถ”๊ฐ€๋œ ์ž‘์—…๋“ค์€ FIFO ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
  • Nest์—์„œ๋Š” @nestjs/bull package๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    1. ์ž‘์—… ๊ด€๋ฆฌ: ํ์— ์ž‘์—…์„ ์ถ”๊ฐ€ํ•˜๊ณ , ์ž‘์—…์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ณ , ์ž‘์—…์„ ์‹คํ–‰ ๋ฐ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž‘์—…์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ๊ฒฐ๊ณผ๋‚˜ ์ƒํƒœ ๋ณ€๊ฒฝ์€ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    2. ์ž‘์—… ์šฐ์„ ์ˆœ์œ„: ์ž‘์—…์—๋Š” ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ํ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์–ด, ์ค‘์š”ํ•œ ์ž‘์—…์ด ๋จผ์ € ์ฒ˜๋ฆฌ๋˜๋„๋ก ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.
    3. ์ž‘์—… ์žฌ์‹œ๋„ ๋ฐ ์‹คํŒจ ์ฒ˜๋ฆฌ: ์ž‘์—…์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ, BullQueue๋Š” ์žฌ์‹œ๋„ ๋ฐ ์‹คํŒจ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค. ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋‚˜ ์‹คํŒจ ์ฒ˜๋ฆฌ ์ „๋žต์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ค๋ฅ˜์— ๋Œ€์ฒ˜ํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์ž‘์—… ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    4. ์ž‘์—… ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง: BullQueue๋Š” ์ž‘์—…์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ž‘์—…์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ํ™•์ธํ•˜๊ณ , ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

BullQueue๋ฅผ ์„ ํƒํ•œ ์ด์œ 

  1. ์œ ์—ฐํ•œ ์ž‘์—… ํ ๋ฐ ์ž‘์—… ์ฒ˜๋ฆฌ: ์ž‘์—…๋“ค์„ ํ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ž‘์—… ์ฒ˜๋ฆฌ์˜ ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ๋™์‹œ์„ฑ ์ œ์–ด: ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ ๋ถ„์‚ฐ ์„œ๋ฒ„ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธธ ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„์— ์ž‘์—…์„ ๊ณต์œ ํ•˜๊ณ  ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ด๋ฒคํŠธ ์•Œ๋ฆผ: ์ž‘์—…์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ด๋ฒคํŠธ ์•Œ๋ฆผ์„ ์ œ๊ณตํ•œ๋‹ค. ์ž‘์—…์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์ž‘์—…์˜ ์™„๋ฃŒ, ์˜ค๋ฅ˜ ๋˜๋Š” ๋‹ค๋ฅธ ์ƒํƒœ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ž‘์—…์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถ”์ ํ•˜๊ณ  ํ•„์š”ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฒˆ์™ธ) Apache Kafka: ์‹ค์‹œ๊ฐ„ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋ถ„์‚ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ (microservice)
    • ๋™์‹œ์„ฑ ์ œ์–ด๋Š” MSA์—์„œ ์„œ๋น„์Šค ๊ฐ„์˜ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์ž‘์—…๋“ค์„ ์ œ์–ดํ•˜๊ณ  ๋™๊ธฐํ™”ํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธ. ๋™์‹œ์„ฑ ์ œ์–ด๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์ค‘์š”ํ•œ ์š”์†Œ์ด์ง€๋งŒ, Kafka ์ž์ฒด๋Š” ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ๋ชฉ์ ์œผ๋กœ ๋””์ž์ธ๋œ ํˆด์€ ์•„๋‹˜. Kafka๋Š” ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ๊ณผ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์œ„ํ•œ ์‹œ์Šคํ…œ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.
    • Kafka๋Š” ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์œผ๋กœ์„œ, ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ „์†กํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ.
    • Kafka๋Š” ๊ณ ๊ฐ€์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ฐ–์ถ˜ ๋ฉ”์‹œ์ง€ ํ ์‹œ์Šคํ…œ์œผ๋กœ, ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ „์†กํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ. MSA(Microservices Architecture)์—์„œ๋Š” Kafka๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ๊ฐ์˜ ๋…๋ฆฝ์ ์ธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„์— ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ. ์ด๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ์„œ๋น„์Šค ๊ฐ„์˜ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ฐ–์ถœ ์ˆ˜ ์žˆ์Œ.

4. ๋™์‹œ์„ฑ ์ œ์–ด ํ…Œ์ŠคํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด

Artillery

  • Artillery๋ฅผ ์„ ํƒํ•œ ์ด์œ 
    1. JavaScript ๊ธฐ๋ฐ˜: Artillery๋Š” JavaScript๋กœ ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    2. ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ฒฐ๊ณผ ๋ถ„์„: Artillery๋Š” ํ…Œ์ŠคํŠธ ์ง„ํ–‰ ์ค‘์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜ ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
    3. ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ: Artillery๋Š” ๋‹ค์–‘ํ•œ ๋™์‹œ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ง€์›ํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋‹ค์–‘ํ•œ ๋™์‹œ ์‚ฌ์šฉ์ž ์ˆ˜, ์š”์ฒญ ํŒจํ„ด ๋ฐ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ํšจ๊ณผ์ ์œผ๋กœ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ์„ ํƒ์ง€: Apache JMeter
    • JMeter๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ๊ณผ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋„๊ตฌ์ด๋‹ค. ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค, ์š”์ฒญ ์œ ํ˜•, ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ๋ฐ ์ถ”์ถœ, ๋ณด๊ณ ์„œ ์ƒ์„ฑ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ ์ง€์›์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋‹ค๋ฃจ์–ด์•ผ ํ•œ๋‹ค๋ฉด JMeter๊ฐ€ ๋” ์ข‹์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ์˜ ๋™์‹œ์„ฑ ์ œ์–ด ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์€ ํฌ๊ฒŒ ๋ณต์žกํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Artillery๊ฐ™์ด ๊ฐ€๋ฒผ์šด ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€