Common/์ธ๋ฏธ๋
๋ฐ์ ๊ตญ CTO๊ฐ ์๋ ค์ฃผ๋ ‘์๋ฒ ์ฑ๋ฅ ์ธก์ ๋ฐฉ๋ฒ’ (ํฌ๋ธ์ค ์ ์ , ์ ์ ๊ฐ๋ฐ์, API, ๋ฐฑ์๋)
Seyun(Marco)
2024. 5. 6. 18:39
728x90
๐ก ์์
https://www.youtube.com/watch?v=HSNyJnobBws
์ธ๋ฏธ๋ ๋ด์ฉ
- ์ด๋ฒ์ API ์๋ฒ๋ฅผ ํ๋ ๋ง๋ค์๋๋ฐ, “์ฑ๋ฅ์ด ์์ฃผ ๋นจ๋ผ / ์์ ์ ์ด์ผ / ์ข์ / ๋์” ๋ผ๋ ๋ง์ ๋ง์ด ํ๋ค. ๊ทธ๋ผ ์ด๊ฒ ์ด๋ค ์๋ฏธ์ผ๊น?
- ์ด๋ฐ๋ง์ด ์๋ค. “๋ง์ ์ฌ๋๋ค์ด ์ฌ์ฉํด๋ API ์๋ต ์๊ฐ์ด ์งง๊ณ ์์ ์ ์ด๋ค.”
- ๊ทธ๋ผ ์ฌ๊ธฐ์ ์๋ฌธ์ ์ด ์๊ธด๋ค. ๋ง์์ฌ๋? ์๋ต์๊ฐ์ด ์งง๊ณ ? ์์ ์
- ์ผ๋ง๋ ๋ง์ ์ฌ๋? ์ด๋์ ๋ ์๊ฐ์ด๋ฉด ์งง์๊ฑฐ์ผ? ๋ง์์ ์์ ์ด๋ผ๋๊ฑฐ์ผ?
๋๊ฐ์ง ์ํฉ
- 10๋ช
์ด ๋์์ ํธ์ถํ์ ๋ 1์ด ์์ ๋ชจ๋๊ฐ ์๋ต์ ๋ฐ์ vs 100๋ช
์ด ๋์์ ํธ์ถํ์ ๋ 10์ด ์์ ๋ชจ๋๊ฐ ์๋ต์ ๋ฐ์๋ค.
- ๋์ค์ ์ด๋ค๊ฒ ๋ ๋น ๋ฅธ๊ฐ? ์ ๋ต์ด ์๋ค.
- 1์ด๋์ 5๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ํ ์๋ ์๊ณ , 1์ด๋์ ๋ณ๋ ฌ๋ก 5๊ฐ๋ฅผ ์ฒ๋ฆฌํ ์๋ ์๋ค.
- ํ๊ท ์ด 1์ด๋ผ๊ณ ํ ๋, ๊ฐ ์์ฒญ์ด ๋ณ๋ ฌ๋ก ํ์๋ 1์ด์ผ์๋ ์๊ณ , 5๊ฐ๊ฐ ์์ฐจ์ ์ผ๋ก ์งํ๋๋ฉด์ 1์ด์ผ์๋ ์๋ค.
- ์ด๋ ๊ฒ ๋๋ฉด ํ๊ท ์ ์ ๋งคํด์ง๋๊ฑฐ ์๋๋?
Latency vs Throughput
- Latency๋ ์์ฒญ์์ ์ ์ฅ์์ ์๋ต๊น์ง ์ผ๋ง๋ ๊ฑธ๋ฆฌ๋๊ฐ?
- Throughput์ ์์ ์ ์ ์ฅ์์ ์๊ฐ๋น ์ผ๋ง๋ ์ฒ๋ฆฌํ๋๊ฐ?
- ๊ณ ์๋๋ก๋ก ๋น์ ๋ฅผ ๋ค์ด๋ณด๋ฉด, Latency๊ฐ ๋ฎ๋ค๋๊ฒ์ ์ ํ์๋๊ฐ ๊ต์ฅํ ๋นจ๋ผ์ ์ฐจ๊ฐ ๋น ๋ฅด๊ฒ ๋ค๋์ ์๋ค๋ ๊ฒ์ด๊ณ , Throughput์ด๋ ์ฐจ์ ์ด ๋ง์์ ํ๋ฒ์ ํต๊ณผํ ์ ์๋ค๋ ์ฐจ๋์ด ๋ง๋ค๋ ์๋ฏธ์ด๋ค.
- ์ฑ๋ฅ ๊ฐ์ ์ ํ ๋ ๋์ค์ ์ ์ ํ ์ ํ์ ํจ์ผ๋ก์จ ์ฒ๋ฆฌํ๋๊ฒ ์ค์ํ๋ค.
wrk / wrk2
- https://github.com/wg/wrk
- wrk๋ ํ๋์ ์ธ HTTP ๋ฒค์น๋งํน ๋๊ตฌ๋ก, ๋จ์ผ ๋ค์ค ์ฝ์ด CPU์์ ์คํ๋ ๋ ์๋นํ ๋ถํ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค
- ๊ธฐ๋ณธ์ ์ผ๋ก ์๋์ ๊ฐ์ด ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
wrk -t12 -c400 -d30s http://localhost:8080/hello
- ๋ช๊ฐ์ง ์ต์
์ ์ดํด๋ณด์.
- -c(—connections): ๊ฐ ์ค๋ ๋๊ฐ ์ฒ๋ฆฌํ๋ HTTP ์ฐ๊ฒฐ์ ์ด ์
- -d(—duration): ํ ์คํธ์ ์ง์์๊ฐ
- -t(—threads): ์ฌ์ฉํ ์ค๋ ๋์ ์
- -s(—script): LauJIT ์คํฌ๋ฆฝํธ
- -H(—header): ์์ฒญ์ ์ถ๊ฐํ HTTP ํค๋
- —latency: ์์ธํ Latency ํต๊ณ ์ถ๋ ฅ
- —timeout: ์๋ต์ ๋ฐ์ง ๋ชปํ ๊ฒฝ์ฐ ์๊ฐ ์ ํ
- cf) LauJIT์คํฌ๋ฆฝํธ๋ HTTP ์์ฒญ ์์ฑ, ์๋ต ์ฒ๋ฆฌ, ์ฌ์ฉ์ ์ ์ ๋ณด๊ณ ๋ฅผ ์ํํ๋ ๊ฒ์ผ๋ก ํน์ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ์ปค์คํ ํ ์ ์์ต๋๋ค.
- ๊ทธ๋ผ ํ๋ฒ ๊ฐ๋จํ๊ฒ ํด๋ณด์.
- ๊ฐ๋จํ๊ฒ Spring์ผ๋ก ์ฌ์ฉ์๋ค์ค์ ๋๋ค์ผ๋ก ํ๋ ๋ฆฌํดํ๋ API๋ฅผ ๋ง๋ค์์ต๋๋ค.
- ์ฝ๋๋ ๋ฐ๋ก ๊ณต๊ฐํ์ง ์์ํ ๋ฐ, ์ค์ Service๋ ์๋์ ๊ฐ์ด ์ ์ฒด user๋ฅผ ๋ค ๊ฐ์ ธ์์ random์ ๋๋ฆฌ๋ ํํ ์ด๋ธ ์ค์บ์ ์ด์ฉํ๋ ค๋ ๋ชฉ์ ์ผ๋ก ํ์์ต๋๋ค.
fun random(): User { return userRepository.findAll() .random() }
- ๊ฒฐ๊ณผ
- 12๊ฐ์ ์ค๋ ๋์์ 400๊ฐ์ ์ฐ๊ฒฐ์ ํ๋ ๊ฒฐ๊ณผ latency๋ ํ๊ท 42.32ms์ด๋ฉฐ, 1์ด๋น 10577๊ฐ๋ฅผ ์ฒ๋ฆฌํ๊ฒ์ ์์ ์๋ค.
- ๋จ์ํ Latency๋ง ๋์ค๊ธฐ ๋๋ฌธ์ ์ข๋ ํจ๊ณผ์ ์ผ๋ก ์ถ๋ ฅ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด wrk2๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค.
- wrk2
- https://github.com/giltene/wrk2
- wrk2๋ wrk๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ HTTP ๋ฒค์น๋งํน ๋๊ตฌ๋ก ์ผ์ ํ ์ฒ๋ฆฌ๋ ๋ถํ๋ฅผ ์์ฑํ๊ณ ์ถฉ๋ถํ ์๊ฐ๋์ ์คํ๋ ๊ฒฝ์ฐ ๋์ ์ ํ๋์ Latency๋ฅผ ์ ๊ณตํ๊ธฐ ์ํจ์ ๋๋ค.
wrk2 -t2 -c100 -d30s -R2000 --latency http://localhost/hello
–R
์ ์ด์ฉํด ์ผ์ ํ ์์ฒญ์จ์ ์ง์ ํ ์ ์๋๊ฒ ๋ค๋ฅธ ์ ์ ๋๋ค.- Mac M ์๋ฆฌ์ฆ ๋งฅ๋ถ์์ ์ด๊ฒ ๋์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์์๋ฅผ ํ ์๊ฐ ์์ต๋๋ค ใ ใ
- API ์๋ฒ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ๊ฐ์ ํ๋ ค๋ฉด?
- ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์๋ฒ๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ด๋ค.
- ์น์๋ฒ - WAS - DB
- ์ด๋ ๊ฒ ์๋ค๊ณ ํด๋ด ์๋ค.
- ์ด๋ ์น์๋ฒ์ ์น์๋ฒ์ ์์ฒญ์ 12๊ฐ, WAS๋ 3๊ฐ, DB๋ 6๊ฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๊ณ ํด๋ด ์๋ค.
- ๊ทธ๋ ๋ค๋ฉด ํ๋ฒ ์ฒ๋ฆฌํ ๋ 3๊ฐ์ฉ ์ฒ๋ฆฌํ ์ ์์๊ฒ๋๋ค. ์๋ํ๋ฉด WAS๊ฐ 3๊ฐ๋ง ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋๊น์. ๊ทธ๋ ๋ค๋ฉด ์ด๋ ๋ณ๋ชฉ์ง์ ์ WAS์ ๋๋ค. WAS๊ฐ 6๊ฐ๋ก ์ฒ๋ฆฌ๋๋ค๋ฉด ๋ค๋ฅธ๊ณณ ์์ด ๋ ๋๋ฆด์ ์์ง ์์๊น์? ๋ฐ๋ผ์ WAS๋ฅผ ๋๋ฆฐ๋ค๋ฉด 6๊ฐ๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ฒ๋๋ค.
- ๊ทธ๋ ๋ค๋ฉด ์ด์ 12๊ฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค. ๋ผ๊ณ ํ ๋ ์น์๋ฒ๋ 12๊ฐ์ฉ ๊ฐ๋ฅํ ๊บผ์์. ๊ทธ๋ฌ๋ ์์ง WAS๋ 6๊ฐ๋ฅผ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด 2๊ฐ๋ฅผ ๋ ๋๋ฆฌ๋ฉด 12๊ฐ๊ฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ฒ ์ฃ . ๊ทธ๋ฌ๋ DB์์๋ 6๊ฐ๋ง ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ 6๊ฐ๋ง ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด DB๋ถํ๊ฐ ์๊ธธํ ๋, DB๋ ํ๊ฐ ๋ ๋๋ฆฝ๋๋ค.
- ์ด๋ ๊ฒ ๊ฐ ์ํฉ์ ๋ณด๊ณ ์๋ฒ๋ฅผ ๋๋ฆฌ๋๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ฝ๋ ํจ์จํ ํ๋ค.
- ์ฒ๋ฆฌํ๋ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๊ฒ์ ๋๋ค. ์ฆ, 6๊ฐ๋ฅผ ์ฒ๋ฆฌํ๋๊ฒ์ ํฌ๊ธฐ๋ฅผ ์ค์ฌ 12๊ฐ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ํ ์ ์๋๊ฑฐ์ฃ .
- ๊ทธ๋ฐ๊ฑธ ํ ์ ์๋ ๊ฒ์ WAS(์ ํ๋ฆฌ์ผ์ด์ )์์๋ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค๊ฑฐ๋, N+1์ ํด๊ฒฐํ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ก์ง์ ๋ฆฌํฉํจ์ดํ๋ค๊ฑฐ๋.
- DB๋ ์ค์ผ์ ์์ต๋๋ค. ์ ์ ํ DB ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ค๊ฑฐ๋, Denormalization์ ํ๋ค๊ฑฐ๋.
๊ฒฐ๋ก
- ์๋ฒ ์ฑ๋ฅ์ ๋ํ๋ด๋ ์งํ๋ ๋ค์ํ๋ฉฐ, ์ ๋ต์ด ์๋ค.
- ์ฑ๋ฅ ์ธก์ ์, ๋ช ๋ช ์ ์ฌ์ฉ์๊ฐ ์ด๋ ์ ๋์ ๋ฐ๋๋ก API ์์ฒญ์ ํ ๋ ์๋ฒ์ ์๋ต์๋ ๋ถํฌ๋~ ์ ํํ๊ฐ ํ์ค์ ์ด๋ค
- ์๋ฒ์ ์ฑ๋ฅ์ ์ํฉ์ ๋ฐ๋ผ scale-out ํ๊ฑฐ๋ ์ฝ๋๋ฅผ ํจ์จํ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
ํ๊ธฐ
- ์ฑ๋ฅ์ด๋ผ๋ ๊ฒ์ ๋ช ํํ ๋นจ๋ผ์ผ ํ๋ค. ์ข์์ผ ํ๋ค. ์ด๋ป๊ฒ ํ๋ฉด ์ข์์ ์์๊น? ์ด๋ค ์งํ๋ฅผ ๋ด์ผ ํ ๊น? ๋ฑ๋ฑ ์ด๋ฐ ๊ณ ๋ฏผ๋ค์ ํด๋ณผ์ ์์๋๊ฑฐ ๊ฐ์ต๋๋ค.
- ์์ฃผ ๊ฐ๋จํ๊ฒ ๋ด๊ฐ ๋ง๋ API์ ์ฑ๋ฅ์ ์ด๋จ๊น? ์ผ๋ง๋ ๋ฒํธ์ ์์๊น?์ ๋ํ๊ฒ์ ์์ ์๋ ์๊ฐ์ด์๋๊ฑฐ ๊ฐ์ต๋๋ค.
- ๊ต์ฅํ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ด์ง๋ง, ๊ฐ์ฅ ์ค์ํ ๋ด์ฉ๋ค์ ๋ด์ ์์์ด ์๋์์๊น ์๊ฐ์ด ๋ญ๋๋ค.
- ์ฌ์ค ๊ฐ์ฅ ์ค์ํ๊ฑด ์ฐ๋ฆฌ์ ์๋น์ค๊ฐ ํ์ฌ ์ผ๋ง๋ ๋ฒํธ์ ์๋๊ฐ?๋ฅผ ์์๊ฐ๋๊ฒ ์ข์๊ฑฐ ๊ฐ์ต๋๋ค.
- ์ผ๋ง๋ ๋ง์ ์ฌ๋๋ค์ด ๋์์ ์ฌ์ฉํ ์ ์๋ ์ง / ์ผ์ ๋์ ์ผ๋ง๋ ๋ง์ด ์ฒ๋ฆฌ ํ ์ ์๋์ง๋ฅผ ๊พธ์คํ ์ฒดํฌํ๋๊ฒ ์ข์๊ฑฐ ๊ฐ๋ค.
- ์ด๋ฌํ ๋ถ๋ถ๋ค์ ์ฐจํ์ ๊ทธ๋ผํ๋๋ฅผ ํตํด์ ์ฒ๋ฆฌํด๋ณด๊ณ ์ถ๊ธด ํ๋ค์!
728x90
728x90