
๐ฆ 5ํธ. ์ค์ ์ด์ ์ฅ์ ์ฌ๋ก 10์ + ์ฅ์ ๋ณต๊ตฌ ํ๋ ์ด๋ถ
์ด์ ํ๊ฒฝ์์ ์ฅ์ ๋ ์ ๋ ํผํ ์ ์๋ค.
๋ฌธ์ ๋ ์ฅ์ ๋ฅผ ์ผ๋ง๋ ๋นจ๋ฆฌ ๊ฐ์งํ๊ณ , ์ผ๋ง๋ ๋นจ๋ฆฌ ์ ์ํํ๋๋๋ค.
์ด๋ฒ ํธ์์๋ ์ค์ ์ด์์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ๋ ์ฅ์ ๋ค์ ์ ํ๋ณ๋ก ์ ๋ฆฌํ๊ณ ,
๊ฐ ์ฅ์ ๋ง๋ค ์ฆ์ ๋์ํ ์ ์๋ ๋ณต๊ตฌ ํ๋ ์ด๋ถ(Playbook) ์ ์ ๊ณตํ๋ค.
โ 1) ์ฅ์ ์ ํ 10์ — ๊ฐ์ฅ ์์ฃผ ํฐ์ง๋ ์ค์ ์ฌ๋ก
๐ฆ ์ฅ์ 01 — DB Connection Pool ๊ณ ๊ฐ (HikariCP)
์ฆ์:
- API ์๋ต 3~10์ด ์ฆ๊ฐ
- Hikari: “Connection not available” ๊ฒฝ๊ณ ๋ฐ๋ณต
์์ธ:
- ํน์ ์ฟผ๋ฆฌ ์ง์ฐ
- ํ ์ฌ์ด์ฆ ๋ถ์กฑ
- ์ปค๋ฅ์ ๋์(leak)
์ฆ์ ๋ณต๊ตฌ:
- ๋ชจ๋ํฐ๋ง์์ active connection ๊ธ์ฆ ํ์ธ
- DB slow query ์กฐํ
- ์ฅ์ ๊ตฌ๊ฐ ํธ๋ํฝ ์ฐํ or scale-out
๊ทผ๋ณธ ์กฐ์น:
- maxLifetime → DB wait_timeout ๋ง์ถ๊ธฐ
- ์ปค๋ฅ์ ๋์ ๋ก๊ทธ ์ถ๊ฐ
- ๋ฌธ์ SQL ์คํ๊ณํ ํ๋
๐ฆ ์ฅ์ 02 — Redis ์ฅ์ (timeout, cluster failover)
์ฆ์:
- ์ธ์ฆ API ํญ๋ฐ
- ์ธ์ /ํ ํฐ ๋ค์ invalid ๋ฐ์
- ์บ์ ์กฐํ ์๊ฐ ํ์์์ ์ฆ๊ฐ
์์ธ:
- Redis ๋จ์ผ ๋ ธ๋ ๋ถํ ์ง์ค
- cluster failover
- slow command(MGET, KEYS ๋ฑ)
์ฆ์ ๋ณต๊ตฌ:
- Redis client timeout ํ๋
- ์์๋ก ์บ์ ์ฌ์ฉ off (fallback)
- ์ฅ์ ๊ตฌ๊ฐ ๋ฐ์ดํฐ ์บ์ flush
๊ทผ๋ณธ ์กฐ์น:
- key ํจํด ์ต์ ํ
- TTL ์ ์ฑ ์ฌ์ค๊ณ
- ์บ์ ๋ฏธ์ค ๋์ ๋ก์ง ์ ์ฉ(์บ์ ์คํฌํผ๋ ๋ฐฉ์ง)
๐ฆ ์ฅ์ 03 — MQ(Kafka) Consumer Lag ํญ์ฃผ
์ฆ์:
- ๋ฉ์์ง ์ฒ๋ฆฌ ์ง์ฐ
- ๋ฐฐ์น์ฑ ๊ธฐ๋ฅ์ด ์ ์๊ฐ ์ง์ฐ
- lag ์๋ง~์์ญ๋ง ๋ฐ์
์์ธ:
- consumer ์ค ์ผ๋ถ ์ธ์คํด์ค ์ฃฝ์
- ์ฒ๋ฆฌ ์๊ฐ์ด ๋ฉ์์ง ์์ฑ ์๋๋ฅผ ๋ชป ๋ฐ๋ผ๊ฐ
- partition ๋ถ๊ท ํ
์ฆ์ ๋ณต๊ตฌ:
- consumer scale-out
- ๋๋ฆฐ partition๋ง ์ฌ๋ฐฐ์น
- consumer group ์ฌ์์
๊ทผ๋ณธ ์กฐ์น:
- ๋ฉ์์ง ์ฒ๋ฆฌ ๋ก์ง ๋ณ๋ ฌํ
- ํํฐ์ ์ฌ์ค๊ณ
- ack ๋ชจ๋ ๋ฐ commit ์ ์ฑ ์กฐ์
๐ฆ ์ฅ์ 04 — WAS OOM(OutOfMemory) ๋ฐ์ → ์๋น์ค ์ค๋จ
์ฆ์:
- pod/container ์ฌ์์ ๋ฐ๋ณต
- GC pause ์ฆ๊ฐ
- ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฒฝ๊ณ
์์ธ:
- ๋๋ ๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ถ์
- ์บ์ oversize
- Jackson/JSON huge payload
์ฆ์ ๋ณต๊ตฌ:
- ์ธ์คํด์ค ์ฆ์ ์ฌ๊ธฐ๋
- ๋ฉ๋ชจ๋ฆฌ ๋คํ ํ๋ณด
- ์ฅ์ API ์์ ์ฐจ๋จ
๊ทผ๋ณธ ์กฐ์น:
- heap dump ๋ถ์
- ๊ฐ์ฒด ๋ผ์ดํ์ฌ์ดํด ์ ๋ฆฌ
- ์บ์ ํฌ๊ธฐ ์ ์ฑ ํ
- DTO projection์ผ๋ก ์ง๋ ฌํ ์ต์ํ
๐ฆ ์ฅ์ 05 — JVM Thread Pool ๊ณ ๊ฐ (Tomcat/Netty)
์ฆ์:
- API ํธ์ถ์ด ๋ฌดํ Pending
- thread count max ๋๋ฌ
- 503 or timeout ๋ค๋ ๋ฐ์
์์ธ:
- Blocking IO ๋๋ ๋ฐ์
- DB ์ง์ฐ → thread ์ฅ๊ธฐ ์ ์
- async thread pool misconfiguration
์ฆ์ ๋ณต๊ตฌ:
- thread dump ๋ถ์
- ํญ์ฃผ์ํจ API ํ ์ฐจ๋จ
- ์๋ฒ ์ธ์คํด์ค scale-out
๊ทผ๋ณธ ์กฐ์น:
- ๋น๋๊ธฐ ์ ํ
- connection pool, thread pool ์ฌ์ด์ฆ ์ฌ์ค๊ณ
- DB ํ๋
๐ฆ ์ฅ์ 06 — ๋ฐฐ์น(Job) ๋ฌดํ ๋๊ธฐ / Deadlock
์ฆ์:
- ๋ฐฐ์น๊ฐ “RUNNING” ์ํ๋ก ๋ฉ์ถค
- ๋ค์ ์์ ์ด ์คํ๋์ง ์์
- DB lock wait ์ฆ๊ฐ
์์ธ:
- DB ํธ๋์ญ์ lock
- ์ค์ผ์ค๋ง ์ถฉ๋
- ์ค๋ณต ์คํ
์ฆ์ ๋ณต๊ตฌ:
- lock session kill
- ๋ฐฐ์น ์์ ๊ฐ์ ์ข ๋ฃ
- ์ค์ผ์ค ๊ฐ ์ถฉ๋ ์๊ฐ๋ ์กฐ์
๊ทผ๋ณธ ์กฐ์น:
- ๋ฐฐ์น idempotent ์ค๊ณ
- chunk size ์กฐ์
- ๋ถ์ฐ๋ฝ(Redis Lock) ๋์
๐ฆ ์ฅ์ 07 — ์ธ๋ถ API ์ฅ์ → ์ฐ๋ฆฌ API๊น์ง ์ ํ
์ฆ์:
- ์ธ๋ถ API timeout
- ์ฐ๋ฆฌ ์๋ฒ thread ์ ์ ์ฆ๊ฐ
- ์ ์ฒด ์๋ต ์ง์ฐ
์์ธ:
- ํ๋ก ์ฐจ๋จ ๋ฏธ์ ์ฉ
- Connection timeout ๊ณผ๋ํ๊ฒ ๊น
- retry ๊ณผ๋ ๋ฐ์
์ฆ์ ๋ณต๊ตฌ:
- timeout ์ฆ์ ์ค์ด๊ธฐ
- fallback ํ์ฑํ
- ์ธ๋ถ API ์ฝ์ ์์ ์ฐจ๋จ
๊ทผ๋ณธ ์กฐ์น:
- Resilience4j CircuitBreaker ์ ์ฉ
- retry, bulkhead, timeout ์ ์ฑ ์ ๋ฆฝ
- ๋น๋๊ธฐ/queue ๋ฐฉ์ ์ ํ
๐ฆ ์ฅ์ 08 — ํ์ผ ์ ๋ก๋ ์ ์ฅ์ ์ฅ์ (NFS, S3)
์ฆ์:
- ์ ๋ก๋/๋ค์ด๋ก๋ ์ง์ฐ
- WAS thread ๋๊ธฐ ์ฆ๊ฐ
- time-wait ์ ํญ์ฆ
์์ธ:
- ๋คํธ์ํฌ ์ง์ฐ
- ํ์ผ ์๋ฒ ์ฅ์
- ๋๋ ์์ฒญ์ผ๋ก IOPS ๋ถ์กฑ
์ฆ์ ๋ณต๊ตฌ:
- ์ ๋ก๋ ๊ธฐ๋ฅ ์์ ์ค๋จ
- ํ์ผ ์๋ฒ failover
- ์บ์ฑ๋ ํ์ผ๋ก ๋์ฒด ์ ๊ณต
๊ทผ๋ณธ ์กฐ์น:
- ํ์ผ CDN ๋ถ๋ฆฌ
- ๋น๋๊ธฐ ์ ๋ก๋๋ก ์ํคํ ์ฒ ๊ฐ์
- pre-signed URL ํ์ฉ
๐ฆ ์ฅ์ 09 — DB ์คํ ๋ฆฌ์ง Full ๋๋ I/O ํญ์ฃผ
์ฆ์:
- insert/update ์คํจ
- ํ ์ด๋ธ lock
- write latency ๊ธ์ฆ
์์ธ:
- ๋ก๊ทธ/๋ฐฑ์ ํ์ผ ๋์
- stat/index file ํญ์ฆ
- ์ฅ๊ธฐ๊ฐ ๋ฐฐ์น๋ก ์ธํ I/O ํญ์ฃผ
์ฆ์ ๋ณต๊ตฌ:
- ๊ธด๊ธ ์คํ ๋ฆฌ์ง ํ์ฅ
- ๋ถํ์ํ ๋ก๊ทธ ์ญ์
- index rebuild
๊ทผ๋ณธ ์กฐ์น:
- ์๋ purge ์ ์ฑ
- partition table ์ ์ฉ
- archive ํ ์ด๋ธ ๋ถ๋ฆฌ
๐ฆ ์ฅ์ 10 — ALB/Nginx Rate Limit ๋๋ ๋คํธ์ํฌ ์ฅ์
์ฆ์:
- 429 Too Many Requests
- ํน์ ๊ตฌ๊ฐ API๋ง ํ์์์
- health check ์คํจ
์์ธ:
- ๊ธ๊ฒฉํ ํธ๋ํฝ ์ฆ๊ฐ
- ์๋ชป๋ rate limit ์ค์
- ๋คํธ์ํฌ ๋ผ์ฐํ ์ฅ์
์ฆ์ ๋ณต๊ตฌ:
- rate limit ์์ ์ํ
- ํธ๋ํฝ ์ผ๋ถ๋ฅผ ์๋ธ ๋๋ฉ์ธ์ผ๋ก ๋ถ๋ฆฌ
- ์ธ์คํด์ค scale-out
๊ทผ๋ณธ ์กฐ์น:
- API ๋ณ rate limit ์ ์ฑ ํ
- CDN ์ฌ์ฉ
- ๋คํธ์ํฌ ๊ตฌ๊ฐ ์ฅ์ ๊ฐ์ ์๋ํ
โ ๐ฅ ์ด์ํ์ด ๊ผญ ๊ฐ์ ธ์ผ ํ “์ฅ์ ๋ณต๊ตฌ ํ๋ ์ด๋ถ(Playbook)”
์ด์ ๋ณต๊ตฌ์๋ ์ ํด์ง ์์๊ฐ ์๋ค.
๋ชจ๋ ์ฅ์ ํ์ฅ์์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์ ์ํํ๋ ํ๋ค์ ๊ณตํต ์ ๋ต์ ์๋์ ์ ๋ฆฌํ๋ค.
โ 1๋จ๊ณ — ๋ฌธ์ ๊ฐ์ง (Detection)
๊ฐ์ฅ ์ค์ํ ๊ธฐ์ค์ ์งํ ์ด์๊ฐ์ง(alert) ์ด๋ค.
- API latency
- DB connection usage
- CPU/Memory spike
- error rate
- Kafka consumer lag
- Redis ops count ๋ณ๋
โ 2๋จ๊ณ — ๋น ๋ฅธ ์์ธ ๋จ์ ์์ง (Gather Clues)
5๋ถ ์์ ํด์ผ ํ ํ๋:
โ 1) thread dump
โ 2) DB active session / slow query
โ 3) redis/mq ์งํ
โ 4) network latency
โ 5) ์ต๊ทผ ๋ฐฐํฌ ์ฌ๋ถ
โ 3๋จ๊ณ — ์๋น์ค ์ฆ์ ์์ ํ (Mitigation)
์ด ๋จ๊ณ์์ “์ ์ํ ์๊ฐ”์ด ๊ฐ๋ฆฐ๋ค.
- ํธ๋ํฝ ์ฐจ๋จ or ๋ฆฌ๋ฐ
- scale-out
- ์ฅ์ API ๊ฒฉ๋ฆฌ
- ํน์ ๊ธฐ๋ฅ ๊ฐ์ OFF
- ์บ์ fallback ์ ์ฉ
์ด์ํ์ด ๊ฐ์ฅ ๋๋ ค์ํ๋ ๊ฑด ์ฌ์ฉ์ ์ ์ ์ ๋ฒํฐ์ง ๋ชปํด ์ ์ฒด ์ฅ์ ๋ก ํ๋๋๋ ์ํฉ์ด๋ค.
โ 4๋จ๊ณ — ๊ทผ๋ณธ ์์ธ ์ ๊ฑฐ (Root Cause)
ํ์์์ ํด๋์ง ์์ผ๋ฉด ๋ถ๊ฐ๋ฅํ ๋จ๊ณ.
- ์ฟผ๋ฆฌ ํ๋
- ์ธ๋ฑ์ค ์ฌ์ค๊ณ
- ์บ์ ์ ์ฑ ์ฌ์ ๋ฆฝ
- thread pool ์ฌ์ค์
- ๋ฐฐ์น ๊ตฌ์กฐ ๊ฐ์
- retry/circuit breaker ์ ์ฑ ํ
โ 5๋จ๊ณ — ์ฌ๋ฐ ๋ฐฉ์ง ์๋ํ (Prevention)
์ด์ํ์ ํธ๋ฌ๋ธ์ํ ๋ ๋ฒจ์ด ์ฌ๊ธฐ์ ๊ฒฐ์ ๋๋ค.
- SLA ๊ธฐ๋ฐ alert ์ฌ์ค๊ณ
- chaos engineering
- canary ๋ฐฐํฌ
- ์๋ rollback
- traffic shadowing
- ๋ถํ ํ ์คํธ ์ ๊ธฐํ
โ ๋ง๋ฌด๋ฆฌ
์ด์ ์ฅ์ ๋ ๋๊ตฌ์๊ฒ๋ ๋ฐ์ํ์ง๋ง,
๊ฐ ์ฅ์ ๋ฅผ ๋น ๋ฅด๊ฒ ๋ณต๊ตฌํ๊ณ ์ฌ๋ฐ๊น์ง ๋ง๋ ํ์ ์์ฃผ ๋๋ฌผ๋ค.
ํต์ฌ์ ๋ค์ ํ ์ค๋ก ์์ฝ๋๋ค.
“์ฅ์ ๋ ์ค๋น๋ ํ์๊ฒ๋ ๋จ์ํ ์ด๋ฒคํธ์ด๊ณ , ์ค๋น๋์ง ์์ ํ์๊ฒ๋ ์ฌ๋์ด๋ค.”
๋ค์ ํธ์์๋ ์ด์ ์ฅ์ ๋ณต๊ตฌ์ ์ด์ด
“ํธ๋ํฝ ๊ธ์ฆ์ ๋ฒํฐ๋ ์์คํ ์ค๊ณ — ์ค์ผ์ผ๋ง ์ ๋ต ์ ๋ฆฌ”
ํธ์ผ๋ก ์ด์ด๊ฐ๊ฒ ๋ค.
๐ Tags
Java, SpringBoot, SpringPerformance, RealWorldTips, BackendEngineering, ProductionIssue, SystemDesign, ArchitecturePatterns, Database, Redis, Kafka, Resilience4j, DevOps, Troubleshooting, Playbook
- 1ํธ — ์ด์ ์๋ฒ์์ ์ค์ ๋ก ํจ๊ณผ ๋ณธ ๋ฐฉ๋ฒ
- 2ํธ — Jackson ์ง๋ ฌํ ํ๋: ์จ์ CPU ๋ณ๋ชฉ ํด๊ฒฐ
- 3ํธ — ThreadPool & Tomcat ํ๋: ํธ๋ํฝ ํญ์ฃผ ๋์
- 4ํธ — DB ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง๊ณผ SQL ํ๋ ์ฌ๋ก
- 5ํธ — ์ด์ ์ฅ์ ์ฌ๋ก 10์ + ์ฅ์ ๋ณต๊ตฌ ํ๋ ์ด๋ถ (ํ์ฌ ๊ธ)