406 V1 real server loadtest redesign - 100-hours-a-week/KTB4-3rd-CLOUD GitHub Wiki

406. SLI/SLO ์ •์˜์— ๋”ฐ๋ฅธ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ์ฝ”๋“œยท์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์ •

๊ทผ๊ฑฐ: ์œ„ํ‚ค ใ€ŒV1์˜ ํ•ต์‹ฌ ์‚ฌ์šฉ์ž ์—ฌ์ • ๋ณ„๋กœ SLI/SLO ์ •์˜ใ€, ใ€Œ4๋‹จ๊ณ„ V2 ํŠธ๋ž˜ํ”ฝ ์„ฑ์žฅ์— ๋”ฐ๋ฅธ V1 ์ธํ”„๋ผ ํ•œ๊ณ„ใ€, KTB4-3rd-BE(v1.0.0) ์ฝ”๋“œ, deploy/nginx/nginx.conf, deploy/compose.yaml ์‚ฐ์ถœ๋ฌผ: loadtest-scenarios/real/ (์‹ ๊ทœ), loadtest-scenarios/lib/config.jsยทcuj-journey.jsยทws-connect.jsยทws-message.js (์ž„๊ณ„๊ฐ’ ์ˆ˜์ •)

1. ๊ธฐ์กด ์ฝ”๋“œ์—์„œ ๋ฐ”๋€Œ์–ด์•ผ ํ–ˆ๋˜ ๊ฒƒ

1-1. ๋Œ€์ƒ API: ํ”ฝ์Šค์ฒ˜ โ†’ ์‹ค์ œ ์„œ๋ฒ„

๊ธฐ์กด (data/test-data.json) ์‹ค์ œ ์„œ๋ฒ„ ๋ฐ˜์˜
/api/lab/posts, /api/lab/posts/{n} GET /api/map-pins, GET /api/nearby-posts(์ปค์„œ), GET /api/companion-posts/{id}, GET /api/community-posts/{id}ยท/comments lib/api.js, lib/read-mix.js
/api/lab/runs/*/parties/*/approve (์ขŒ์„ ์Šน์ธ) V1์—๋Š” ์Šน์ธ ๋‹จ๊ณ„๊ฐ€ ์—†์Œ. ๊ฒฝํ•ฉ ์ง€์ ์€ POST /api/companion-posts/{id}/participants์˜ ์กฐ๊ฑด๋ถ€ UPDATE์™€ POST /api/taxi-pots์˜ FOR UPDATE hot-row.js, lib/contention.js
/api/lab/runs/*/stats (ํ˜ผ์žก๋„) V1์— ํ˜ผ์žก๋„ API ์—†์Œ โ†’ ์ง€๋„ ์ด๋™(/api/map-pins)์œผ๋กœ ๋Œ€์ฒด lib/read-mix.js ๊ฐ€์ค‘์น˜ ํ‘œ
/ws?runId= raw WS echo /api/wss STOMP: CONNECT(Authorization) โ†’ SUBSCRIBE /sub/chat/{room} โ†’ SEND /pub/chat/{room} lib/stomp.js
ํ† ํฐ ์ˆ˜๋™ ์ž…๋ ฅ Kakao OAuth๋ฟ โ†’ ํ…Œ์ŠคํŠธ ์„œ๋ฒ„ JWT_SECRET์œผ๋กœ HS256(iss=moyeota, sub=userId) ๋ฐœ๊ธ‰ tools/make-users.py
ID ํ•˜๋“œ์ฝ”๋”ฉ ๊ณต๊ฐœ API๋กœ ์‹œ๋“œ ํ›„ fixture.json, ์‹คํ–‰ ์‹œ map-pins๋กœ ์žฌ์ˆ˜์ง‘ seed.js, discoverTargets()

1-2. ์„ฑ๊ณตยท์‹คํŒจ ํŒ์ •: ์ƒํƒœ์ฝ”๋“œ โ†’ SLI good/bad/์ œ์™ธ

๊ธฐ์กด์—๋Š” expectedStatuses ๋ชฉ๋ก์— ๋“ค์–ด๊ฐ€๋ฉด ์„ฑ๊ณต, ์•„๋‹ˆ๋ฉด ์‹คํŒจ์˜€๋‹ค. SLI ๋ฌธ์„œ 6์žฅ ๊ธฐ์ค€์œผ๋กœ ๋ฐ”๊ฟจ๋‹ค (lib/slo.js classify, lib/api.js RULES).

๋ถ„๋ฅ˜ ์˜ˆ ๊ฐ€์šฉ์„ฑ ๋ถ„๋ชจ
good 2xx, ์˜๋„๋œ ๋นˆ ์ƒํƒœ(current-taxi-pot 200 + null) ํฌํ•จ
bad 5xx, timeoutยทreset(status 0), 409 MATCH_BUSY, nginx 429 ํฌํ•จ
๋„๋ฉ”์ธ ๊ฑฐ์ ˆ ALREADY_PARTICIPATING, COMPANION_NOT_JOINABLE, BANK_ACCOUNT_REQUIRED, MATCH_ALREADY_IN_PROGRESS, COMPANION_POST_CANCELED(410) ๋“ฑ ์ œ์™ธ (business_rejections๋กœ ๋ณ„๋„ ์ง‘๊ณ„)
์ž…๋ ฅ ์˜ค๋ฅ˜ 400 MALFORMED_REQUEST, 422 VALIDATION_ERROR ๋“ฑ ์ œ์™ธ
ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์˜ค๋ฅ˜ 401ยท403ยท404(๊ทœ์น™์— ์—†๋Š” ๊ฒƒ) ์ œ์™ธ, test_data_errors==0 ์ž„๊ณ„๊ฐ’์œผ๋กœ ์‹คํ–‰ ๋ฌดํšจ ์ฒ˜๋ฆฌ

MATCH_BUSY์™€ ๋„๋ฉ”์ธ ๊ฑฐ์ ˆ์ด ๊ฐ™์€ 409๋ผ์„œ ์ƒํƒœ์ฝ”๋“œ๋งŒ์œผ๋กœ๋Š” ๊ตฌ๋ถ„์ด ์•ˆ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์‘๋‹ต ๋ณธ๋ฌธ์˜ error.code๋ฅผ ์ฝ๋Š”๋‹ค(๋ณธ๋ฌธ์„ ๋ฒ„๋ฆฌ์ง€ ์•Š๋„๋ก discardResponseBodies:false).

1-3. ์ž„๊ณ„๊ฐ’: ์ด์ „ V2 ์ดˆ์•ˆ๊ฐ’ โ†’ V1 ์ดˆ๊ธฐ SLO

ํ•ญ๋ชฉ ์ด์ „ ๊ธฐ๋ณธ๊ฐ’ SLO ๋ฌธ์„œ ์ˆ˜์ • ์œ„์น˜
๊ฐ€์šฉ์„ฑ / ์˜ค๋ฅ˜์œจ 99.95% / 0.05% 99.9% / 0.1% lib/config.js v2SloThresholds, real/lib/slo.js
์กฐํšŒ ์ง€์—ฐ p95 750ms, p99 2s p95 1s, p99 2.5s ๋™์ผ
์“ฐ๊ธฐยท๋งค์นญ ์ง€์—ฐ p95 1.2s, p99 2.5s p95 1.5s, p99 3s ๋™์ผ
WS ์—ฐ๊ฒฐ ์„ฑ๊ณต๋ฅ  99.95% 99.9%, 3์ดˆ ์•ˆ์— CONNECTED ws-connect.js, ws-message.js, cuj-journey.js, lib/stomp.js
๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ์„ฑ๊ณต 99.99%, p99 1.5s 99.9%, p99 2s ๋™์ผ
CUJ ์™„๋ฃŒ์œจ 98.5% 97% (์˜๋„ ํ™•์ • ํ›„ ๊ธฐ์ค€) cuj-journey.js, real/cuj.js
์ •ํ•ฉ์„ฑ ์—†์Œ 100% hot_row_consistency, taxi_state_fresh

์ง€์—ฐ SLO๋Š” http_req_duration์ด ์•„๋‹ˆ๋ผ **์œ ํšจ ์ด๋ฒคํŠธ๋งŒ ๋‹ด๋Š” api_duration**์œผ๋กœ ํŒ์ •ํ•œ๋‹ค. ๋„๋ฉ”์ธ ๊ฑฐ์ ˆ(๋น ๋ฅธ 409)์ด ์„ž์ด๋ฉด p95๊ฐ€ ์‹ค์ œ๋ณด๋‹ค ์ข‹๊ฒŒ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

1-4. ์‹ค์ œ ์„œ๋ฒ„ ๊ณ„์•ฝ ๋•Œ๋ฌธ์— ๋ฐ”๋€ ํด๋ผ์ด์–ธํŠธ ๋™์ž‘

  1. ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ํ™•์ธ์€ content๋กœ ๋งค์นญํ•œ๋‹ค. ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋˜๋Š” MessageItem์—๋Š” client_message_id๊ฐ€ ์—†๋‹ค(id, type, sender, content, created_at). SLI ๋ฌธ์„œ P6์˜ "๊ฐ™์€ client_message_id์˜ MESSAGE"๋Š” ํ˜„์žฌ ๊ตฌํ˜„์œผ๋กœ๋Š” ์ธก์ •ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ UUID๋ฅผ ๋„ฃ์€ ๊ณ ์œ  content๋กœ echo๋ฅผ ๋งค์นญํ•œ๋‹ค. BE์—์„œ client_message_id๋ฅผ ๋‚ด๋ ค์ฃผ๋„๋ก ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
  2. SEND ๋ณธ๋ฌธ์€ client_message_id(snake_case)๋กœ ๋ณด๋‚ธ๋‹ค. ์ปฌ๋Ÿผ์ด NOT NULL์ด๋ผ null์ด๋ฉด ์ €์žฅ์ด ์‹คํŒจํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์—๋Š” ์•„๋ฌด ์‘๋‹ต ์—†์ด ๋๋‚œ๋‹ค. STOMP ์ปจ๋ฒ„ํ„ฐ์— ๋„ค์ด๋ฐ ์ „๋žต์ด ์ ์šฉ๋˜๋Š”์ง€ ํ™•์ธ๋˜์ง€ ์•Š์•„ clientMessageId๋„ ๊ฐ™์ด ๋ณด๋‚ธ๋‹ค.
  3. SUBSCRIBE ์งํ›„ 200ms ๊ธฐ๋‹ค๋ฆฐ ๋’ค SENDํ•œ๋‹ค. inbound ์ฑ„๋„์ด ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์•„(setPreserveReceiveOrder ๋ฏธ์„ค์ •) SEND๊ฐ€ ๊ตฌ๋… ๋“ฑ๋ก๋ณด๋‹ค ๋จผ์ € ์ฒ˜๋ฆฌ๋˜๋ฉด ์ž๊ธฐ echo๋ฅผ ๋ชป ๋ฐ›๋Š”๋‹ค.
  4. ๊ตฌ๋…์ž๋Š” ๋ฐ˜๋“œ์‹œ ์‹ค์ œ ์ฐธ์—ฌ์ž์—ฌ์•ผ ํ•œ๋‹ค. ๋น„์ฐธ์—ฌ์ž์˜ SUBSCRIBE๋Š” ์—๋Ÿฌ ์—†์ด ๋ฒ„๋ ค์ง€๋ฏ€๋กœ, seed.js๊ฐ€ ๋ฐฉ์„ ๋งŒ๋“ค๊ณ  ๋ฉค๋ฒ„๋ฅผ ์ฐธ์—ฌ์‹œํ‚จ ๋งคํ•‘๋งŒ ์“ด๋‹ค.
  5. ๋ชจ์ง‘์ž๋Š” ๋“ฑ๋ก ์งํ›„ ๋ฐฉ ID๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค. POST /api/companion-posts ์‘๋‹ต์— chat_room_id๊ฐ€ ์—†์–ด์„œ GET /api/chat-rooms์—์„œ companion_id๋กœ ์ฐพ๋Š”๋‹ค(H5 ์ธก์ • ๊ตฌ๊ฐ„์— ์š”์ฒญ 1๊ฑด์ด ์ถ”๊ฐ€๋จ).
  6. ํƒ์‹œํŒŸ์€ ์ขŒํ‘œ 6์ž๋ฆฌ์™€ ๋ถ„ ๋‹จ์œ„ ์ถœ๋ฐœ์‹œ๊ฐ์ด ์™„์ „ํžˆ ์ผ์น˜ํ•ด์•ผ ๋งค์นญ๋œ๋‹ค. @Digits(fraction=6) ๋•Œ๋ฌธ์— ์ขŒํ‘œ๋Š” ์†Œ์ˆ˜ 6์ž๋ฆฌ๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•œ๋‹ค. CUJ๋Š” 10๋ถ„ ์Šฌ๋กฏ์„ ์จ์„œ ๊ธฐ์กด ํŒŸ ํ•ฉ๋ฅ˜๋„ ์ผ์–ด๋‚˜๊ฒŒ ํ–ˆ๊ณ , taxi_match_total{match_result}๋กœ ํ•ฉ๋ฅ˜์œจ์„ ๋ณธ๋‹ค.
  7. URL ์ •๊ทœํ™”. ์‹ค์ œ ID๋ฅผ name ํƒœ๊ทธ์—์„œ ๋นผ๊ณ  /api/companion-posts/{companion_id} ํ˜•ํƒœ๋กœ ๊ธฐ๋กํ•œ๋‹ค(SLI ๋ฌธ์„œ 5-1์˜ ์นด๋””๋„๋ฆฌํ‹ฐ ์›์น™).

2. ์‹ค์ œ ์„œ๋ฒ„ ์ฝ”๋“œ ๊ธฐ์ค€ ๋ถ€ํ•˜ ์ง€์ 

์‹œ๋‚˜๋ฆฌ์˜ค ํ˜ธ์ถœ API ์„œ๋ฒ„ ๋‚ด๋ถ€ ๊ฒฝ๋กœ ํ™•์ธํ•  ์ž์›
S1 ์กฐํšŒ ์ฆ๊ฐ€ nearby 28 / ์ƒ์„ธ 28 / map-pins 21 / ์“ฐ๊ธฐ 7 / ๊ธฐํƒ€ 7 (ํ•ฉ 91 = 91 RPS ๊ธฐ์ค€) HomeService ๋‘ ํ…Œ์ด๋ธ” MBRContains + ST_Distance_Sphere ์ •๋ ฌ, ๋ณ‘ํ•ฉ Spring CPU, HikariCP, MySQL ๊ณต๊ฐ„ ์ธ๋ฑ์Šค
S2 ์—ฐ๊ฒฐ ์ฆ๊ฐ€ /api/wss CONNECTยทSUBSCRIBE, 1,800์—ฐ๊ฒฐยท6/s JWT ๋””์ฝ”๋”ฉ, SUBSCRIBE๋งˆ๋‹ค ์ฐธ์—ฌ์ž ์กฐํšŒ ์ฟผ๋ฆฌ ์„ธ์…˜ heapยทGC, ์†Œ์ผ“, ๊ตฌ๋… ์‹œ์  DB
S3 ๋ฉ”์‹œ์ง€ ์ €์žฅ SEND 36 msg/s ์ฐธ์—ฌ์ž ์กฐํšŒ โ†’ ๋ฐฉยท์‚ฌ์šฉ์ž ์กฐํšŒ โ†’ INSERT โ†’ last_message_id UPDATE (๋ฉ”์‹œ์ง€ 1๊ฑด = ์ฟผ๋ฆฌ 4~5๊ฐœ, ์ปค๋„ฅ์…˜ 1๊ฐœ) HikariCP ์ ์œ ยท๋Œ€๊ธฐ, MySQL commit
S4-a ๋™ํ–‰ ์ขŒ์„ ๊ฒฝํ•ฉ ๊ฐ™์€ ๊ธ€์— ๋™์‹œ ์ฐธ์—ฌ 20/50/100 UPDATE companions SET current_count+1 WHERE current_count<capacity ๊ฐ™์€ ํ–‰ X-lock (์ •์› ์ตœ๋Œ€ 10 โ†’ ๋‚˜๋จธ์ง€๋Š” COMPANION_NOT_JOINABLE) row lock ๋Œ€๊ธฐ, ์ปค๋„ฅ์…˜ ์ ์œ 
S4-b ํƒ์‹œํŒŸ ๊ฒฝํ•ฉ ๊ฐ™์€ ์ขŒํ‘œยท๋ถ„์œผ๋กœ ๋™์‹œ ๋งค์นญ users FOR UPDATE โ†’ companions FOR UPDATE(์—†์œผ๋ฉด gap lock) โ†’ ์‹คํŒจ ์‹œ 3ํšŒ ์žฌ์‹œ๋„ โ†’ MATCH_BUSY lock wait(๊ธฐ๋ณธ 50s), ๋ฐ๋“œ๋ฝ, ํŒŸ ์ชผ๊ฐœ์ง(taxi_pot_fragmentation)
S5 ํ˜ผํ•ฉ ์กฐํšŒ + ws/chat/hotrow ๊ฐ™์€ JVMยทHikariCP 10๊ฐœ control ๋Œ€๋น„ treatment์˜ ์กฐํšŒ p95ยทp99
CUJ ์ฐธ์—ฌ์žยท๋ชจ์ง‘์žยทํƒ์‹œํŒŸ E2E ์œ„ ๊ฒฝ๋กœ ์ „๋ถ€ + STOMP ์ฒซ ๋ฉ”์‹œ์ง€ cuj_reliability 97%

์ฃผ์˜ํ•  ์ฝ”๋“œ ํŠน์„ฑ:

  • GET /api/map-pins๋Š” ์„œ๋ฒ„์—์„œ ๋ทฐํฌํŠธ ํฌ๊ธฐ๋ฅผ ๊ฒ€์ฆํ•˜์ง€ ์•Š๊ณ , ์ฟผ๋ฆฌ์— LIMIT๋„ ์—†๋‹ค. 500๊ฐœ ์ดˆ๊ณผ ์—ฌ๋ถ€๋Š” ์ „๋ถ€ ์ฝ์€ ๋’ค์— ํŒ๋‹จํ•œ๋‹ค. ๋„“์€ ๋ทฐํฌํŠธ ํ•˜๋‚˜๋กœ๋„ ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ ์Šค์บ”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋ชจ๋ฐ”์ผ ํ•œ ํ™”๋ฉด(0.02ยฐร—0.025ยฐ)์œผ๋กœ ์ œํ•œํ–ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ด API ์ž์ฒด๋Š” ๋ณ„๋„ ๊ฐœ์„  ๋Œ€์ƒ์ด๋‹ค.
  • ํƒ์‹œํŒŸ ๊ฒฝํ•ฉ์€ innodb_lock_wait_timeout(๊ธฐ๋ณธ 50์ดˆ)๊นŒ์ง€ ์ปค๋„ฅ์…˜์„ ๋ถ™์žก์„ ์ˆ˜ ์žˆ์–ด์„œ ์š”์ฒญ ํƒ€์ž„์•„์›ƒ์„ 60์ดˆ๋กœ ๋”ฐ๋กœ ๋’€๋‹ค.

3. ํ…Œ์ŠคํŠธ ์ „์— ์„œ๋ฒ„์—์„œ ํ™•์ธยท๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๊ฒƒ (์ฝ”๋“œ๋งŒ์œผ๋กœ ํ•ด๊ฒฐ ์•ˆ ๋จ)

# ํ•ญ๋ชฉ ํ˜„์žฌ (repo ๊ธฐ์ค€) ์˜ํ–ฅ ์กฐ์น˜
1 nginx limit_req IP๋‹น 20r/s, burst 40 ๋ฐœ์ƒ๊ธฐ ํ•œ ๋Œ€์—์„œ 20 RPS๋ฅผ ๋„˜์œผ๋ฉด 429 โ†’ 91 RPS ์ธก์ • ๋ถˆ๊ฐ€ ํ…Œ์ŠคํŠธ ๊ธฐ๊ฐ„์— ๋ฐœ์ƒ๊ธฐ IP๋ฅผ geo๋กœ ์ œ์™ธ. ์Šคํฌ๋ฆฝํŠธ๋Š” nginx_rate_limited==0์œผ๋กœ ๊ฐ์ง€
2 /api/wss ํ”„๋ก์‹œ location /api/์— ๊ฑธ๋ ค ์žˆ๊ณ  Upgrade/Connection ํ—ค๋” ๋ฏธ์ „๋‹ฌ, proxy_read_timeout 60s ์—…๊ทธ๋ ˆ์ด๋“œ ์‹คํŒจ ๋˜๋Š” ์œ ํœด ์—ฐ๊ฒฐ์ด 60์ดˆ ๋’ค ๋Š๊น€ location /api/wss๋ฅผ ๋ถ„๋ฆฌํ•ด ํ—ค๋”ยท3600s ์ ์šฉ. ws_unexpected_close๋กœ ๊ฐ์ง€
3 STOMP heartbeat Simple Broker์— TaskScheduler๊ฐ€ ์—†์–ด ์„œ๋ฒ„ heartbeat 0 ์œ ํœด ์—ฐ๊ฒฐ ์œ ์ง€๋Š” nginx ํƒ€์ž„์•„์›ƒ์— ๋‹ฌ๋ ค ์žˆ์Œ ์œ„ 2๋ฒˆ๊ณผ ํ•จ๊ป˜ ์ฒ˜๋ฆฌ
4 ์ง€ํ‘œ ๋…ธ์ถœ Actuator๋งŒ ์žˆ๊ณ  Prometheus registryยทendpoint ๋…ธ์ถœ ์„ค์ • ์—†์Œ HikariCP active/pending, Tomcat, JVM GC๋ฅผ ๋ณผ ์ˆ˜ ์—†์Œ micrometer-registry-prometheus + management.endpoints.web.exposure.include (ํ…Œ์ŠคํŠธ ์„œ๋ฒ„ ํ•œ์ •)
5 ๊ณต๊ฐ„ ์ธ๋ฑ์Šค ์Šคํ‚ค๋งˆ๊ฐ€ repo์— ์—†์Œ(ddl-auto: validate) origin_locationยทlocation์— SPATIAL INDEX๊ฐ€ ์—†์œผ๋ฉด S1 ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง SHOW INDEX ํ™•์ธ ํ›„ ๋ฌธ์„œ์— ๊ธฐ๋ก
6 ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž users ํ…Œ์ด๋ธ” ์ง์ ‘ INSERT ์—”ํ‹ฐํ‹ฐ ์™ธ NOT NULL ์ปฌ๋Ÿผ์ด ์žˆ์œผ๋ฉด ์‹คํŒจ seed-users.sql ์ ์šฉ ์ „ SHOW CREATE TABLE users ํ™•์ธ
7 ๋ฐœ์ƒ๊ธฐ ์œ„์น˜ ๋กœ์ปฌ PC 1๋Œ€ ์ง€๋‚œ ์ธก์ •์˜ 1,734์—ฐ๊ฒฐ ์ƒํ•œ ์›์ธ์ด ํ™•์ •๋˜์ง€ ์•Š์Œ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ๋Š” ๋ฐœ์ƒ๊ธฐ 2๋Œ€ ๋ถ„์‚ฐ๊ณผ ๋น„๊ต

4. ๋‚จ์€ SLI ๊ณ„์ธก (๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ๋ฐ–)

SLI ๋ฌธ์„œ์˜ ์„œ๋ฒ„ ์ธก ์ง€ํ‘œ(companion_join_total, taxi_match_retry_total, taxi_match_lock_wait_seconds, after-commit ๋ฉ”ํŠธ๋ฆญ, Nginx access log์˜ $request_time)๋Š” ์•„์ง BEยท์ธํ”„๋ผ์— ์—†๋‹ค. ์ง€๊ธˆ k6 ๊ฒฐ๊ณผ๋Š” ํด๋ผ์ด์–ธํŠธ ๊ด€์ ์˜ SLI๋‹ค. ์„œ๋ฒ„ ์ง€ํ‘œ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๊ฐ™์€ X-Load-Test-Run-Id ํ—ค๋”๋กœ ๊ตฌ๊ฐ„์„ ๋งž์ถฐ ๋น„๊ตํ•œ๋‹ค.