โ–ถ PHASE 2 ยท LESSON 3 ยท SYSTEM DESIGN

// system_design.arch System Design Architecture Mastery ๐Ÿ—๏ธ

แŠฅแŠ•แ‹ฐ Twitter แŠฅแŠ“ Instagram แ‹ซแˆ‰ แ‰ตแˆ‹แˆแ‰… แŠ แ•แˆŠแŠฌแˆฝแŠ–แ‰ฝ Architecture (แŠ แ‹ˆแ‰ƒแ‰€แˆญ) แˆแŠ• แ‹ญแˆ˜แˆตแˆ‹แˆ? แ‹จแ‰ฐแŒ แ‰ƒแˆšแ‹ แ‰แŒฅแˆญ 1 แˆšแˆŠแ‹ฎแŠ• แˆฒแ‹ฐแˆญแˆต แˆแŠ• แˆ˜แˆˆแ‹ˆแŒฅ แŠ แˆˆแ‰ฃแ‰ฝแˆ? Trade-offs (แŠ แŠ•แ‹ฑแŠ• แˆˆแŠ แŠ•แ‹ฑ แˆ˜แ‰ฐแ‹) โ€” แˆแŠ• แˆฒแˆ†แŠ• แ‹จแ‰ตแŠ›แ‹แŠ• แˆ˜แˆแˆจแŒฅ แŠ แˆˆแ‰ฅแŠ•?

แ‹ซแ‹˜แŒ‹แŒ€แ‹: @AppMinds_ET ยท EthioCode Phase 2
DESIGN 01Monolith vs Microservicesthe real trade-off

แ‰ตแˆแ‰ แˆตแˆ…แ‰ฐแ‰ต: "Microservices แˆแˆแŒŠแ‹œ แˆแˆญแŒฅ แАแ‹!" แ‰ฅแˆŽ แˆ›แˆฐแ‰ฅแข Amazonแฃ Netflixแฃ แŠฅแŠ“ Uber โ€” แˆแˆ‰แˆ แ‰  Monolith แАแ‹ แ‹จแŒ€แˆ˜แˆฉแ‰ต! แŠ แˆ‹แˆตแˆแˆ‹แŒŠ แ‹แˆตแ‰ฅแˆตแ‰ฅแАแ‰ตแŠ• (Complexity) แŠ แ‰ณแˆตแŒˆแ‰กแข แˆ˜แŒ€แˆ˜แˆชแ‹ซ แ‰ฝแŒแˆฉแŠ• แˆแ‹จแ‰ฑแฃ แˆ˜แแ‰ตแˆ„แ‹ แ‰€แŒฅแˆŽ แ‹ญแˆ˜แŒฃแˆแข

APPROACHโœ… PROS (แŒฅแ‰…แˆžแ‰ฝ)โŒ CONS (แŒ‰แ‹ณแ‰ถแ‰ฝ)USE WHEN (แˆ˜แ‰ผ แŠฅแŠ•แŒ แ‰€แˆ?)
Monolith แ‰€แˆ‹แˆ แАแ‹แข แˆˆแ‹ดแ‰จแˆŽแ•แˆ˜แŠ•แ‰ต แˆแŒฃแŠ• แАแ‹แข Debug แˆˆแˆ›แ‹ตแˆจแŒ แ‹ญแˆ˜แ‰ปแˆแข แˆฒแ‹ซแ‹ตแŒ (Scale แˆฒแ‹ซแ‹ฐแˆญแŒ) แ‹ญแŠจแ‰ฅแ‹ณแˆแข แŠ แŠ•แ‹ฑ แŠจแ‰ฐแ‰ แˆ‹แˆธ แˆ™แˆ‰แ‹ แ‹ญแ‰†แˆ›แˆแข แˆˆแŒ€แˆ›แˆช แ‹ตแˆญแŒ…แ‰ถแ‰ฝ (Startup)แข แŠจ 50 แ‹ดแ‰จแˆŽแแˆฎแ‰ฝ แ‰ แ‰ณแ‰ฝแข
Microservices แŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑแŠ• แˆˆแ‰ฅแ‰ป แˆ›แˆณแ‹ฐแŒ (Scale แˆ›แ‹ตแˆจแŒ) แ‹ญแ‰ปแˆ‹แˆแข แ‹จแ‰ฐแˆˆแ‹ซแ‹จ แ‰ดแŠญแŠ–แˆŽแŒ‚ แˆ˜แŒ แ‰€แˆ แ‹ญแ‰ปแˆ‹แˆแข Network แˆ˜แ‹˜แŒแ‹จแ‰ต (latency) แ‹ซแˆ˜แŒฃแˆแข Debug แˆˆแˆ›แ‹ตแˆจแŒ แŠจแ‰ฃแ‹ต แАแ‹แข แ‰ตแˆ‹แˆแ‰… แ‰กแ‹ตแŠ–แ‰ฝ แˆฒแŠ–แˆฉแข แ‰ แŒฃแˆ แ‰ฅแ‹™ แ‰ฐแŒ แ‰ƒแˆš แˆฒแŠ–แˆญแข
Modular Monolith แ‹จแˆแˆˆแ‰ฑแˆ แˆแˆญแŒฅ แŒŽแŠ• แŠ แˆˆแ‹แข แ‹ˆแ‹ฐแŠแ‰ต แˆˆแˆ˜แŠจแ‹แˆแˆ (แˆˆแˆ˜แАแŒ แˆ) แ‰€แˆ‹แˆ แАแ‹แข แŠ แˆแŠ•แˆ แŠ แŠ•แ‹ต แˆ‹แ‹ญ แАแ‹ Deploy แ‹จแˆšแ‹ฐแˆจแŒˆแ‹แข แŠซแˆแ‰ฐแŒ แАแ‰€แ‰…แŠ• แˆŠแ‹แˆจแŠจแˆจแŠญ แ‹ญแ‰ฝแˆ‹แˆแข แŠฅแ‹ซแ‹ฐแŒ‰ แˆ‹แˆ‰ แ‹ตแˆญแŒ…แ‰ถแ‰ฝแข แŠจ 10โ€“50 แ‹ดแ‰จแˆŽแแˆฎแ‰ฝแข โ† แˆˆแˆ˜แŒ€แˆ˜แˆญ แˆแˆญแŒก แАแ‹!
๐Ÿ’ก
Real Path โ€” แ‹จแ‰ฐแˆณแŠซแˆ‹แ‰ธแ‹ แŠฉแ‰ฃแŠ•แ‹ซแ‹Žแ‰ฝ แˆแŠ• แ‹ซแ‹ฐแˆญแŒ‹แˆ‰? 1. แ‰  Monolith แ‹ญแŒ€แˆแˆซแˆ‰ โ†’ 2. แ‰ฐแŒ แ‰ƒแˆš (Market fit) แ‹ซแŒˆแŠ›แˆ‰ โ†’ 3. แŠฅแ‹ตแŒˆแ‰ณแ‰ธแ‹ แˆฒแŒจแˆแˆญ โ†’ 4. แŠ แŒˆแˆแŒแˆŽแ‰ถแ‰นแŠ• (Services) แ‹ญแАแŒฅแˆ‹แˆ‰แข Amazon แ‰  Monolith แŒ€แˆแˆฎ แ‰  2002 แАแ‹ แ‹ˆแ‹ฐ Microservices แ‹จแˆ„แ‹ฐแ‹!
DESIGN 02Scaling โ€” Horizontal vs Verticalwhen to scale what
// Vertical Scaling โ€” แ‹ซแˆˆแ‹แŠ• แˆฐแˆญแ‰จแˆญ แŠ แ‰…แˆ แˆ›แˆณแ‹ฐแŒ (แˆ›แˆปแˆปแˆ) Client โ†’ Server (Big!) DB t2.micro โ†’ t2.xlarge โ†’ c5.4xlarge... โŒ แŒˆแ‹ฐแ‰ฅ แŠ แˆˆแ‹ (Limit แŠ แˆˆแ‹)! แŠ แŠ•แ‹ฑ แŠจแ‹ˆแ‹ฐแ‰€ แˆแˆ‰แˆ แ‹ญแ‰†แˆ›แˆ (Single point of failure)! // Horizontal Scaling โ€” แ‰ฐแŒจแˆ›แˆช แˆฐแˆญแ‰จแˆฎแ‰ฝแŠ• แˆ˜แŒจแˆ˜แˆญ Client โ†’ Load Balancer โ†’ Server 1 โ†’ Server 2 โ†’ Server N Redis Cache DB Primary DB Replica โœ… แŒˆแ‹ฐแ‰ฅ แ‹จแˆŒแˆˆแ‹ แŠฅแ‹ตแŒˆแ‰ต (Infinite scale)! แˆแˆแŒŠแ‹œ แ‹แŒแŒ แАแ‹ (High availability)!
nginx-load-balancer.conf
# Nginx Load Balancer โ€” Round Robin แŠ แˆฐแˆซแˆญ
upstream backend {
    server app1.internal:3000;
    server app2.internal:3000;
    server app3.internal:3000;
    # แˆแˆ‰แˆ แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ (Requests) แ‰ แ‹จแ‰ฐแˆซ 1โ†’2โ†’3โ†’1โ†’2โ†’3 แŠฅแ‹ซแˆˆ แ‹ญแŠจแ‹แˆแˆ‹แˆ!
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
        proxy_set_header X-Real-IP $remote_addr;

        # Health check โ€” แ‹จแˆžแ‰ฐ (แ‹จแ‰ฐแ‰ แˆ‹แˆธ) แˆฐแˆญแ‰จแˆญแŠ• แŠจแˆตแˆซ แ‹แŒญ แ‹ซแ‹ฐแˆญแŒ‹แˆ
        proxy_connect_timeout 5s;
        proxy_read_timeout 30s;
    }
}

# Sticky Sessions โ€” แŠ แŠ•แ‹ต แ‰ฐแŒ แ‰ƒแˆš แˆแˆแŒŠแ‹œ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แˆฐแˆญแ‰จแˆญ แˆ‹แ‹ญ แŠฅแŠ•แ‹ฒแ‰†แ‹ญ:
upstream backend_sticky {
    ip_hash; โ† แ‹จแ‰ฐแŒ แ‰ƒแˆšแ‹แŠ• IP แˆ˜แАแˆป แ‹ซแ‹ฐแˆญแŒ‹แˆ
    server app1.internal:3000;
    server app2.internal:3000;
}
DESIGN 03Caching Strategies โ€” CacheแŠ• แˆ˜แ‰ผ แŠฅแŠ•แŒ แ‰€แˆ?cache invalidation

Caching แˆˆแˆ›แ‹ตแˆจแŒ แ‰€แˆ‹แˆ แ‰ขแˆ˜แˆตแˆแˆ แ‰ตแˆแ‰ แˆแ‰ฐแŠ“ Cache invalidation แАแ‹แข แ‹ณแ‰ณ แˆฒแ‰€แ‹จแˆญ แ‹จแ‹ตแˆฎแ‹แŠ• Cache แŠฅแŠ•แ‹ดแ‰ต แŠฅแŠ“ แˆ˜แ‰ผ แŠฅแŠ“แ‹˜แˆแАแ‹ (update แŠฅแŠ“แ‹ตแˆญแŒˆแ‹)? "แ‰ แŠฎแˆแ’แ‹แ‰ฐแˆญ แˆณแ‹ญแŠ•แˆต แˆแˆˆแ‰ต แŠจแ‰ฃแ‹ต แАแŒˆแˆฎแ‰ฝ แ‰ฅแ‰ป แŠ แˆ‰แก Cache invalidation แŠฅแŠ“ แˆˆแАแŒˆแˆฎแ‰ฝ แˆตแˆ แˆ›แ‹แŒฃแ‰ตแข"

caching-strategies.js โ€” 4 Patterns
// โ”€โ”€ 1. Cache-Aside (Lazy Loading) โ”€โ”€ โ† แ‰ แŒฃแˆ แ‹จแ‰ฐแˆˆแˆ˜แ‹ฐแ‹
async function getUser(id) {
  const cached = await redis.get(`user:${id}`);
  if (cached) return JSON.parse(cached); // Cache Hit! (แŠซแŒˆแŠ˜แ‹ แ‹ญแˆ˜แˆแˆณแˆ)

  const user = await db.findUser(id);     // Cache Miss (แŠซแˆ‹แŒˆแŠ˜แ‹ แ‹ˆแ‹ฐ DB แ‹ญแˆ„แ‹ณแˆ)
  await redis.setEx(`user:${id}`, 3600, JSON.stringify(user));
  return user;
}

// โ”€โ”€ 2. Write-Through โ”€โ”€ แ‹ˆแ‹ฐ DB แŠฅแŠ“ Cache แ‰ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แŒŠแ‹œ แˆ˜แƒแ
async function updateUser(id, data) {
  await db.updateUser(id, data);
  await redis.setEx(`user:${id}`, 3600, JSON.stringify(data));
  // DB แŠฅแŠ“ Cache แˆแˆแŒŠแ‹œ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แ‹ณแ‰ณ แ‹ญแŠ–แˆซแ‰ธแ‹‹แˆ!
}

// โ”€โ”€ 3. Cache Invalidation โ€” แ‹ณแ‰ณ แˆฒแ‰€แ‹จแˆญ แ‹จแ‹ตแˆฎแ‹แŠ• Cache แˆ›แŒฅแ‹แ‰ต
async function deleteUser(id) {
  await db.deleteUser(id);
  await redis.del(`user:${id}`);     // Invalidate (แŠ แŒฅแ‹แ‹)!
  await redis.del(`users:list`);    // แ‰ฐแ‹ซแ‹ซแ‹ฅแАแ‰ต แ‹ซแˆ‹แ‰ธแ‹แŠ•แˆ Cache แ‹ซแŒ แ‹แˆ!
}

// โ”€โ”€ 4. Cache Stampede Prevention โ€” แ‰ฅแ‹™ แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ แŠ แŠ•แ‹ต แŒŠแ‹œ Cache Miss แˆฒแ‹ซแ‹ฐแˆญแŒ‰
async function getUserSafe(id) {
  const lockKey = `lock:user:${id}`;
  const lock = await redis.set(lockKey, 1, 'NX', 'EX', 10);
  if (!lock) {
    // แˆŒแˆ‹ แŒฅแ‹ซแ‰„ (request) แ‹ณแ‰ณแ‹แŠ• แŠฅแ‹ซแˆ˜แŒฃ แАแ‹ โ€” แˆตแˆˆแ‹šแˆ… แ‰ตแŠ•แˆฝ แŒ แ‰ฅแ‰† แŠฅแŠ•แ‹ฐแŒˆแŠ“ แ‹ญแˆžแŠญแˆซแˆ
    await sleep(100);
    return getUser(id);
  }
  // แˆ›แŠ•แˆ แŠ แˆแ‹ซแ‹˜แ‹แˆ โ€” แˆตแˆˆแ‹šแˆ… แŠจ DB แŠ แˆแŒฅแ‰ถ Cache แ‹ซแ‹ฐแˆญแŒˆแ‹‹แˆ
}
DESIGN 04Database at Scale โ€” Indexing แŠฅแŠ“ Shardingperformance bottleneck

แˆแˆแŒŠแ‹œ แ‹‹แАแŠ›แ‹ แ‹จแแŒฅแАแ‰ต แŠฅแŠ•แ‰…แ‹แ‰ต (Bottleneck) แ‹จแˆšแˆ†แАแ‹: Database แАแ‹แข 100 แˆฐแˆญแ‰จแˆญ แ‰ขแŠ–แˆซแ‰ฝแˆแˆ Database 1 แŠจแˆ†แА แˆ˜แŒจแŠ“แАแ‰ แŠ แ‹ญแ‰€แˆญแˆ โ€” แˆตแˆˆแ‹šแˆ… Indexingแฃ Query optimizationแฃ แŠฅแŠ“ Read replicas แˆ˜แŠ–แˆญ แŠ แˆˆแ‰ฃแ‰ธแ‹แข

db-optimization.sql โ€” Index Strategy
-- โŒ Slow: Full table scan โ€” 1 แˆšแˆŠแ‹ฎแŠ•แˆ แˆฎแ‹ (rows) แŠซแˆ‰ แˆแˆ‰แŠ•แˆ แ‹ซแАแ‰ฃแˆ
SELECT * FROM posts WHERE user_id = 42;
-- Execution: 850ms (แ‹ซแˆˆ index)

-- โœ… แˆ˜แŒ€แˆ˜แˆชแ‹ซ Index แแŒ แˆฉ!
CREATE INDEX idx_posts_user_id ON posts(user_id);
-- แŠ แˆแŠ• แ‹ซแ‹ แŒฅแ‹ซแ‰„: 2ms แ‰ฅแ‰ป! 425 แŠฅแŒฅแ แˆแŒฃแŠ• แАแ‹!

-- Compound Index โ€” แˆˆแ‰ฅแ‹™ columns แ‰ แŠ แŠ•แ‹ต แŒŠแ‹œ
CREATE INDEX idx_posts_user_created
  ON posts(user_id, created_at DESC);
-- "แ‹จแŠ แ‰คแˆแŠ• posts โ€” แŠ แ‹ฒแˆถแ‰นแŠ• แˆ˜แŒ€แˆ˜แˆชแ‹ซ" โ€” แ‰ แ‰…แ…แ‰ แ‰ต แ‹ญแˆ˜แˆแˆณแˆ!

-- โŒ N+1 Query Problem โ€” แ‰ แ‰ƒแˆˆแˆ˜แŒ แ‹ญแ‰… แŒŠแ‹œ แˆแˆŒ แ‹จแˆšแАแˆณ!
const users = await prisma.user.findMany();
for (const user of users) {
  const posts = await prisma.post.findMany({where:{authorId:user.id}});
  // 100 users แ‰ขแŠ–แˆฉ = 101 queries แ‹ˆแ‹ฐ DB แ‹ญแˆ‹แŠซแˆ‰! (N+1 แ‰ฝแŒแˆญ)
}

-- โœ… Fix: include แˆ˜แŒ แ‰€แˆ (แ‰  1 query แ‰ฅแ‰ป แ‹ซแˆแ‰ƒแˆ!)
const users = await prisma.user.findMany({
  include: { posts: true } // JOIN แ‰ แˆ›แ‹ตแˆจแŒ แ‰  1 query แ‹ญแˆ˜แˆแˆฐแ‹‹แˆ!
});

-- Read Replica โ€” แŠ แ‹ฒแˆต แˆ˜แˆจแŒƒ แˆˆแˆ˜แƒแ แ‹ˆแ‹ฐ Primaryแฃ แˆˆแˆ›แŠ•แ‰ แ‰ฅ แ‹ˆแ‹ฐ Replica
const writePrisma = new PrismaClient({ datasourceUrl: PRIMARY_URL });
const readPrisma  = new PrismaClient({ datasourceUrl: REPLICA_URL });
-- แˆˆแˆ›แŠ•แ‰ แ‰ฅ โ†’ replica (แ‹จแˆ›แŠ•แ‰ แ‰ฅ แŠ แ‰…แˆแŠ• 10x แ‹ซแˆณแ‹ตแŒ‹แˆ!)
-- แˆˆแˆ˜แƒแ โ†’ primary (ConsistencyแŠ• แˆˆแˆ˜แŒ แ‰ แ‰…!)
๐Ÿ“
CAP Theorem โ€” แˆฆแˆตแ‰ฑแŠ•แˆ แ‰ แŠ แŠ•แ‹ต แˆ‹แ‹ญ แˆ›แŒแŠ˜แ‰ต แŠ แ‹ญแ‰ปแˆแˆ! Consistency + Availability + Partition Tolerance โ€” แŠจแАแ‹šแˆ… แ‹แˆตแŒฅ แˆแˆˆแ‰ฑแŠ• แ‰ฅแ‰ป แАแ‹ แˆ˜แˆแˆจแŒฅ แ‹จแˆšแ‰ปแˆˆแ‹แข MongoDB = AP แ‹ญแˆ˜แˆญแŒฃแˆแฃ PostgreSQL แ‹ฐแŒแˆž = CPแข แ‹ญแˆ… Trade-off แ‰ แˆตแˆซ แ‰ƒแˆˆแˆ˜แŒ แ‹ญแ‰†แ‰ฝ แˆ‹แ‹ญ แˆแˆแŒŠแ‹œ แ‹ญแŒ แ‹จแ‰ƒแˆ!
C
Consistency
แˆแˆ‰แˆ nodes แŠ แŠ•แ‹ต แŠ แ‹ญแАแ‰ต แ‹ณแ‰ณ แŠ แˆ‹แ‰ธแ‹แข แˆแˆŒแˆ แ‰ตแŠฉแˆต (fresh) แˆ˜แˆจแŒƒ แ‹ญแŒˆแŠ›แˆแข
A
Availability
แˆแˆแŒŠแ‹œ แˆแˆ‹แˆฝ (response) แ‹ญแˆฐแŒฃแˆแข Error แŠ แ‹ซแˆณแ‹ญแˆแข
P
Partition Tolerance
Network แ‰ขแ‰‹แˆจแŒฅแˆ แŠฅแŠ•แŠณ แˆ˜แˆตแˆซแ‰ฑแŠ• แ‹ญแ‰€แŒฅแˆ‹แˆแข (แ‰ แŠฅแ‹แАแ‰ฐแŠ› แ‹“แˆˆแˆ แˆตแˆญแ‹“แ‰ถแ‰ฝ P แŒแ‹ดแ‰ณ แАแ‹)แข
INTERVIEWSystem Design แ‹จแˆฅแˆซ แ‰ƒแˆˆแˆ˜แŒ แ‹ญแ‰†แ‰ฝ (Q&A)real questions
LABArchitecture Decision Lab
๐Ÿ—๏ธ Architecture Simulator
Scaling
Cache Hit
Design

แ‹จแ‰ฐแŒ แ‰ƒแˆšแ‹Žแ‰ฝแŠ• แ‰แŒฅแˆญ แŒจแˆแˆฉ โ†’ แˆแŠ• แ‹“แ‹ญแАแ‰ต Scale strategy แŠฅแŠ•แ‹ฐแˆšแ‹ซแˆตแˆแˆแŒ‹แ‰ฝแˆ แ‰ฐแˆ˜แˆแŠจแ‰ฑ!

โ† Users แ‹จแˆšแˆˆแ‹แŠ• แˆแˆจแŒก

แ‹จ Cache hit rate แŠจ DB แŒญแАแ‰ต (load) แŒ‹แˆญ แ‹ซแˆˆแ‹แŠ• แŒแŠ•แŠ™แАแ‰ต แ‹ญแˆ˜แˆแŠจแ‰ฑแข

Cache Hit Rate: 0%
โ† Sliderแ‹แŠ• แŠ แŠ•แ‰€แˆณแ‰…แˆฑ

แˆแŠ• แ‹“แ‹ญแАแ‰ต แŠ แ•แˆŠแŠฌแˆฝแŠ• แАแ‹? โ†’ แˆˆแŠฅแˆฑ แ‹จแˆšแˆ˜แŒฅแАแ‹แŠ• Architecture แŠฅแŠ“แˆณแ‹ซแˆˆแŠ•แข

โ† แŠ แ•แˆŠแŠฌแˆฝแŠ‘แŠ• แˆแˆจแŒก โ†’ Architectureแ‹แŠ• แ‹ญแˆฐแŒฃแ‰ฝแŠ‹แˆ
TESTSystem Design Quiz
โ“ แŠฅแŠ•แ‹ฐ Twitter แ‹ซแˆˆ แŠ แ•แˆŠแŠฌแˆฝแŠ• (1M แ‰ฐแŒ แ‰ƒแˆšแ‹Žแ‰ฝ แ‹ซแˆ‰แ‰ต) โ€” แŠ แ‹ณแ‹ฒแˆต แ–แˆตแ‰ถแ‰ฝแŠ• แ‰ แแŒฅแАแ‰ต แˆˆแˆ›แ‹ตแˆจแˆต แˆแŠ• แ‹“แ‹ญแАแ‰ต แŠ แ‹ˆแ‰ƒแ‰€แˆญ (Architecture) แ‰ตแŒ แ‰€แˆ›แˆ‹แ‰ฝแˆ?
Aแˆˆแˆแˆ‰แˆ แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰€แŒฅแ‰ณ แ‹ˆแ‹ฐ DB แˆ˜แˆ„แ‹ต (SELECT * FROM posts ORDER BY time)
BแˆˆแŠ แАแˆตแ‰ฐแŠ›แˆ แˆ†แА แˆˆแ‰ตแˆแ‰… แˆตแˆซ MicroservicesแŠ• แ‰ แˆแˆ‰แˆ แ‰ฆแ‰ณ แˆ˜แŒ แ‰€แˆ
CFeedแ‹แŠ• แ‰€แ‹ตแˆž แŠ แ‹˜แŒ‹แŒ…แ‰ถ Redis แ‹แˆตแŒฅ แˆ›แˆตแ‰€แˆ˜แŒฅ (Write-time fan-out)แข แ‰ แ‹šแˆ… แŒŠแ‹œ แˆ›แŠ•แ‰ แ‰ฅ แˆ›แˆˆแ‰ต Cache hit แАแ‹! โœ…
DCDNแŠ• แ‰ฅแ‰ป แˆ˜แŒ แ‰€แˆ โ€” แŠฅแˆฑ แˆˆ static content แ‰ฅแ‰ป แАแ‹ แ‹จแˆšแ‹ซแŒˆแˆˆแŒแˆˆแ‹