การขยายระบบให้รองรับผู้ใช้หลายล้านคนเป็นกระบวนการที่ซับซ้อนและต้องปรับปรุงอย่างต่อเนื่อง บทนี้จะอธิบายวิธีเริ่มต้นด้วย Server เดียวและขยายสถาปัตยกรรมทีละขั้นเพื่อรองรับผู้ใช้หลายล้านคน
ภาพที่ 1: สถาปัตยกรรม Single Server - ทุก Component อยู่บน Server เดียว
บทนำ
การออกแบบระบบที่รองรับผู้ใช้หลายล้านคนต้องอาศัยการปรับปรุงและเพิ่มประสิทธิภาพอย่างต่อเนื่อง ในบทนี้เราจะเรียนรู้การเริ่มต้นด้วยการตั้งค่า Server เดียวและขยายสถาปัตยกรรมทีละขั้น
1. การตั้งค่า Server เดียว
ในขั้นต้น ทุก Component (Web App, Database, Cache) ทำงานบน Server เดียว
ภาพที่ 2: การตั้งค่า Server เดียว
โฟลว์ของ Request
- ผู้ใช้เข้าถึงแอปพลิเคชันผ่าน Domain Name เช่น
api.mysite.comซึ่งจะถูกแปลงเป็น IP Address โดย DNS - IP Address ของ Web Server จะถูกส่งกลับไปยัง Browser หรือ Mobile App
- HTTP Request จะถูกส่งไปยัง Web Server ซึ่งจะส่ง HTML หรือ JSON Response กลับมา
แหล่งที่มาของ Traffic
- Web Applications: ใช้ภาษาฝั่ง Server (เช่น Python, Java) สำหรับ Business Logic และภาษาฝั่ง Client (เช่น JavaScript, HTML) สำหรับ Presentation
- Mobile Applications: สื่อสารกับ Web Server โดยใช้ HTTP และ JSON สำหรับการแลกเปลี่ยนข้อมูลที่มีขนาดเล็ก
2. การแยก Database
เมื่อฐานผู้ใช้เติบโตขึ้น Database จะถูกย้ายไปยัง Server เฉพาะเพื่อให้สามารถขยาย Web Tier และ Database Tier ได้อย่างอิสระ
ภาพที่ 3: การแยก Database ออกจาก Web Server
ตัวเลือกของ Database
- Relational Databases (SQL): ข้อมูลที่มีโครงสร้างถูกจัดเก็บในตาราง ตัวอย่าง: MySQL, PostgreSQL
- Non-Relational Databases (NoSQL): เหมาะสำหรับข้อมูลที่ไม่มีโครงสร้างหรือต้องการ Latency ต่ำ
- Key-Value Stores
- Graph Databases
- Column Stores
- Document Stores
- แอปพลิเคชันต้องการ Latency ต่ำมาก
- ข้อมูลไม่มีโครงสร้าง หรือไม่มีความสัมพันธ์ระหว่างข้อมูล
- ต้องการจัดเก็บข้อมูลปริมาณมหาศาล
3. การขยายแนวตั้ง vs แนวนอน
การขยายแนวตั้ง (Vertical Scaling)
- เพิ่มทรัพยากร (CPU, RAM) ให้กับ Server ที่มีอยู่
- จำกัดด้วยข้อจำกัดของ Hardware และไม่มีความซ้ำซ้อน
การขยายแนวนอน (Horizontal Scaling)
ภาพที่ 4: การขยายแนวนอน - เพิ่ม Server หลายตัว
- เพิ่ม Server หลายตัวเข้าไปใน Pool ทำให้เหมาะสำหรับระบบขนาดใหญ่
- ใช้ Load Balancer เพื่อจัดการ Request Routing ระหว่าง Server
4. Load Balancer
Load Balancer กระจาย Traffic ไปยัง Server หลายตัว มีข้อดีดังนี้:
ภาพที่ 5: Load Balancer กระจาย Traffic ไปยัง Server หลายตัว
- ความซ้ำซ้อน: หาก Server ตัวหนึ่ง下线 Traffic จะถูก Route ไปยัง Server อื่น
- หาก Server 1 下线 Traffic ทั้งหมดจะถูก Route ไปยัง Server 2
- ความสามารถในการขยาย: เพิ่ม Server ได้ง่ายเพื่อรองรับ Traffic ที่เพิ่มขึ้น
5. Database Replication
ภาพที่ 6: Database Replication - Master-Slave
โมเดล Master-Slave
- Master Database: จัดการ Write Operations คำสั่งทั้งหมดที่แก้ไขข้อมูล เช่น Insert, Delete หรือ Update ต้องส่งไปยัง Master Database
- Slave Databases: จัดการ Read Operations ทำให้ประสิทธิภาพดีขึ้นและความน่าเชื่อถือสูงขึ้น
6. Cache
Cache เก็บข้อมูลที่เข้าถึงบ่อยในหน่วยความจำเพื่อลด Latency และ Load ของ Database
ภาพที่ 7: Cache Layer ช่วยลด Latency
7. CDN (Content Delivery Network)
CDN กระจาย Static Content ไปยัง Server ทั่วโลกเพื่อให้ผู้ใช้เข้าถึงได้เร็วขึ้น
ภาพที่ 8: CDN กระจาย Content ไปยัง Edge Locations
8. สถาปัตยกรรม Stateless
ย้าย Session Data ไปยัง Database เพื่อให้ Web Server ไม่ต้องเก็บ State
ภาพที่ 9: สถาปัตยกรรม Stateless
9. Data Center
การตั้ง Data Center หลายแห่งช่วยเพิ่มความพร้อมใช้งานและลด Latency สำหรับผู้ใช้ในภูมิภาคต่างๆ
ภาพที่ 10: Multi-Data Center Architecture
10. Logging และ Metrics
ระบบ Monitoring ช่วยติดตามสุขภาพของระบบและตรวจจับปัญหาได้เร็ว
ภาพที่ 11: Logging และ Metrics Collection
11. Message Queue
ใช้ Message Queue สำหรับ Asynchronous Communication ระหว่าง Services
ภาพที่ 12: Message Queue Architecture
สรุป
การขยายระบบจาก Server เดียวสู่ระบบที่รองรับผู้ใช้หลายล้านคนต้องผ่านขั้นตอนดังนี้:
- Single Server - เริ่มต้นง่าย
- Database Separation - แยก Database ออกมา
- Load Balancer - กระจาย Traffic
- Database Replication - เพิ่มความน่าเชื่อถือ
- Cache - เพิ่มความเร็ว
- CDN - กระจาย Static Content
- Stateless Architecture - ลดความซับซ้อน
- Multi-Data Center - เพิ่มความพร้อมใช้งาน
- Message Queue - Asynchronous Processing