"νμ₯ κ°λ₯ν μν€ν μ²μ λμ©λ νΈλν½ μ²λ¦¬μ μ§μ€νλ λ°±μλ κ°λ°μμ λλ€."
μμ μ μΈ μλΉμ€ μ΄μμ μν MSA(Microservices Architecture) μ€κ³μ μμ€ν
μ±λ₯ μ΅μ νμ κΉμ κ΄μ¬μ κ°μ§κ³ μμ΅λλ€.
λΉμ¦λμ€ μꡬμ¬νμ κΈ°μ μ μΌλ‘ ν΄κ²°νλ κ³Όμ μμ λ°μνλ νΈλ μ΄λμ€νλ₯Ό λΆμνκ³ , λ°μ΄ν° κΈ°λ°μ μμ¬κ²°μ μ μ§ν₯ν©λλ€.
public class HeoJunHyoung {
private final String email = "[email protected]";
private final String blog = "https://receiver40.tistory.com";
public void contact() {
System.out.println("Ready to build scalable architecture.");
}
}MSA κΈ°λ° λμ©λ νΈλν½ μ²λ¦¬ μμ€ν
| μ£Όμ κΈ°λ₯ | κΈ°μ μ νΉμ§ λ° ν΄κ²° κ³Όμ |
|---|---|
| νμ΄λΈλ¦¬λ μΈνλΌ | β’ VirtualBox VM κΈ°λ° On-Premise Kubernetes 3-Node ν΄λ¬μ€ν° μ§μ κ΅¬μΆ β’ μΈλΆ λ©μμ§ μΈνλΌ(Kafka VM)μ K8s ν΄λ¬μ€ν°λ₯Ό λΆλ¦¬ν Hybrid Cloud Topology μ€κ³ |
| λ°μ΄ν° λκΈ°ν | β’ Kafka & Debezium(CDC) μ νμ©ν μλΉμ€ κ° λ°μ΄ν° μ€μκ° λκΈ°ν β’ Transactional Outbox Patternμ μ μ©νμ¬ λΆμ° νκ²½μμ λ°μ΄ν° μ ν©μ± 보μ₯ (SAGA Pattern) |
| κ³ μ±λ₯ κ²μ/μ‘°ν | β’ Split Caching Strategy: μ μ λ°μ΄ν°(λ³Έλ¬Έ)μ λμ λ°μ΄ν°(μ‘°νμ)μ μΊμ± λΌμ΄νμ¬μ΄ν΄ λΆλ¦¬ β’ Redis Write-Back: μ‘°νμ λ± λΉλ²ν μ λ°μ΄νΈλ₯Ό λ©λͺ¨λ¦¬μμ μ²λ¦¬ ν λ°°μΉ λκΈ°ν (DB Lock ν΄μ) |
| μ±λ₯ μ΅μ ν | β’ k6 λΆν ν
μ€νΈλ₯Ό ν΅ν λ³λͺ© κ΅¬κ° μλ³ λ° νλ (μ‘°ν μ±λ₯ 73% κ°μ ) ⒠쿼리 μ€ν κ³ν λΆμμ ν΅ν λ³΅ν© μΈλ±μ€(Composite Index) μ μ© λ° Full Table Scan μ κ±° |
AWS EKS κΈ°λ° ν΄λΌμ°λ λ€μ΄ν°λΈ μν€ν μ²μ λ²‘ν° κ²μμ νμ©ν κ°μΈν μΆμ² μλΉμ€
| μ£Όμ κΈ°λ₯ | κΈ°μ μ νΉμ§ λ° ν΄κ²° κ³Όμ |
|---|---|
| Vector Search μΆμ² | β’ PostgreSQL pgvector νμ₯μ λμ
νμ¬ μ¬μ©μ μ±ν₯(User Embedding)κ³Ό μ¬νμ§ κ° Cosine Similarity μ°μ° ꡬν β’ λ¨μ νν°λ§μ λμ΄μ μ κ΅ν μ·¨ν₯ κΈ°λ° λ§€μΉ μκ³ λ¦¬μ¦ μ€κ³ |
| Cloud Native Infra | β’ AWS EKS νκ²½μμ Terraform(IaC)μ νμ©ν μΈνλΌ νλ‘λΉμ λ λ° κ΄λ¦¬ β’ ArgoCD κΈ°λ° GitOps νμ΄νλΌμΈ ꡬμΆμΌλ‘ λ§€λνμ€νΈ λ³κ²½ μ¬ν μλ λκΈ°ν |
| νμ₯μ± μλ μ±ν | β’ Redis Pub/Sub μν€ν
μ²λ₯Ό μ μ©νμ¬ λ€μ€ μλ² νκ²½μμ WebSocket λ©μμ§ λκΈ°ν λ¬Έμ ν΄κ²° β’ MongoDBλ₯Ό λμ νμ¬ λμ©λ μ±ν λ‘κ·Έ μ°κΈ° μ±λ₯ ν보 λ° μ‘°ν μ΅μ ν (Polyglot Persistence) |
| μ±λ₯ μ΅μ ν | β’ Redis Write-Back μ λ΅: κ²μκΈ μ‘°νμ λ± λΉλ²ν μ°κΈ° μ°μ°μ λ©λͺ¨λ¦¬μμ μ²λ¦¬ ν DB μΌκ΄ λ°μ β’ HttpOnly Cookie νΈλ€λ§: 보μμ μν μΏ ν€ κΈ°λ° JWT μΈμ¦κ³Ό WebSocket νΈλμ °μ΄ν¬ κ° μ°λ λ¬Έμ ν΄κ²° |
λμ©λ νΈλν½ μν©μμμ λμμ± μ μ΄μ μ€μκ° λνΉ μμ€ν μ΅μ ν
| μ£Όμ κΈ°λ₯ | κΈ°μ μ νΉμ§ λ° ν΄κ²° κ³Όμ |
|---|---|
| μ¬κ³ λμμ± μ μ΄ | β’ Redisson λΆμ° λ½(Distributed Lock)μ λμ
νμ¬ λ€μ€ μλ² νκ²½μμ μ¬κ³ μ°¨κ°μ μμμ± λ³΄μ₯ (Race Condition ν΄κ²°) β’ k6 λΆν ν μ€νΈλ₯Ό ν΅ν΄ 100λͺ λμ μμ² μ μ νν μ¬κ³ μ°¨κ° κ²μ¦ (Overselling 0건 λ¬μ±) |
| μ€μκ° λνΉ μμ€ν | β’ Redis Sorted Set (ZSet)μ νμ©νμ¬ μ£Όλ¬Έ λ°μ μ νλ§€λ μ€μκ° μ§κ³ λ° μ μ μ°μ (O(1)) β’ DB μ λ ¬ λΆν μμ΄ reverseRangeWithScoresλ‘ Top 5 μΈκΈ° μν μ¦μ μ‘°ν ꡬν |
| λΆμ° νκ²½ μΈμ | β’ Spring Session Data Redisλ₯Ό μ μ©νμ¬ Scale-out νκ²½μμλ μ ν©μ± μλ λ‘κ·ΈμΈ μΈμ
μ μ§ β’ Redis Caching μ λ΅( Look Aside)μ ν΅ν΄ μ£Όλ¬Έ λ΄μ λ± κ³ λΉλ μ‘°ν λ°μ΄ν°μ μλ΅ μλ κ°μ |


