Skip to content

Live Dashboard Architecture

ในการพัฒนาระบบ Live Dashboard หรือหน้าจอแสดงผลข้อมูลเรียลไทม์ (เช่น กระดานแสดงราคาคริปโตเคอร์เรนซี, กราฟ Server Monitoring, หรือระบบนับจำนวนผู้ใช้งานขณะปัจจุบัน) สถาปัตยกรรมที่เหมาะสมคือหัวใจสำคัญ

🎯 เป้าหมาย: เปลี่ยนผ่านจากการใช้ Client-Side Polling (การให้ Frontend ร้องขอข้อมูลผ่าน API ถี่ๆ) ซึ่งสร้างภาระต่อฐานข้อมูลอย่างมหาศาล ไปสู่ระบบ Event-Driven Publishing ที่มีความยั่งยืนและรองรับ Concurrency สูง


🏗️ 1. สถาปัตยกรรมระบบ (The Concept)

  • การใช้ Polling กับผู้ใช้งาน 5,000 Concurrent Users ที่ดึงข้อมูลทุกๆ 1 วินาที จะทำให้เซิร์ฟเวอร์ต้องรับภาระถึง 5,000 Requests/วินาที (RPS) ส่งผลให้เกิดคอขวดที่ระดับฐานข้อมูล
  • แนวคิดที่เหมาะสมคือการให้ Backend Service (Worker) ดึงข้อมูลเพียง 1 ครั้ง/รอบเวลา จากนั้นดำเนินการกระจายข้อมูล (Broadcasting) ผ่าน REST API ของ RawPush
  • RawPush Gateway จะดำเนินการ Fan-out ข้อมูลไปยัง Clients ทั้ง 5,000 เครื่องโดยอัตโนมัติ ช่วยลดโหลดมหาศาลจาก Origin Server ของคุณ

💻 2. โค้ดฝั่ง Frontend (Subscriber)

ฝั่ง Client เพียงตรวจสอบและ Subscribe เข้าสู่ Channel dashboard:metrics

javascript
```javascript
// ... (เริ่มต้นเหมือนบทก่อนหน้า ข้ามไปที่ onmessage)
ws.onmessage = (event) => {
   const msg = JSON.parse(event.data);
   
   if (msg.type === 'reply' && msg.status === 'ok' && msg.data?.session_id) {
       // ขอเกาะฟังกราฟห้องสถิติของเว็บ
       ws.send(JSON.stringify({ cmd: "subscribe", channel: "dashboard:metrics" }));
   }
   
   if (msg.event === "chart.update") {
       // ถ้า Backend ยิง Data ใหม่ออกมา โค้ดส่วนนี้จะทำงาน!
       
       const usersOnline = msg.data.active_users;
       const dbPing = msg.data.db_ping_ms;
       
       // อัปเดต UI ทันทีเมื่อได้รับ Event
       document.getElementById("online-counter").innerText = usersOnline + " คน";
       document.getElementById("ping-status").style.height = dbPing + "px";
   }
};

⚙️ 3. โค้ดฝั่ง Backend (Publisher Worker)

ระบบเบื้องหลังสามารถใช้กระบวนการทาง Background (เช่น CronJob หรือ Service Worker) ทำการประมวลผลข้อมูลตามรอบระยะเวลา และใช้งาน RawPush API เพื่อส่งออกข้อมูล

ตัวอย่างสคริปต์ Python สำหรับรวบรวม Metrics ทุกๆ 3 วินาที

python
import time
import requests
import random

API_KEY = "sk_your_dashboard_secret_key"
RAWPUSH_URL = "https://api.rawpush.com/api/v1/publish"

def get_live_metrics_from_my_database():
    # สมมติไป Query ดึงออกมาจากเซิร์ฟเวอร์ตัวเอง
    return {
        "active_users": random.randint(100, 500), # ตัวเลขมั่วจำลอง
        "db_ping_ms": random.randint(10, 55)
    }

while True:
    try:
        metrics = get_live_metrics_from_my_database()
        
        # broadcast ไปหา Client 5,000 ตัวผ่าน RawPush
        payload = {
            "channel": "dashboard:metrics",
            "event": "chart.update",
            "data": metrics
        }
        
        headers = {"X-Api-Key": API_KEY, "Content-Type": "application/json"}
        requests.post(RAWPUSH_URL, json=payload, headers=headers)
        
        print(f"✅ Published update: {metrics}")
        
    except Exception as e:
        print("❌ Data collection failed:", e)
        
    time.sleep(3) # รอบเวลาในการอัปเดต (3 วินาที)

🎉 สรุปผลด้าน Resource Optimization

สถาปัตยกรรมแบบ Event-Driven (Push Model) ดังที่กล่าวขึ้นสามารถลด Bandwidth และ Resource consumption ด้านการสอบถามข้อมูล (Polling) ลงได้กว่า 99.9% ทำให้ระบบของคุณสามารถ Scaling รองรับโหลดที่สูงขึ้นได้อย่างมีประสิทธิภาพ โดยไม่ต้องขยายโครงสร้างเซิร์ฟเวอร์โดยไม่จำเป็น

Released under the MIT License.