Product Service - Genie-Uss/genieus GitHub Wiki

์„ค๊ณ„ ๊ฐœ์š”

๋™์‹œ์„ฑ์ด ๋†’์€ ์ด์ปค๋จธ์Šค ํ™˜๊ฒฝ์—์„œ ์ƒํ’ˆ ๊ด€๋ฆฌ์™€ ์žฌ๊ณ  ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.


์ƒํ’ˆ ์ €์žฅ

ํ•ต์‹ฌ ๋„์ „ ๊ณผ์ œ

๋™์‹œ ์ฃผ๋ฌธ ์š”์ฒญ์—์„œ์˜ ์žฌ๊ณ  ์ดˆ๊ณผ ํŒ๋งค ๋ฐฉ์ง€

๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ์žฌ๊ณ  ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋ณด์žฅ

์ฃผ๋ฌธ ์ทจ์†Œ/๋งŒ๋ฃŒ ์‹œ ์ •ํ™•ํ•œ ์žฌ๊ณ  ๋ณต๊ตฌ

๋Œ€์šฉ๋Ÿ‰ ์žฌ๊ณ  ์ด๋ฒคํŠธ์˜ ํšจ์œจ์ ์ธ ์ฒ˜๋ฆฌ


ํ•ต์‹ฌ ์„ค๊ณ„ ๊ณ ๋ฏผ

"๋™์‹œ์„ฑ ํ™˜๊ฒฝ์—์„œ ์žฌ๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•  ๊ฒƒ์ธ๊ฐ€?"

๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜๋งŒ์œผ๋กœ๋Š” ๋†’์€ ๋™์‹œ์„ฑ ์ƒํ™ฉ์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ถ„์‚ฐ๋œ ์ฃผ๋ฌธ ์‹œ์Šคํ…œ์—์„œ ์žฌ๊ณ  ๊ด€๋ จ ์ด๋ฒคํŠธ๋“ค์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ๋„ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

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



ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

1. ์›์ž์  ์žฌ๊ณ  ๊ด€๋ฆฌ (Redis + Lua Script)

๋™์‹œ์„ฑ ์ œ์–ด๊ฐ€ ์ค‘์š”ํ•œ ์žฌ๊ณ  ์ฐจ๊ฐ ๋ฐ ๊ฒ€์ฆ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

  • Redis Lua Script๋กœ ์žฌ๊ณ  ๊ฒ€์ฆ๊ณผ ์ฐจ๊ฐ์„ ์›์ž์ ์œผ๋กœ ์ฒ˜๋ฆฌ
  • ์ƒํ’ˆ ์ƒํƒœ๋ณ„ ์บ์‹ฑ ์ „๋žต ๊ตฌํ˜„ (๋ฉ”ํƒ€์ •๋ณด, ์ด์žฌ๊ณ , ์‚ฌ์šฉ์žฌ๊ณ  ๋ถ„๋ฆฌ)
  • ์ค‘๋ณต ์š”์ฒญ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๋ฉฑ๋“ฑ์„ฑ ์ฒ˜๋ฆฌ
  • ์ƒํ’ˆ ์ƒํƒœ ๊ธฐ๋ฐ˜ ์žฌ๊ณ  ๊ด€๋ฆฌ (ํŒ๋งค์ค‘/ํ’ˆ์ ˆ ์ž๋™ ์ „ํ™˜)

2. ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์žฌ๊ณ  ๋ณต๊ตฌ (Kafka + Redis Queue)

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ํšจ์œจ์ ์ธ ์žฌ๊ณ  ๋ณต๊ตฌ ๋ฐ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœํ•œ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ

  • Kafka Consumer ๊ตฌํ˜„: ์ฃผ๋ฌธ ์ทจ์†Œ/๋งŒ๋ฃŒ ์ด๋ฒคํŠธ ์ˆ˜์‹  ๋ฐ ์ฒ˜๋ฆฌ
  • Redis ZSet ์ด๋ฒคํŠธ ํ: ์ˆœ์„œ ๋ณด์žฅ๋œ ์žฌ๊ณ  ์ด๋ฒคํŠธ ์ ์žฌ ์‹œ์Šคํ…œ
  • Spring Batch ์žฌ๊ณ  ํžˆ์Šคํ† ๋ฆฌ: ์ด๋ฒคํŠธ ์ผ๊ด„ ์ฒ˜๋ฆฌ ๋ฐ ์˜์†ํ™”
  • StockEventProcessingService: Score ๊ธฐ๋ฐ˜ ์ˆœ์„œ ๋ณด์žฅ ๋ฐ ์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ์ง€
  • ProductEventMapper: ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋ฐ ๋„๋ฉ”์ธ ๊ฐ์ฒด ๋งคํ•‘
  • ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ: ์ค‘๋ณต ํ‚ค ๊ธฐ๋ฐ˜ ์žฌ์ฒ˜๋ฆฌ ๋ฐฉ์ง€ ์‹œ์Šคํ…œ

3. ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

ํ™•์žฅ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ์œ„ํ•œ ์‹œ์Šคํ…œ ์ตœ์ ํ™”๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์บ์‹œ ์ „๋žต: ์ƒํ’ˆ ์ •๋ณด์™€ ์žฌ๊ณ  ์ •๋ณด์˜ ๋ถ„๋ฆฌ๋œ TTL ๊ด€๋ฆฌ
  • ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ: ๋Œ€์šฉ๋Ÿ‰ ์žฌ๊ณ  ์ด๋ฒคํŠธ์˜ ํšจ์œจ์ ์ธ ์ผ๊ด„ ์ฒ˜๋ฆฌ
  • ๋ถ„์‚ฐ ์ถ”์ : Kafka ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๊ณผ์ •์˜ ์ถ”์  ๊ฐ€๋Šฅ์„ฑ ํ™•๋ณด


์ฃผ์š” ๊ธฐ์ˆ ์  ์„ฑ๊ณผ

๋™์‹œ์„ฑ ์ œ์–ด & All-or-Nothing ํŒจํ„ด

-- Redis Lua Script ์˜ˆ์‹œ
-- ๋ชจ๋“  ์ƒํ’ˆ์˜ ์žฌ๊ณ ๋ฅผ ๊ฒ€์ฆํ•œ ํ›„, ์›์ž์ ์œผ๋กœ ์ฐจ๊ฐ ์ฒ˜๋ฆฌ
for i = 1, #KEYS do
    -- ์žฌ๊ณ  ๊ฒ€์ฆ ๋กœ์ง
    -- ์›์ž์  ์ฐจ๊ฐ ์‹คํ–‰
end

์ด๋ฒคํŠธ ์ˆœ์„œ ๋ณด์žฅ

  • Score ๊ธฐ๋ฐ˜ ์ •๋ ฌ: timestamp * 1000 + productId๋กœ ๊ณ ์œ  ์ˆœ์„œ ์ƒ์„ฑ
  • ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ: ๋งˆ์ง€๋ง‰ ์ฒ˜๋ฆฌ ์œ„์น˜ ์ถ”์ ์œผ๋กœ ์—ฐ์†์„ฑ ๋ณด์žฅ

๋ฉฑ๋“ฑ์„ฑ ์ฒ˜๋ฆฌ

  • ์ค‘๋ณต ํ‚ค ์ƒ์„ฑ: orderId:timestamp ๊ธฐ๋ฐ˜ ์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ์ง€
  • Redis Set ํ™œ์šฉ: 24์‹œ๊ฐ„ TTL๋กœ ํšจ์œจ์ ์ธ ์ค‘๋ณต ๊ฒ€์‚ฌ


์ƒ์„ธ ๋ชฉ์ฐจ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ