๋ฐฐ๊ฒฝ
- ์๋ ์ 24๋
๋ง์ ์ฟ ํฐ ๋ฐ๊ธ ์์คํ
์ ๋ง๋ค์์๋๋ฐ ๊ทธ ๋ ๋น์์๋ ๋๋ฆ ๊ณ ๋ฏผํด์ ๊ตฌํํ๋ค๊ณ ์๊ฐํ๋๋ฐ ๋ค์ ๋ด๊ฐ ํ ๋ด์ฉ๋ค ์ ๋ฆฌํ๋ค๋ณด๋ ์ด์ฐ ๋๋ฌด ๋ถ์กฑํ ์ ๋ ๋ง๊ณ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ธ
- ์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ์๊ณ
- ์ด๋ค ์ ํ์ง๋ฅผ ์?
- ์ค์ ์ด๋ค๊ฑธ ํ๊ณ ํธ๋ ์ด๋ ์คํ๋ฅผ ๊ด๋ฆฌํ๋๊ฐ?
- ์ด๋ค ์งํ๋ก ๊ฒ์ฆํ๋๊ฐ? -> ์ด๋ฐ ๊ฒ๋ค์ด ์์ธํ๊ฒ ์์ง ์์๋๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ์๋ฅผ ๋ค์ด์ Redis๋ฅผ ๋์ ํ ์ด์ ๊ฐ ์ด์ ํฌ์คํธ๋ฅผ ๋ณด๋ฉด ์ด๋ฐ์ด๋ฐ ์ฅ์ ์ด ์์ด์ ์ผ์ด์๋ผ๋ ๋จ์ ๊ฒฐ๊ณผ ์ค์ฌ์ด๋ผ์ ์ ์ผ์ด์์ ๋ํ ์ ํํ ์๋๋ ์คํ ๋ฆฌ๊ฐ ์์๋๊ฒ ๊ฐ๋ค ์ ํํ ์งํ๋ ๋ฐ์ดํฐ ์์ด
- ๊ทธ๋์ ์ฟ ํฐ ์์คํ ๊ธฐ์กด ์ฝ๋๋ค์ ๋ค์ ์ฝ์ด๋ณด๋ฉด์ ๋ฌธ์ ์ ์ด ์์ผ๋ฉด ์์ ์ ํ๊ณ
- ์ ํํ ์งํ๋ฅผ ํตํด์ ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์ ์์ธํ ๊ฒฝํํด๋ณผ ์๊ฐ์ด๋ค.
์์
- DB๋ง ์ผ์ ๋ ์ ํฉ์ฑ๊ณผ ์๋ต์๊ฐ๊ณผ ์ฒ๋ฆฌ๋ ์ธก์
- ์ด ๋จ๊ณ๋ฅผ ํตํด์ Redis ์์ด ์ด๋๊น์ง ๋ฒํฐ๋๊ฐ?๋ฅผ ์ธก์ ํ๊ณ Redis๋ฅผ ๋์ ํ ์ ๋ฐ์ ์์๋ ํ๋น์ฑ์ ๋ง๋๋๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
- Redis ์ ๋ต ์ ์ฉ + ๋ถ์ฐ๋ฝ ๋ฒ๊ทธ ํด๊ฒฐ
- ์ด ๋จ๊ณ๋ฅผ ํตํด์๋ Redis ๋์ ์ ํ์๋ ์๋ก์ด ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํด๋ณด๊ณ ํด๊ฒฐ๊น์ง ํด๋ณด๋ฉด์ ์ด๋ค ๋ถ๋ถ์ ๊ณ ๋ คํด์ผํ๊ณ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง์ ๋ํ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
- Redis๋ฅผ ๋์
ํ์ ๋ ์ด๋ค ๊ฐ์ ์ ์ด ์๋์ง ์ธก์
- ์ด ๋จ๊ณ๋ฅผ ํตํด์ ์๋ต์๊ฐ ์ฒ๋ฆฌ๋ ๋ฑ์ด ์ด๋์ ๋ ๊ฐ์ ๋์๋์ง ์ต๋ ํ๊ณ๊น์ง ๋ถํํ ์คํธ ์๋๋ฆฌ์ค๋ฅผ ์งํํด๋ณด๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
- ์์ ๋ณด์ฅ ๋ฌธ์ ํด๊ฒฐ
- ํ์ฌ ๊ตฌ์กฐ์ ํ๊ณ์ธ ์์ ๋ณด์ฅ์ด ์๋ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์ด์ ๋ถํํ ์คํธ ๋จ๊ณ์์ ํฌ์ฐฉ์ ํ์ฌ ์ด๋ค์์ผ๋ก ๊ฐ์ ํด๋ณผ ์์์์ง ํด๊ฒฐ์ฑ ์ ์ฐพ์๋ณด๊ณ ๊ฐ์ ํด๋ณธ๋ค
- ์ต์ข
๋ถํ ํ
์คํธ๋ฅผ ์งํ
- ๊ตฌ์กฐ์ ํ๊ณ๋ฅผ ๊ฐ์ ํ ํ ๋ถํํ ์คํธ ์๋๋ฆฌ์ค๋ฅผ ์งํํด๋ณด๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
- Redis์ ๋ค์ํ ์ํคํ
์ณ
- ๋จ์ผ ์ธ์คํด์ค ๊ตฌ์กฐ์ธ Redis ์ํคํ ์ณ๋ฅผ ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ด๋ค ์ํคํ ์ณ๋ฅผ ๋์ ํด๋ณผ ์ ์์์ง ๊ณ ๋ฏผ + ์ ์ฉ ํด๋ณด๋ ๊ฒ์ ๋ชฉํ๋กํ๋ค
- ๊ฐ๋ฅํ๋ฉด ์ง์ ํ๊ฒฝ ๊ตฌ์ถ์ ํด๋ด์ ํ ์คํธ๋ ์งํํด๋ณธ๋ค
Phase 1 : DB๋ง ์ผ์ ๋ ์ ํฉ์ฑ๊ณผ ์๋ต์๊ฐ๊ณผ ์ฒ๋ฆฌ๋ ์ธก์
ํ๋ฆ
- ์ด์ ๋ธ๋ก๊ทธ์์ ์ค๋ช ํ์ง๋ง
- DB์ PESSIMISTIC_WRITE๋ง ์ ์ฉํด์(๋ฐฐํ๋ฝ) ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋๋ ํํ
1
2
3
4
5
6
7
8
9
10
11
12[์์ฒญ A, B, C ๋์ ์ง์ ] | 1. findByCodeAndIsDeletedFalse() โ SELECT ... FOR UPDATE ์คํ โ A๊ฐ ๋จผ์ ๋ฝ ํ๋, BยทC๋ ๋๊ธฐ | 2. coupon.issue() โ remainStock-- (A ์ฒ๋ฆฌ) โ ํธ๋์ญ์ ์ปค๋ฐ โ ๋ฝ ํด์ | 3. B๊ฐ ๋ฝ ํ๋ โ remainStock-- (B ์ฒ๋ฆฌ) 4. C๊ฐ ๋ฝ ํ๋ โ remainStock-- (C ์ฒ๋ฆฌ) - ์ด์ ๋ธ๋ก๊ทธ์์๋ ํ๊ณ๋ฅผ ๊ทธ๋ฅ ์ด๋ก ์ ์ธ ์ด๋ค ๊ฐ๋ฅ์ฑ ์์ค์์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ฉด ์ค์ ๋ถํ ํ
์คํธ๋ฅผ ์งํํด๋ณด๊ณ ์ด๋ค ํ๊ณ๊ฐ ์๋์ง ์์๋ณด์
๋ถํ ํ ์คํธ ์๋๋ฆฌ์ค
์กฐ๊ฑด
- ์ผ๋จ ์ ์ฐฉ์ ์ฟ ํฐ ๋ฐ๊ธ ๋ถํ ํ ์คํธ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ์ด๋ฐ์ ํ ๋ชฐ๋ฆฌ๊ณ ๋ช์ด๋์ ํธ๋ํฝ์ด ์ ์ง๋๋ ํํ์ผ๊ฒ์ด๋ผ๊ณ ์๊ฐ์ ํ๋ค.
1 | |
- ์ฟ ํฐ ์ฌ๊ณ ๋ 10,000๊ฐ๋ก ๊ณ ์ ์ ํ๋ค. VU(50->100->200->500->1000)๋ฅผ ์ ์ง์ ์ผ๋ก ๋๋ฆฌ๋ฉด์ ์ธก์ ์ ์งํํ๋ค(์ฌ๊ธฐ์ VU๋ ๋์ ์์ฒญ ์์ค์ผ๋ก ์๊ฐํ๋ค)
- 0~38์ด๋์ ๋์์ VU ์์ค์ ์์ฒญ์ด ๊ณ์ ๋ฐ์ํ๊ณ ์ด ๊ณผ์ ์์ ์๋ก ๋ค๋ฅธ ์ ์ ๋ค์ด ๊ณ์ ์ ์ ๋๋ฉฐ ๊ฒฝ์ํ๊ณ ๊ทธ์ค ์ฟ ํฐ ์ฌ๊ณ ๋งํผ๋ง ์ฑ๊ณตํด์ ์ฌ๊ณ ๊ฐ ์์ง๋๋ค.
- HikariCP max-pool-size : 10, connection-timeout : 5000ms
- MySql max-connections : 200
- Tomcat ์ค๋ ๋ ํ : 200
์๋๋ฆฌ์ค : DB ์ ๋ ์ฒ๋ฆฌ๋ ํ๊ณ
์์
HikariCP max=10 ๊ธฐ์ค:
- ํธ๋์ญ์ 1๊ฑด ์ฒ๋ฆฌ ์๊ฐ ~50ms โ ์ด๋ก ํ๊ณ: 10 / 0.05 = 200 TPS
- VU=100~200์์ pending ์ปค๋ฅ์ ๋ฐ์ ์์
- VU=500+ ์์ connection-timeout(5000ms) ๋๋ฌ๋ก 5xx ์๋ฌ ๊ธ์ฆ ์์
๊ฒฐ๊ณผ
์ฌ๊ณ ๋ฅผ ์ถฉ๋ถํ ํฌ๊ฒ ๊ณ ์ ํ์ฌ DB๊ฐ ๊ณ์ ์ฐ๊ธฐ ๋ถํ๋ฅผ ๋ฐ๋๋ก ํ๊ณ . VU๋ฅผ ๋จ๊ณ์ ์ผ๋ก ์ฌ๋ ค HikariCP ํฌํ ์ง์ ์ ์ฐพ๋๋ค.
| VU | TPS | p50(ms) | p95(ms) | p99(ms) | ์๋ฌ์จ | ๋ฐ๊ธ์ |
|---|---|---|---|---|---|---|
| 50 | 519 | 79.61 | 115.76 | 136.69 | 0.00% | 10,000 |
| 100 | 580 | 130.42 | 156.92 | 166.98 | 0.00% | 10,000 |
| 200 | 590 | 254.85 | 317.59 | 335.34 | 0.00% | 10,000 |
| 500 | 590 | 573.21 | 1,040 | 1,370 | 0.00% | 10,000 |
| 1000 | 591 | 1,150 | 1,760 | 2,110 | 0.00% | 10,000 |
- ์ง๊ธ ์ด ์์น๋ฅผ ํด์ํด๋ณด๋ฉด
- VU 50 ๋ถํฐ 100 200๊น์ง TPS ์ฆ๊ฐํ๋ค๊ฐ ๊ทธ ์ด์์ VU์์๋ ๋์ด์ TPS๊ฐ ๋์ด๋์ง ์๋๋ค => ๐์ด ์์คํ ์ DB ๊ธฐ๋ฐ ์ฒ๋ฆฌ ํ๊ณ = 590TPS
- Latency(์ง์ฐ์๊ฐ)์ ๋ณด๋ฉด TPS๊ฐ ๊ทธ๋๋ก์ธ๋ฐ ์ง์ฐ์๊ฐ์ ์ง์์ ์ผ๋ก ๋์ด๋๋ค => ๐ DB๊ฐ ๋ ๋ชป์ฒ๋ฆฌํ๋๋ฐ ์์ฒญ์ ๊ณ์ ๋ค์ด์ค๋๊น ์์ฒญ๋ค์ด โ๋๊ธฐ์ด์ ์์ด๋ ํํโ
- ์๋ฌ์จ์ด๋ ๋ฐ๊ธ์๋ฅผ ๋ณด๋ฉด 0.0%, 10,000๊ฐ => ๐์์คํ ์ฅ์ ๋ ๋ฐ์ํ์ง ์์๊ณ ์ ์์ ์ผ๋ก ๋ชจ๋ ์ฌ๊ณ ๊ฐ ์์ง๋์๋ค. ์ฌ๊ณ ์ด์์ ์์ฒญ ์๋ ์ ์์ ์ผ๋ก ๋น์ฆ๋์ค ์คํจ๋ก ์ฒ๋ฆฌ๋์๋ค.
๋ถ์
ํฌํ์ง์ : VU = 200
- VU 200 ์ดํ๋ก๋ TPS๋ ๋์ด์ ์ฆ๊ฐํ์ง ์์ + ๋ ์ดํด์๋ง ์ ํ ์์น์ค => ์ปค๋ฅ์ ํ ๋ณ๋ชฉ ํจํด
- ์ปค๋ฅ์ ๋๊ธฐ ํ์ ์์ด ์์ฒญ๋ค์ด ์๋ต ์ง์ฐ์ ์์ธ
๊ฒฐ๋ก
- TPS โ ๋์์ฒ๋ฆฌ ๊ฐ๋ฅ๊ฐ์ / ํธ๋์ญ์
1๊ฑด ์ฒ๋ฆฌ ์๊ฐ
- HikariCP max = 10, ํธ๋์ญ์ 1๊ฑด ํ๊ท ์ฝ ~17ms => 10 / 0.017 โ ์ด๋ก ์ ์ต๋ TPS 590 TPS
DB-only ๊ตฌ์กฐ๋ ์ ํฉ์ฑ์ ๋ณด์ฅํ์ง๋ง, ๋ชจ๋ ์์ฒญ์ด ์ฌ๊ณ ํ์ธ๊ณผ ์ฐจ๊ฐ์ ์ํด DB ์ปค๋ฅ์ ๊ฒฝ์์ ์ฐธ์ฌํ๋ค. ๊ทธ๋์ ์ ์ฐฉ์ ์ด๋ฒคํธ ์ฒ๋ผ ์งง์ ์๊ฐ์ ํธ๋ํฝ์ด ์ง์ค๋๋ ์ํฉ์์๋ ํ์ฅ์ฑ์ด ๋ฎ์๋ค. ์ค์ ๋ฐ์ดํฐ์์ ํ์ธ ํ ์ ์๋ฏ์ด VU=200๋ถํฐ HicariCP๊ฐ ํฌํ๋์ด TPS๊ฐ 590 ์์ค์์ ๊ณ ์ ๋์๊ณ , ์ดํ์๋ ์ฒ๋ฆฌ๋ ์ฆ๊ฐ ์์ด ์ง์ฐ๋ง ์ฆ๊ฐํ๋ค.
DB-only ๊ตฌ์กฐ์ ๋ฌธ์ ๋ ๋จ์ํ ๋๋ฆฐ ๊ฒ์ด ์๋๋ผ, ๋ชจ๋ ์์ฒญ์ด DB ์ปค๋ฅ์ ์ ์ ์ ํด์ผ๋ง ์ฑ๊ณต/์คํจ๊ฐ ๊ฒฐ์ ๋๋ ๊ตฌ์กฐ์ด๋ค. ์ฆ ์ฑ๊ณต ๊ฐ๋ฅ์ฑ์ด ์๋ ์์ฒญ๊น์ง DB์ ๋๋ฌํ๋ฉด์ ์ปค๋ฅ์ ํ์ ๊ฒฝ์ ์์์ผ๋ก ๋ง๋ค์ด๋ฒ๋ฆฐ๋ค..
๋ฐ๋ผ์ ์ ์ฐฉ์ ์ด๋ฒคํธ์์ ์ฌ๊ณ ์ฐจ๊ฐ์ ๋ฌด๊ฑฐ์ด DB๊ฐ ์๋๋ผ ๋ ๊ฐ๋ฒผ์ด ์ธ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต์์ ๋จผ์ ์ฒ๋ฆฌํด, DB ์ ๊ทผ์ ์ค์ ์ฑ๊ณต ๊ฐ๋ฅํ ์์ฒญ ์๋ก ์ ํํ ํ์๊ฐ ์์(DB์ ๋๋ฌํ๋ ์์ฒญ ์ ์์ฒด๋ฅผ ์ค์ด๋๊ฒ)
์์์ ์นด์ดํฐ ์ฐ์ฐ + ๋ถ์ฐ ๊ณต์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ๋ Redis๊ฐ ์ ํฉํ ์ ํ์ง๋ผ๊ณ ํ๋จํ๋ค. ๋น ๋ฅด๊ธฐ๋ ๋น ๋ฅด์ง๋ง ์ ์ฐฉ์ ์ฟ ํฐ์ โ์ฟ ํฐ ์ฌ๊ณ โ๋ฅผ ๊ด๋ฆฌํ๋๊ฒ ๋งค์ฐ ์ค์ํ๊ธฐ ๋๋ฌธ์ ์์์ ์ธ ์ฐ์ฐ์ด ํ์ํ๋ค. ๋ ์ถํ์ ์ํ ํ์ฅ๊น์ง ๊ณ ๋ คํ๋ค๋ฉด ์ฌ๊ณ ์ํ๋ฅผ ๊ณต์ ํ ์ ์์ด์ ์ ํ์ ํ๊ฒ ๋์๋ค.
