/stockDiscussionMSA

It's stockDisucussion made with SpringBoot, Cloud ..

Primary LanguageJava

๐Ÿ“ˆ ์ฃผ์‹ ์ข…๋ชฉ ํ† ๋ก ๋ฐฉ

Spring ์„ ์‚ฌ์šฉํ•œ RestfulAPI ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ


๐Ÿ–ฅ๏ธ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

Spring ์œผ๋กœ ๋งŒ๋“  MSA ๊ตฌ์กฐ์˜ ์ข…๋ชฉํ† ๋ก ๋ฐฉ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ์ข…๋ชฉํ† ๋ก ๋ฐฉ์„ ํ†ตํ•ด ์ฃผ์‹ ์ •๋ณด(์ฐจํŠธ, ์ˆœ์œ„) ๋“ฑ์„ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ๋‰ด์Šคํ”ผ๋“œ ๊ธฐ๋Šฅ์„ ํ†ตํ•˜์—ฌ ํŒ”๋กœ์šฐํ•œ ์‚ฌ๋žŒ์˜ ๊ธ€์ด๋‚˜ ํ™œ๋™์ •๋ณด๋ฅผ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ์ข…๋ชฉ์— ๋Œ€ํ•˜์—ฌ ํ† ๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ(๊ธ€, ๋Œ“๊ธ€, ์ข‹์•„์š”) ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.


๐Ÿ•ฐ๏ธ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„

  • 24.01.24์ผ ~ 24.03.04์ผ

โš™๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • Java 17
  • ํ”„๋ ˆ์ž„์›Œํฌ(Framework) : Springboot(3.x,2.x)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Database) : MySQL (8.0.22)
  • ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ๋ฉ”์‹œ์ง• : Redis (7.2.4), Kafka (5.5.1), Zookeeper (5.5.1)
  • ์ง€์†์  ํ†ตํ•ฉ ๋ฐ ๋ฐฐํฌ(CI/CD) : Jenkins (2.444)
  • ์ปจํ…Œ์ด๋„ˆํ™” ๋ฐ ๊ฐ€์ƒํ™” : Docker (25.0.0)
  • ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ(IDE) : IntelliJ 2202.3.3

๐Ÿ“ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ๋„

image



๐Ÿ’ข Trouble Shooting

๐Ÿ“Œ๊ฒŒ์‹œ๊ธ€ ์ข‹์•„์š” ์ˆ˜ ๊ตฌํ˜„์˜ ๋ ˆ์ด์Šค ์ปจ๋””์…˜ ํ•ด๊ฒฐ

๋ฌธ์ œ

  • ๊ฒŒ์‹œ๊ธ€ ์ข‹์•„์š” ์ˆ˜ ๊ตฌํ˜„ ์‹œ ๋ฐœ์ƒํ•œ ๋ ˆ์ด์Šค ์ปจ๋””์…˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

  • Redis์˜ incr ๋ช…๋ น์–ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ข‹์•„์š” ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ณ , ์Šค์ผ€์ค„๋Ÿฌ ๊ธฐ๋ฐ˜ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด DB์— ๋ฐ˜์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๋ ˆ์ด์Šค ์ปจ๋””์…˜ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋ฝ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ง€ํ‘œ ๋ฝ ์—†์Œ ๋‚™๊ด€์  ๋ฝ ๋น„๊ด€์  ๋ฝ Redis
์‘๋‹ต ์„ฑ๊ณต๋ฅ (%) 100% 39% 100% 100%
์ข‹์•„์š” ์ˆ˜ ๋ฐ˜์˜ ๋น„์œจ (%) 27% 39% 100% 100%
์‘๋‹ต ์†๋„ (ms) 18 43 420 13

๊ฒฐ๋ก 

  • Redis์˜ incr ๋ช…๋ น์–ด ์‚ฌ์šฉ ์‹œ ์ข‹์•„์š” ์ˆ˜๊ฐ€ 100% ๋ฐ˜์˜๋˜์—ˆ๊ณ , ์‘๋‹ต ์†๋„๊ฐ€ 13ms๋กœ ์ตœ๋Œ€ 32๋ฐฐ ๋นจ๋ž์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ๋‰ด์Šคํ”ผ๋“œ ์„œ๋น„์Šค ๋ถ€ํ•˜ ํ•ด๊ฒฐ

๋ฌธ์ œ

  • FanOutOnWrite ๋ฐฉ์‹์˜ ๋‰ด์Šคํ”ผ๋“œ ๊ตฌํ˜„ ์‹œ ํŒ”๋กœ์›Œ ์ˆ˜ ๋งŒํผ์˜ ๋‰ด์Šคํ”ผ๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜์—ฌ ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

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

  • ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์ธ Kafka๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‰ด์Šคํ”ผ๋“œ ์„œ๋น„์Šค์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์†Œ๋น„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‰ด์Šคํ”ผ๋“œ ์ƒ์„ฑ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ง€ํ‘œ Kafka ์‚ฌ์šฉ ์ „ Kafka ์‚ฌ์šฉ ํ›„
์‘๋‹ต์‹œ๊ฐ„ (ms) 2,697 15
CPU ์‚ฌ์šฉ๋ฅ  42% 5%

๊ฒฐ๊ณผ

  • Kafka๋ฅผ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ตœ๋Œ€ ์‘๋‹ต ์†๋„๋ฅผ 180๋ฐฐ ๊ฐœ์„ ํ•˜๊ณ , CPU ์‚ฌ์šฉ๋ฅ ์„ 1/8 ์ ˆ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‰ด์Šคํ”ผ๋“œ ์ƒ์„ฑ ํ๋ฆ„!!

MSA์‹œ์Šคํ…œ๊ตฌ์„ฑ๋„-ํŽ˜์ด์ง€-2 drawio


๐Ÿ“Œ๋Œ€์šฉ๋Ÿ‰ ์ผ๋ด‰ ๋ฐ์ดํ„ฐ ์ €์žฅ ์„ฑ๋Šฅ ๊ฐœ์„ 

๋ฌธ์ œ

  • 5๋…„์น˜ ์ฐจํŠธ ์ •๋ณด์ธ 360๋งŒ๊ฐœ์˜ ์ผ๋ด‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž‘์—…์˜ ์„ฑ๋Šฅ์ด JPA saveAll() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ์‹œ 7์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

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

  • MySQL์˜ ๋ฒŒํฌ ์ธ์„œํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์ˆ˜๋ฅผ 1/1000๋กœ ์ค„์ด๊ณ  ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
์ง€ํ‘œ JPA saveAll() ๋ฒŒํฌ ์ธ์„œํŠธ ์ ์šฉ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ์ ์šฉ
์ €์žฅ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ 7h 1m 35s 32s 32s

๊ฒฐ๊ณผ

  • ๋ฒŒํฌ ์ธ์„œํŠธ์™€ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 100๋ฐฐ ์ด์ƒ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ์ผ๋ด‰ ํ…Œ์ด๋ธ” ํŽ˜์ด์ง• ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ๊ฐœ์„ 

๋ฌธ์ œ

  • 360๋งŒ๊ฐœ์˜ ์ผ๋ด‰ ํ…Œ์ด๋ธ” ํŽ˜์ด์ง• ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์ด 1์ดˆ๊ฐ€ ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

  • ์ฟผ๋ฆฌ์˜ where์ ˆ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ข…๋ชฉ์ฝ”๋“œ์™€ ๋‚ ์งœ๋ฅผ ๋ณตํ•ฉ์ธ๋ฑ์Šค๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํŽ˜์ด์ง• ์กฐ๊ฑด ์ธ๋ฑ์Šค ์ ์šฉ ์ „ ์ธ๋ฑ์Šค ์ ์šฉ ํ›„
ํ•œ๋‹ฌ์น˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ 1.66s 0.00s
์ผ๋…„์น˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ 1.70s 0.00s

๊ฒฐ๊ณผ

  • Where์ ˆ ์กฐ๊ฑด์— ๋งž๋Š” ๋ณตํ•ฉ์ธ๋ฑ์Šค ์ƒ์„ฑ์œผ๋กœ 100๋ฐฐ ์ด์ƒ ํŽ˜์ด์ง• ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.