Skip to content

Stocks-Are-Everywhere/backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“ฆ Order-service (2์ฐจ)

๐Ÿ”– ์„œ๋น„์Šค ๊ฐœ์š”

  • ์ฃผ์ œ: ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๋ฐ ์ฒด๊ฒฐ ์—”์ง„ ๊ณ ๋„ํ™”
  • ๋ชฉํ‘œ: ๋‹ค์ค‘ ์ข…๋ชฉ + ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์—์„œ์˜ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ํ™•๋ณด
  • ๊ธฐ์ˆ  ์Šคํƒ: Spring Boot, MySQL, WebSocket, JPA, HikariCP, Concurrent Collection

๐Ÿงฉ ์ฃผ์š” ๊ธฐ๋Šฅ

1๏ธโƒฃ ์ฃผ๋ฌธ ์ƒ์„ฑ ๋ฐ ๊ฒ€์ฆ

  • ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ฃผ๋ฌธ ์š”์ฒญ์„ ์ˆ˜์‹ 
  • ๊ฐ€๊ฒฉ ์œ ํšจ์„ฑ, ๋ณด์œ  ์ž์‚ฐ ๊ฒ€์ฆ (Account/Asset ์„œ๋น„์Šค ์—ฐ๋™)
  • ๊ฒ€์ฆ ํ†ต๊ณผ ์‹œ ์ฃผ๋ฌธ ๋“ฑ๋ก

2๏ธโƒฃ ์ฃผ๋ฌธ ์ฒด๊ฒฐ ๋กœ์ง

  • ์ข…๋ชฉ๋ณ„๋กœ ConcurrentSkipListMap<Price, ConcurrentSkipListSet<Order>> ์‚ฌ์šฉ
  • ๊ฐ€๊ฒฉ ์šฐ์„  โ†’ ์‹œ๊ฐ„ ์ˆœ ์šฐ์„  ์ฒด๊ฒฐ ๋ฐฉ์‹
  • ์ฒด๊ฒฐ๋œ ์ฃผ๋ฌธ์€ TradeHistory์— ์ €์žฅ

3๏ธโƒฃ ์‹ค์‹œ๊ฐ„ ์ฐจํŠธ ๋ฐ ์ฒด๊ฒฐ ์ •๋ณด ์ „์†ก

  • ์ฃผ๋ฌธ ์ฒด๊ฒฐ ์‹œ WebSocket์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก
  • @Scheduled๋ฅผ ํ™œ์šฉํ•œ 15์ดˆ ๋‹จ์œ„ Candle ๊ฐฑ์‹ 

4๏ธโƒฃ ๊ฑฐ๋ž˜ ๋‚ด์—ญ ๋ฐ ์ฐจํŠธ ์ดˆ๊ธฐํ™”

  • ์„œ๋ฒ„ ์‹œ์ž‘ ์‹œ DB์—์„œ ๊ฑฐ๋ž˜ ๋‚ด์—ญ์„ ๋กœ๋”ฉ ํ›„ ์ฐจํŠธ ์ดˆ๊ธฐํ™”
  • ์ข…๋ชฉ๋ณ„ Lock (ReentrantReadWriteLock)์„ ํ™œ์šฉํ•œ ๋ณ‘๋ ฌ ์ ‘๊ทผ ์ œ์–ด


โš™๏ธ ์„ฑ๋Šฅ ๊ฐœ์„  ํ…Œ์ŠคํŠธ (2์ฐจ)

โœ… ํ…Œ์ŠคํŠธ ์กฐ๊ฑด

  • ์ข…๋ชฉ ์ˆ˜: 20๊ฐœ
  • ์‚ฌ์šฉ์ž ์ˆ˜: 1,000๋ช…
  • ๋™์ž‘ ์‹œ๊ฐ„: 10๋ถ„
  • ํ…Œ์ŠคํŠธ ๋„๊ตฌ: NGrinder
  • ์ด ์š”์ฒญ ์ˆ˜: ์•ฝ 140,000๊ฑด

๐Ÿ“Š ์„ฑ๋Šฅ ๊ฐœ์„  ์กฐํ•ฉ๋ณ„ ํ…Œ์ŠคํŠธ

โœ… 2์ฐจ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ Before

  • ๊ธฐ์กด TreeMap + PriorityQueue ์‚ฌ์šฉ
2์ฐจ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ Before

โœ… Case 1

  • Order: ReentrantLock
  • Account: ๋น„๊ด€์  ๋ฝ (Pessimistic Lock)
2์ฐจ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ case1 After

โœ… Case 1 + ์ฟผ๋ฆฌ ํŠœ๋‹

  • Order: ReentrantLock
  • Account: ๋น„๊ด€์  ๋ฝ (Pessimistic Lock)
  • ์ฟผ๋ฆฌ ํŠœ๋‹
2์ฐจ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ case1 + ์ฟผ๋ฆฌ ํŠœ๋‹ After

โœ… Case 1 + ์ฟผ๋ฆฌ ํŠœ๋‹, ์ปค๋„ฅ์…˜ ํ’€ ํŠœ๋‹

  • Order: ReentrantLock
  • Account: ๋น„๊ด€์  ๋ฝ (Pessimistic Lock)
  • ์ฟผ๋ฆฌ ํŠœ๋‹
  • ์ปค๋„ฅ์…˜ ํ’€ ํŠœ๋‹
2์ฐจ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ case1 + ์ฟผ๋ฆฌ ํŠœ๋‹ + ์ปค๋„ฅ์…˜ ํ’€ ํŠœ๋‹ After

โœ… Case 2

  • Order: synchronized
  • Account: ๋‚™๊ด€์  ๋ฝ (Optimistic Lock)
2์ฐจ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ case2 After

โœ… Case 2

  • Order: synchronized
  • Account: ๋‚™๊ด€์  ๋ฝ (Optimistic Lock)
  • ์ฟผ๋ฆฌ ํŠœ๋‹
2์ฐจ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ case2 + ์ฟผ๋ฆฌํŠœ๋‹ After

โœ… Case 2

  • Order: synchronized
  • Account: ๋‚™๊ด€์  ๋ฝ (Optimistic Lock)
  • ์ฟผ๋ฆฌ ํŠœ๋‹
  • ์ปค๋„ฅ์…˜ ํ’€ ํŠœ๋‹
2์ฐจ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ case2 + ์ฟผ๋ฆฌํŠœ๋‹ + ์ปค๋„ฅ์…˜ ํ’€ ํŠœ๋‹ After

๐Ÿ“ˆ ์ตœ์ข… ์„ฑ๋Šฅ ๊ฐœ์„  ์ •๋ฆฌ

๊ตฌ๋ถ„ TPS ์ตœ๊ณ  TPS ์—๋Ÿฌ
Before 145.5 191.0 7,677
After 235.7 276.0 0
  • Before: TreeMap + PriorityQueue
  • After: ConcurrentSkipListMap + ConcurrentSkipListSet + ์ฟผ๋ฆฌ ํŠœ๋‹ + ์ปค๋„ฅ์…˜ ํ’€ ํŠœ๋‹
  • ๊ฒฐ๊ณผ: ์ข…๋ชฉ 20๊ฐœ, ์œ ์ € 1000๋ช… ๊ธฐ์ค€ โ†’ ์•ฝ 62% ์„ฑ๋Šฅ ํ–ฅ์ƒ


๐Ÿ›  ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… & ๊ฐœ์„  ์ด์Šˆ

โš  ์ฒด๊ฒฐ ๋กœ์ง ๋™์‹œ์„ฑ ์ด์Šˆ

  • ํ•ด๊ฒฐ: ConcurrentSkipListMap + ConcurrentSkipListSet + Lock ๊ธฐ๋ฐ˜ ์ œ์–ด

โš  ์ปค๋„ฅ์…˜ ํ’€ ๋ถ€์กฑ

  • ํ•ด๊ฒฐ: HikariCP max pool โ†’ 30, MySQL max_connections โ†’ 300

โš  N+1 ๋ฌธ์ œ

  • ํ•ด๊ฒฐ: ์กฐ๊ฑด๋ถ€ Fetch Join ์ ์šฉ์œผ๋กœ ์ฟผ๋ฆฌ ์ˆ˜ ๊ฐ์†Œ


์ฒด๊ฒฐ ๋กœ์ง๊ณผ Account ๋™๊ธฐํ™”๋ฅผ ๋ชจ๋‘ ๊ณ ๋ คํ•˜๋ฉฐ ๋‹ค์–‘ํ•œ ๋ฝ ์ „๋žต ๋ฐ ๊ตฌ์กฐ ์กฐํ•ฉ์„ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
์‹ค์ œ ํŠธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ฑ๋Šฅ์„ ์ˆ˜์น˜ํ™”ํ•˜๊ณ , ๋ถ„์‚ฐ ๊ตฌ์กฐ๋กœ์˜ ํ™•์žฅ์„ ์œ„ํ•œ ๊ธฐ๋ฐ˜์„ ์™„์„ฑํ•œ ๋‹จ๊ณ„์˜€์Šต๋‹ˆ๋‹ค.

About

onseju - Monolithic Architecture

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 6

Languages