-
Notifications
You must be signed in to change notification settings - Fork 0
Payment Load Test
Mock PG๋ก ๊ฒฐ์ confirm๊น์ง ๋ถํํ ์คํธํ๋ค๊ฐ ์ฐพ์ HikariCP ์ปค๋ฅ์ ํ ์๊ธฐ์ ์ ๋ฐ๋๋ฝ ๊ธฐ๋ก
- ๋ฐฐ๊ฒฝ
- Mock PG
- 1์ฐจ โ 30 threads, HikariCP ํ ๋ถ์กฑ ํ์ธ
- 2์ฐจ โ ํ์ 20์ผ๋ก ๋๋ ธ๋๋ ์คํ๋ ค ์ ํ โ ์ง์ง ์์ธ
- ๊ถ์ฅ ํด๊ฒฐ ๋ฐฉํฅ
- ์ฌํ ๋ฐฉ๋ฒ
POST /payment/payments/confirm์ ์ธ๋ถ PG(Toss)๋ฅผ ์ค์ ๋ก ํธ์ถํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋์ ๋ถํํ
์คํธ ๋์์์ ์ ์ธ๋์ด ์์๋ค. ์ด๋ฒ์ Mock PG๋ฅผ ๋ง๋ค์ด confirm๊น์ง ํฌํจํ ์ ์ฒด ํ๋ฆ์ ๋ถํํ
์คํธํ๊ณ , ๊ทธ ๊ณผ์ ์์ ํ ํฌ๊ธฐ๋ก๋ ํด๊ฒฐ๋์ง ์๋ ์ค์ ๋์์ฑ ๊ฒฐํจ์ ์ฐพ์๋ค. ๋๋ฉ์ธ ๊ตฌ์กฐ์ API ์ ์ฒด๋ Payment ์ฐธ๊ณ .
PaymentTossClientAdapter๊ฐ ํธ์ถํ๋ baseUrl์ ์ค์ ์ผ๋ก ์์ ํ ์ธ๋ถ ์ฃผ์
๋๋ฏ๋ก, ์ฑ ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ด ๊ฐ๋ง ๋ก์ปฌ ์๋ฒ๋ก ๋๋ฆฌ๋ฉด confirm ์ ์ฒด(๋ฝ ํด์ ์์ , ํธ๋์ญ์
๋ถ๋ฆฌ, ์ง๊ฐ ์ถฉ์ ๊น์ง)๋ฅผ ๋ถํํ
์คํธํ ์ ์๋ค. ๋ณ๋ ์์กด์ฑ ์์ด JDK ๋ด์ฅ HttpServer๋ง์ผ๋ก MockTossServer.java๋ฅผ ์์ฑํ๊ณ , ๊ธฐ์กด ๋จ์ํ
์คํธ(TossPaymentAdapterTest.kt)๊ฐ WireMock์ผ๋ก ์ด๋ฏธ ๊ฒ์ฆํด ๋ ์ค์ ์์ฒญ/์๋ต ํฌ๋งท์ ๊ทธ๋๋ก ๋ฐ๋๋ค.
JMeter ์๋๋ฆฌ์ค๋ ์ค๋ ๋๋ง๋ค ๋งค ๋ฐ๋ณต prepare๋ก ์ ๊ฒฐ์ ๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์๋ต์ ๊ทธ๋๋ก confirm์ ํ๋ ค๋ณด๋ด๋ ์ฒด์ด๋ ๊ตฌ์กฐ๋ก ๋ง๋ค์๋ค (confirm์ READY ์ํ์ ๋ํด ๋จ ํ ๋ฒ๋ง ์ฑ๊ณตํ๋ฏ๋ก).
30 threads๋ก ๋ถํ๋ฅผ ๊ฑธ์ confirm ์ฑ๊ณต๋ฅ ์ด 58%(80/138)๋ก ๋จ์ด์ก๋ค. Prometheus๋ก ํ์ธํ 5๋ถ ๊ตฌ๊ฐ ์งํ:
| ์งํ | ๊ฐ |
|---|---|
hikaricp_connections_active ์ต๋ |
10 (๊ธฐ๋ณธ ํ ํฌ๊ธฐ) |
hikaricp_connections_pending ์ต๋ |
30 |
| confirm ํ๊ท ์๋ต์๊ฐ (์ผ๋ถ ๊ตฌ๊ฐ) | 30~60์ด |
confirm 1๊ฑด์ด prepare 1ํ + confirm ๋ด๋ถ ํธ๋์ญ์ 2ํ, ์ด DB ์๋ณต 3๋ฒ์ ํ์๋ก ํ๋๋ฐ 30๋ช ์ด think-time ์์ด ๋ชฐ์์น์ ๊ธฐ๋ณธ ํ(10)์ด ๊ทธ๋๋ก ๋ฐ๋ฅ๋ฌ๋ค โ ์ฌ๊ธฐ๊น์ง๋ ํฉ๋ฆฌ์ ์ธ "์ฉ๋ ๋ถ์กฑ" ๊ฒฐ๋ก ์ด์๋ค.
maximum-pool-size: 20์ผ๋ก ๋๋ฆฌ๊ณ ์ฌ๊ฒ์ฆํ๋ ์์๊ณผ ๋ฐ๋๋ก confirm ์ฑ๊ณต๋ฅ ์ด 1.5%(1/66)๋ก ๋ ๋๋น ์ก๋ค. ๊ฒ๋ค๊ฐ DB์ ์ ๊ท APPROVED๊ฐ 9๊ฑด์ธ๋ฐ confirm 200 ์๋ต์ 1๊ฑด๋ฟ์ด์๋ค โ 8๊ฑด์ ์๋ฒ์์ ์ค์ ๋ก ์ฒ๋ฆฌ(์ง๊ฐ ์ถฉ์ ๊น์ง)๋์ง๋ง ํด๋ผ์ด์ธํธ๊ฐ 60์ด ๋๊ฒ ๊ธฐ๋ค๋ฆฌ๋ค ๋จผ์ ํ์์์์ผ๋ก ํฌ๊ธฐํ ๋ค ์๋ต์ด ๋์ฐฉํ ๊ฒ์ด๋ค.
๋ถํ ๊ตฌ๊ฐ์ HikariCP ์ถ์ด:
active: 0, 17, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, ... โ ์ต๋๊ฐ์ ๊ณ ์ , ์ ํ ์ ํ๋ฆผ
pending: 0, 0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, ... โ ๋๊ธฐ์ด๋ ๊ณ ์ , ์ ํ ์ ์ค์ด๋ฆ
ํ์ด ๋ถ์กฑํด์ ์ค์ ์๋ ์ํฉ์ด๋ผ๋ฉด ์๋ฃ๋๋ ์์ฒญ์ด ์๊ธธ ๋๋ง๋ค ๊ฐ์ด ์ค๋ฅด๋ด๋ ค์ผ ํ๋ค. 100์ด ๊ฐ๊น์ด ์์ ํ ํํํ๋ค๋ ๊ฑด ๊ทธ ์๊ฐ ๋์ ๋จ ํ๋๋ ๋๋์ง ๋ชปํ๋ค๋ ๋ป์ด๋ค (๋ถํ๊ฐ ๋๋๋ฉด ๊ณง๋ฐ๋ก active=0, idle=20์ผ๋ก ํ๋ณต๋๋ฏ๋ก ๋์๋ ์๋์๋ค).
Note
์ ์คํฌ๋ฆฐ์ท โ active๊ฐ ํ ์ต๋๊ฐ(20)์, pending์ด 30์ ๋ชป ๋ฐํ ์ฑ ๋ถํ๊ฐ ๋๋ ๋๊น์ง ๋จ ํ ์นธ๋ ์์ง์ด์ง ์๋๋ค. ์ ์์ ์ธ "ํ ๋ถ์กฑ"์ด๋ผ๋ฉด ์๋ฃ๋๋ ์์ฒญ์ด ์๊ธธ ๋๋ง๋ค ๋ ๊ฐ์ด ์ค๋ฅด๋ด๋ ค์ผ ํ๋ฏ๋ก, ์ด ์์ ํ ์ํ์ ์์ฒด๊ฐ ๋ฐ๋๋ฝ์ ์ฆ๊ฑฐ๋ค.
๊ทผ๋ณธ ์์ธ โ ์ปค๋ฅ์ ํ ์๊ธฐ์ ์ ๋ฐ๋๋ฝ: confirm์ ๋ ๋ฒ์งธ ํธ๋์ญ์ ์ DB ํธ๋์ญ์ ์ ์ฐ ์ฑ๋ก ๊ทธ ์์์ ์ง๊ฐ ์๋น์ค๋ฅผ gRPC๋ก ๋ธ๋กํน ํธ์ถํ๋ค. ์ด ์ฑ์ ๋ชจ๋๋ฆฌ์ค๋ผ ์ง๊ฐ gRPC ์๋ฒ๊ฐ ๊ฐ์ JVM, ๊ฐ์ HikariCP ํ์ ์ฐ๋๋ฐ, ๊ทธ ํธ๋ค๋ฌ๋ ์๊ธฐ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ค๋ฉด ๊ฐ์ ํ์์ ์ปค๋ฅ์ ์ ํ๋ ๋ ๋ฐ์์ผ ํ๋ค.
sequenceDiagram
participant C as confirm ์ค๋ ๋ (x N)
participant Pool as HikariCP ํ (size=20)
participant W as Wallet gRPC ํธ๋ค๋ฌ
C->>Pool: โ ์ปค๋ฅ์
ํ๋ (Payment Tx2 ์คํ)
Note over C,Pool: ํ์ ์ปค๋ฅ์
์ด ์ ๋ถ โ ์์ ์์ง๋ ๋๊น์ง ๋ฐ๋ณต
C->>W: โก getWallet/chargePoints (๋ธ๋กํน, ์ปค๋ฅ์
์ฅ ์ฑ๋ก ๋๊ธฐ)
W->>Pool: โข ์๊ธฐ ์ฟผ๋ฆฌ์ฉ ์ปค๋ฅ์
์์ฒญ
Pool--xW: ํ ์ ๋ถ๊ฐ ์ด๋ฏธ โ ์ ์ ์ ๋ผ ์์ด ๋ฐฐ๋ถ ๋ถ๊ฐ
Note over C,W: ์๋ฌด๋ ๋๋์ง ๋ชปํจ โ ์ํ ๋๊ธฐ
๋์ confirm ์๊ฐ ํ ํฌ๊ธฐ์ ๊ทผ์ ํ๋ฉด ๋ชจ๋ ์ปค๋ฅ์ ์ด "โ ์์ ๋๊ธฐ ์ค์ธ ์ค๋ ๋"์๊ฒ ์ ์ ๋ ์ฑ โข์ ํ์ํ ์ปค๋ฅ์ ์ด ํ๋๋ ๋จ์ง ์๋๋ค โ ๊ณ ์ ์ ์ธ ์ค์ฒฉ ์์ ํ๋ ๋ฐ๋๋ฝ์ด๋ค.
Important
ํ์ 20์ผ๋ก ๋๋ ธ์ ๋ ๋ ๋๋น ์ง ๊ฒ๋ ์ด๊ฑธ๋ก ์ค๋ช ๋๋ค: ํ์ด ํด์๋ก ๋ ๋ง์ ์ค๋ ๋๊ฐ ๋์์ โ ๊น์ง ๋๋ฌํด ๊ฐ์ ํจ์ ์ด ๋ ์์ ํ๊ฒ ๋ฐ๋ํ๋ค. ์ด ๋ฌธ์ ๋ ํ ํฌ๊ธฐ๋ก ํด๊ฒฐ๋์ง ์๋๋ค.
ํฅ๋ฏธ๋ก์ด ์ ์, ๋ฐ๋ก ์ Toss PG ํธ์ถ์ ์ ํํ ๋ฐ๋๋ก ์ง์ฌ ์๋ค๋ ๊ฒ์ด๋ค โ ์ฝ๋ ์ฃผ์์๋ "ํธ๋์ญ์ ์ข ๋ฃ ์ ๋ฝ์ด ํด์ ๋๋ฏ๋ก ์ธ๋ถ PG ํธ์ถ ์ค DB ๋ฝ์ด ์ ์ง๋์ง ์๋๋ค"๊ณ ๋ช ์๋ผ ์๋ค. ๊ฐ๋ฐ์๋ ์ธ๋ถ ํธ์ถ์ ํธ๋์ญ์ ๋ฐ์์ ํด์ผ ํ๋ค๋ ์์น์ ์ด๋ฏธ ์๊ณ Toss ํธ์ถ์ ์ ์ฉํ์ง๋ง, ๊ฐ์ ํธ๋์ญ์ ์์ ์ง๊ฐ gRPC ํธ์ถ์๋ ์ ์ฉํ์ง ๋ชปํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
Tip
์ง๊ฐ gRPC ํธ์ถ์ Tx2 ๋ฐ์ผ๋ก ๋ถ๋ฆฌํ๋ค: (a) ๊ฒฐ์ ์ํ๋ฅผ APPROVED๋ก ๋จผ์ ์ปค๋ฐ โ (b) ํธ๋์ญ์ ๋ฐ์์ ์ง๊ฐ gRPC ํธ์ถ. Toss ํธ์ถ๊ณผ ๋์ผํ ํจํด์ด๋ค.
cd payment/mock-pg && ./start-mock-pg.sh # Mock PG ๊ธฐ๋
# ์ฑ์ local,loadtest ํ๋กํ์ผ๋ก ๊ธฐ๋ (application-loadtest.yml)
cd payment && ./confirm.sh 30 10 60 # 30๋ช
/ ramp 10์ด / ์ ์ง 60์ดGrafana RAIO Main - Application Metrics ๋์๋ณด๋์ "DB ์ปค๋ฅ์
ํ (HikariCP)" ํจ๋๋ก active/pending ์ถ์ด๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ณผ ์ ์๋ค.
- ๐ฆ Project Structure
- ๐ ๏ธ Development Environment
- ๐ Coding Convention
- ๐๏ธ Hexagonal Architecture
- ๐งฉ Multi Module
- ๐ CQRS
- ๐ gRPC
- โ๏ธ Batch Architecture
- โ๏ธ Batch Core
- ๐ก gRPC Core
- ๐๏ธ JPA Core
- ๐ Common
- ๐จ Exception
- ๐ Batch Guide
- ๐ฅ Payment Load Test
- ๐ง Payment Connection Pool Fix
- ๐ Deployment
- ๐ก๏ธ Security