การเขียน 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 รวมถึงการจำกัดการอัปเดตข้อมูล ทั้งหมดนี้จะช่วยให้ระบบมีประสิทธิภาพและตอบสนองได้อย่างรวดเร็ว