เบ็ดเตล็ดโดย ผู้ดูแลระบบ อ่าน 6 นาที

คู่มือฉบับนักพัฒนาเกม: ลึกซึ้ง WebSocket, ข้อจำกัดการเชื่อมต่อ และสเป็กเซิร์ฟเวอร์ที่ต้องรู้

สร้างเกมเรียลไทม์ที่รองรับผู้เล่นหมื่นคนพร้อมกัน เริ่มจากการทำงานของ WebSocket, ข้อดี-ข้อเสีย, ไปจนถึงการคำนวณสเป็กเซิร์ฟเวอร์และการบริหารจำนวน Connection สูงสุด

สารบัญ

web_socket เคยสงสัยไหมว่า ทำไมเกม MMO บางเกมรองรับผู้เล่น 10,000 คนในเซิร์ฟเวอร์เดียวกันได้ลื่นไหล แต่บางเกมแค่ 500 คนก็แลคจนเล่นไม่ได้? คำตอบไม่ได้อยู่แค่ที่โค้ด แต่อยู่ที่โปรโตคอลและสถาปัตยกรรมเซิร์ฟเวอร์

สำหรับนักพัฒนาเกมที่ต้องการสร้างเกมเรียลไทม์ (Real-time) การเข้าใจ WebSocket ให้ถ่องแท้คือหัวใจสำคัญ บทความนี้จะพาคุณไล่ตั้งแต่พื้นฐานไปจนถึงการปรับแต่ง OS เพื่อรองรับ Connection สูงสุด

พื้นฐาน WebSocket ที่นักพัฒนาเกมต้องรู้

HTTP แบบเดิมคือการสื่อสารแบบจบในตัว (Stateless) ถ้าเซิร์ฟเวอร์ต้องการส่งข้อมูลให้ผู้เล่น ผู้เล่นต้องยิงคำขอ (Request) มาก่อน ซึ่งไม่เหมาะกับเกมที่ต้องการการตอบสนองทันที

WebSocket แก้ปัญหานี้ด้วยการอัปเกรดการเชื่อมต่อ HTTP ให้กลายเป็นช่องทางสื่อสารแบบ Full-duplex บน TCP ที่คงอยู่ตลอดเวลา (Persistent Connection)

  • ลด Latency: ไม่ต้องตั้งค่า Header ใหม่ทุกครั้ง ลด Overhead ของข้อมูลลงได้กว่า 80%
  • สองทางพร้อมกัน: เซิร์ฟเวอร์สามารถ Push ข้อมูลไปหาผู้เล่นได้ทันทีที่เกิด Event

ข้อดีและข้อเสียของ WebSocket ในเกม

ข้อดี

  1. เหมาะกับเกมวางแผน/สร้างบ้าน: ข้อมูลที่ต้องการความถูกต้อง 100% (Reliable Delivery) เช่น การซื้อขายไอเทม การอัปเดตตำแหน่งบ้าน
  2. ใช้งานง่ายบน Web: รองรับโดย Browser ทุกตัว ทำให้เกม HTML5 หรือเกมบนเว็บทำงานได้คล่องตัว
  3. ผ่าน Firewall ได้ดี: ใช้พอร์ต 80 และ 443 ทำให้ไม่โดนบล็อกจาก Network สาธารณะ

ข้อเสียและข้อจำกัด

  1. เป็น Stateful: เซิร์ฟเวอร์ต้องจดจำสถานะผู้เล่นตลอดเวลา ทำให้การขยายระบบ (Scale) ทำได้ยากกว่า HTTP แบบปกติ
  2. TCP Head-of-Line Blocking: ถ้าแพ็กเก็ตหนึ่งหายไป แพ็กเก็ตถัดไปจะถูกหยุดรอจนกว่าจะได้รับแพ็กเก็ตที่หายใหม่ ทำให้ไม่เหมาะกับเกมแอ็คชั่นเร็วๆ อย่าง FPS
  3. กินทรัพยากร: แต่ละ Connection จะครอบครอง Memory และ File Descriptor ของ OS

ข้อจำกัดการเชื่อมต่อสูงสุด (Max Connections)

จำนวนผู้เล่นที่เซิร์ฟเวอร์รับได้ ไม่ได้จำกัดแค่ที่แบนด์วิดท์ แต่จำกัดที่ระดับ OS และ Hardware ครับ

  1. File Descriptor Limit: OS แบบ Linux มอบแต่ละ Process ให้เปิดไฟล์หรือ Socket ได้จำกัด (ปกติ 1024) ต้องขยายค่านี้
  2. Memory: แต่ละ TCP Connection จะใช้ RAM ในการเก็บ Buffer โดยเฉลี่ย 50-100 KB ต่อ Connection
  3. CPU: การเข้ารหัส SSL/TLS และการจัดการ Heartbeat จะกิน CPU สูงมากถ้ามี Connection หลักแสน

สเป็กเซิร์ฟเวอร์ที่ต้องการ (Hardware & System Tuning)

ถ้าคุณต้องการทำเกมที่รองรับผู้เล่นพร้อมกัน นี่คือสเป็กฮาร์ดแวร์และการปรับแต่งระบบที่ควรคำนึงถึง

จำนวนผู้เล่นพร้อมกัน (CCU) CPU RAM แบนด์วิดท์ หมายเหตุ
1,000 - 5,000 2-4 Cores 4-8 GB 100 Mbps เหมาะกับเซิร์ฟเวอร์เริ่มต้น ใช้ Node.js/Go ทั่วไป
10,000 - 50,000 8-16 Cores 16-32 GB 1 Gbps ต้องปรับ OS Tuning และใช้ภาษา Low-latency อย่าง C++/Rust
100,000+ 32+ Cores 64+ GB 10 Gbps ต้องใช้สถาปัตยกรรม Cluster และ Load Balancer

การปรับแต่ง OS (Linux)

เพื่อให้รองรับ Connection สูงๆ คุณต้องไปยกเลิกข้อจำกัดเริ่มต้นของ Linux ครับ

1. ยกเลิกจำกัด File Descriptors แก้ไขไฟล์ /etc/security/limits.conf

* soft nofile 1000000
* hard nofile 1000000

2. ปรับแต่ง Kernel Parameter แก้ไขไฟล์ /etc/sysctl.conf เพื่อขยาย TCP Buffer และพอร์ตให้กว้างขึ้น

net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.core.somaxconn = 65535

สถาปัตยกรรมขั้นสูง: การกระจายโหลด (Scaling)

เมื่อเซิร์ฟเวอร์เดียวรับไม่ไหว การทำ Horizontal Scaling คือคำตอบ แต่เนื่องจาก WebSocket เป็น Stateful เราจึงต้องใช้ Load Balancer ที่รองรับ WebSocket อย่าง HAProxy หรือ Nginx

  • Sticky Session: ผูกผู้เล่นเข้ากับเซิร์ฟเวอร์ตัวใดตัวหนึ่ง เพื่อไม่ให้หลุดการเชื่อมต่อ
  • Redis Pub/Sub: ใช้เป็นศูนย์กลางส่งข้อมูลระหว่างเซิร์ฟเวอร์ เช่น ผู้เล่น A อยู่เซิร์ฟเวอร์ 1 คุยกับผู้เล่น B อยู่เซิร์ฟเวอร์ 2 ข้อมูลจะวิ่งผ่าน Redis

เคล็ดลับและข้อควรระวัง

  • หลีกเลี่ยง JSON ในเกมแอ็คชั่น: JSON มีขนาดใหญ่และต้องใช้ CPU ในการ Parse แนะนำให้ใช้ Binary Format อย่าง Protocol Buffers หรือ FlatBuffers แทน
  • อย่าลืม Heartbeat: ถ้าผู้เล่นหลุดไปโดยไม่ปิด Connection เซิร์ฟเวอร์ต้องส่ง Ping ไปหา ถ้าไม่ได้รับ Pong ภายใน 30 วินาที ให้ตัดการเชื่อมต่อทิ้งเพื่อคืนทรัพยากร
  • ระวัง DDoS: การเปิด WebSocket ใหม่ไม่ยาก ควรมีระบบ Rate Limiting ในการสร้าง Connection ใหม่เพื่อกัน Bot ป่วน

คำถามที่พบบ่อย (FAQ)

Q: WebSocket ใช้พอร์ตอะไร? A: เริ่มต้นด้วย HTTP พอร์ต 80 หรือ 443 (สำหรับ WSS) จากนั้นจะอัปเกรดเป็น WebSocket บน TCP พอร์ตเดียวกัน

Q: ควรใช้ WebSocket หรือ UDP สำหรับเกมแนว MOBA? A: แนะนำ UDP ครับ เพราะ MOBA ต้องการ Latency ต่ำสุดขีด หากแพ็กเก็ตหายไปบางส่วนระบบสามารถ Extrapolate ตำแหน่งตัวละครได้ ไม่ต้องรอส่งใหม่เหมือน TCP

Q: 1 เซิร์ฟเวอร์รับได้สูงสุดกี่ Connection? A: ทางทฤษฎีรับได้หลักแสนถึงหลักล้าน แต่ในทางปฏิบัติมักจะติดที่ RAM (เช่น 16GB RAM รับได้ประมาณ 100,000 - 150,000 Connection) และความเร็ว CPU ในการประมวลผล Logic ของเกม


พร้อมลงมือปรับสถาปัตยกรรมเซิร์ฟเวอร์เกมของคุณให้รองรับผู้เล่นหมื่นคนแล้วหรือยัง? ลองนำเทคนิคการปรับ OS ไปใช้ดู แล้วอย่าลืมแชร์ประสบการณ์กลับมาคุยกันได้นะครับ

คำถามชวนคุย: ในเกมเรียลไทม์ที่คุณกำลังพัฒนา คุณเลือกใช้ WebSocket, UDP หรือ WebRTC ในการจัดการตำแหน่งผู้เล่นกันบ้าง? มาแลกเปลี่ยนกันได้ในคอมเมนต์ครับ!

บทความนี้เป็นอย่างไร?

ยังไม่มีความคิดเห็น — มาเป็นคนแรกกันเถอะ!