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
// ... (เริ่มต้นเหมือนบทก่อนหน้า ข้ามไปที่ 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 วินาที
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 รองรับโหลดที่สูงขึ้นได้อย่างมีประสิทธิภาพ โดยไม่ต้องขยายโครงสร้างเซิร์ฟเวอร์โดยไม่จำเป็น
