
การเขียน API แบบ Real-time โดยที่ระบบไม่ทำงานหนักจนเกินไปนั้น ต้องเน้นเรื่องการใช้ทรัพยากรที่มีประสิทธิภาพ การจัดการการเชื่อมต่อ และการลดการโหลดที่ไม่จำเป็น เราสามารถทำได้ด้วยหลายวิธี โดยใช้เทคโนโลยีและแนวทางที่เหมาะสมในการพัฒนาระบบ API แบบ Real-time ดังนี้
การส่งข้อมูลแบบ Real-time ด้วย WebSocket จะช่วยลดภาระของระบบเมื่อเทียบกับการส่งแบบ HTTP แบบปกติ เนื่องจาก WebSocket จะเชื่อมต่อแบบ persistent หรือการเชื่อมต่อแบบถาวร ทำให้ไม่ต้องเปิดและปิดการเชื่อมต่อใหม่ทุกครั้งที่มีการส่งข้อมูลเหมือน HTTP
Socket.io เป็นไลบรารียอดนิยมที่ช่วยให้การใช้งาน WebSocket เป็นไปอย่างง่ายดาย โดยมีฟีเจอร์เพิ่มเติมที่ช่วยให้การจัดการการเชื่อมต่อทำได้สะดวกขึ้นPub/Sub (Publisher/Subscriber) เป็นสถาปัตยกรรมที่เหมาะกับแอปพลิเคชันที่มีการส่งข้อมูลแบบเรียลไทม์และต้องการให้ผู้ใช้หลายคนรับข้อมูลพร้อมกัน โดย Publisher จะส่งข้อมูลไปยัง "Channel" และ Subscriber จะติดตามข้อมูลจาก Channel นั้นๆ
การส่งข้อมูลแบบ Real-time ควรมีการจำกัดจำนวนครั้งที่ส่งเพื่อลดภาระของเซิร์ฟเวอร์ ตัวอย่างเช่น การส่งข้อมูลตำแหน่ง (location) ในแอปที่เกี่ยวข้องกับแผนที่ สามารถอัปเดตข้อมูลทุก 1-2 วินาที แทนที่จะอัปเดตทุก 100 มิลลิวินาที ซึ่งช่วยลดภาระของระบบและทำให้ผู้ใช้ไม่ต้องรับข้อมูลมากเกินไป
ในกรณีที่มีการเชื่อมต่อพร้อมกันจำนวนมาก ควรพิจารณาใช้ Load Balancer เพื่อกระจายโหลดไปยังหลายเซิร์ฟเวอร์ เช่น ใช้ NGINX หรือ HAProxy ในการกระจายคำขอไปยังเซิร์ฟเวอร์ที่รองรับได้ เพื่อป้องกันไม่ให้เซิร์ฟเวอร์หนึ่งต้องรับภาระหนักจนเกินไป
ในกรณีที่ต้องการดึงข้อมูลแบบ real-time การใช้ฐานข้อมูลแบบ In-memory เช่น Redis หรือ Memcached จะช่วยลดเวลาในการตอบสนองและลดภาระของฐานข้อมูลหลัก (Database) ที่อาจทำให้ระบบช้าลง
การใช้ Message Queue เช่น RabbitMQ หรือ Kafka จะช่วยจัดการการส่งข้อมูลในกรณีที่ไม่จำเป็นต้องส่งแบบ real-time เสมอไป ทำให้ระบบสามารถทำงานได้อย่างมีประสิทธิภาพมากขึ้น
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = socketIo(server, {
cors: {
origin: "*",
methods: ["GET", "POST"]
}
});
io.on('connection', (socket) => {
console.log('A user connected:', socket.id);
// รับข้อมูลจากไคลเอนต์
socket.on('sendMessage', (data) => {
console.log('Message received:', data);
// ส่งข้อมูลกลับไปยังไคลเอนต์ทั้งหมด
io.emit('receiveMessage', data);
});
socket.on('disconnect', () => {
console.log('User disconnected:', socket.id);
});
});
server.listen(3000, () => {
console.log('Server is running on port 3000');
});
ในตัวอย่างนี้ Socket.io จะเปิดการเชื่อมต่อแบบ WebSocket ให้ผู้ใช้สามารถส่งข้อความหาเซิร์ฟเวอร์และส่งกลับไปยังไคลเอนต์อื่นๆ แบบ Real-time
การเขียน API แบบ Real-time ที่ทำให้ระบบไม่หนักเกินไปจะต้องคำนึงถึงการจัดการทรัพยากร, การเลือกเทคโนโลยีที่เหมาะสม เช่น WebSocket, Pub/Sub, Load Balancing, In-memory database รวมถึงการจำกัดการอัปเดตข้อมูล ทั้งหมดนี้จะช่วยให้ระบบมีประสิทธิภาพและตอบสนองได้อย่างรวดเร็ว