IT General
น้องๆ เคยสงสัยมั้ยว่าทำไมบางแอปถึงอัพเดทฟีเจอร์ใหม่ๆ ได้เร็วจัง หรือทำไมบางแอปถึงล่มทีนึงแล้วกระทบไปหมด? นั่นแหละคือประเด็นของ Microservices กับ Monolith เลย สมัยผมทำร้านเน็ตฯ นะ เว็บไซต์ร้านก็เป็น Monolith นี่แหละ แก้ตรงนี้ทีไร ต้องเทสทั้งเว็บ กลัวมันเจ๊งทั้งระบบ
Microservices ง่ายๆ เลยคือการซอยระบบใหญ่ๆ ออกเป็นชิ้นเล็กๆ แต่ละชิ้นทำงานของตัวเองได้ ไม่ขึ้นต่อกันมากนัก เหมือนร้านอาหารที่มีครัวหลายแผนก แผนกส้มตำเสีย ก็ไม่ได้ทำให้แผนกสเต็กล่มไปด้วย
Monolith ตรงกันข้าม คือทุกอย่างรวมกันเป็นก้อนเดียว เหมือนร้านอาหารที่มีครัวเดียว ทำทุกอย่างในนั้น ถ้าครัวมีปัญหา ร้านก็จบเห่
ทำไมถึงสำคัญน่ะเหรอ? โลกมันเปลี่ยนไปไวไงน้อง ฟีเจอร์ใหม่ๆ ต้องออกรัวๆ ถ้าเป็น Monolith แก้ทีนึงก็ยาก อัพเดททีนึงก็เสี่ยง Microservices มันตอบโจทย์ตรงนี้แหละ SiamCafe Blog เราก็เคยเขียนเรื่องนี้ไว้นานแล้ว ลองไปอ่านดูได้นะ
Microservices มักจะรันบน Containers (เช่น Docker) เพราะมันทำให้แต่ละ Service เป็นอิสระจากกัน และ Deploy ได้ง่าย Orchestration (เช่น Kubernetes) ก็สำคัญ เพราะมันช่วยจัดการ Containers เหล่านี้ให้ทำงานร่วมกันได้อย่างราบรื่น
# Dockerfile example
FROM node:16
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
สมัยก่อนนะ Deploy ทีก็ต้อง SSH เข้าไปแก้ไฟล์ทีละเครื่อง เดี๋ยวนี้ Docker ช่วยชีวิตไว้เยอะ
เนื่องจาก Microservices แต่ละตัวทำงานแยกกัน การเข้าถึง Service เหล่านี้จากภายนอกจะต้องผ่าน API Gateway มันทำหน้าที่เป็นทางเข้าเดียว และจัดการ Routing, Authentication, และ Authorization
// Example API Gateway route (using Express.js)
app.use('/users', userRouter);
app.use('/products', productRouter);
คิดง่ายๆ ว่า API Gateway คือ Front Desk ของโรงแรม ที่คอยบอกว่าใครต้องไปห้องไหน
เอาล่ะ มาถึงส่วนที่ Actionable กันบ้าง เริ่มจาก...
ข้อนี้สำคัญมาก ต้องคิดให้ดีว่าอะไรควรอยู่ Service ไหน อย่าให้ Service ใหญ่เกินไป หรือเล็กเกินไปจนจัดการยาก สมัยผมทำเว็บร้านเน็ตฯ ถ้าซอยย่อยเกินไป คงมี Service เป็นร้อย
ลองคิดถึง E-commerce Site นะ อาจจะมี Services สำหรับ: User Management, Product Catalog, Order Management, Payment Processing
Microservices สื่อสารกันผ่าน API ดังนั้นต้องกำหนด API Contracts ให้ชัดเจน ว่าแต่ละ Service จะรับส่งข้อมูลอะไรกันบ้าง ใช้ Format อะไร (เช่น JSON, Protobuf)
// Example API Contract (JSON)
{
"userId": "123",
"productId": "456",
"quantity": 2
}
เหมือนทำสัญญาซื้อขาย ต้องตกลงกันให้ดีก่อนว่าอะไรคืออะไร
เนื่องจาก Microservices อาจจะมีการเปลี่ยนแปลง IP Address หรือ Port บ่อยๆ Service Discovery จะช่วยให้ Services หา Service อื่นๆ เจอได้อัตโนมัติ
Kubernetes มี Service Discovery built-in เลย สะดวกมาก
แน่นอนว่า Microservices ไม่ใช่ Silver Bullet มันมีข้อดีข้อเสียต่างกันไป
| Feature | Monolith | Microservices |
|---|---|---|
| Deployment | ง่ายกว่า | ซับซ้อนกว่า |
| Scalability | ยากกว่า (ต้อง Scale ทั้งระบบ) | ง่ายกว่า (Scale เฉพาะ Service ที่ต้องการได้) |
| Fault Isolation | แย่ (ล่มที ล่มทั้งระบบ) | ดี (ล่มแค่ Service เดียว) |
| Development Speed | อาจจะเร็วกว่าในระยะแรก | อาจจะช้ากว่าในระยะแรก แต่เร็วกว่าในระยะยาว |
สรุปง่ายๆ ถ้าโปรเจกต์เล็กๆ ไม่ซับซ้อน Monolith ก็ยังเป็นทางเลือกที่ดี แต่ถ้าโปรเจกต์ใหญ่ๆ ต้องการ Scalability และ Fault Isolation Microservices จะตอบโจทย์กว่า
สำหรับคนที่อยากรู้ลึกกว่านี้ ลองไปอ่านบทความอื่นๆ ใน SiamCafe Blog ดูนะ มีเรื่อง IT อีกเยอะเลยที่น่าสนใจ
มาถึงเรื่องเคล็ดลับที่สั่งสมมาตั้งแต่สมัยร้านเน็ตคาเฟ่เฟื่องฟู สมัยนั้นยังไม่มี Microservices หรอกนะ มีแต่ Server ตัวเดียวทำทุกอย่าง (Monolith) แต่หลักการหลายๆ อย่างเอามาประยุกต์ใช้ได้
1. Observe everything: สมัยก่อน Server แฮงค์ทีนี่ลูกค้าโวยวายกันลั่นร้าน ผมเลยต้องหาวิธี Monitor Server แบบ Real-time สมัยนี้ก็เหมือนกัน Microservices เยอะแยะไปหมด ต้องมี Logging, Metrics, Tracing ที่ดี ไม่งั้นตามแก้ปัญหากันหัวหมุน
# ตัวอย่าง Logging (Python)
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info("User logged in: %s", username)
2. Automate everything: สมัยก่อนลง Windows ใหม่ทีนึงนี่เป็นวันๆ เดี๋ยวนี้มี Docker, Kubernetes ทำให้ Deploy ง่ายขึ้นเยอะ แต่ก็ต้อง Automate ให้เป็นระบบ ตั้งแต่ Build, Test, Deploy ไม่งั้นเดี๋ยวเกิด Human Error
3. Keep it simple: อย่าทำอะไรให้มันซับซ้อนเกินความจำเป็น Microservice แต่ละตัวควรจะเล็กและทำหน้าที่เดียว (Single Responsibility Principle) ถ้า Service ไหนใหญ่เกินไป ก็แยกออกมาอีก
4. Design for failure: ระบบมันต้องพังได้เสมอ เตรียมแผนรับมือไว้ล่วงหน้า Circuit Breaker, Retry Mechanism ต้องมี อย่าให้ Service ตัวนึงล่มแล้วล่มทั้งระบบ
ผมเคยเจอเคสที่ Database ของร้านเกมเจ๊ง เพราะไฟดับ ทำให้ลูกค้าเล่นเกมไม่ได้กันทั้งร้าน เลยต้องหา UPS มาสำรองไฟ และทำ Backup Database เป็นประจำ
ไม่เสมอไปครับ Project เล็กๆ อาจจะไม่คุ้มที่จะทำ Microservices เพราะมันจะ Overkill ไปหน่อย Monolith อาจจะเหมาะสมกว่า แต่ถ้า Project ใหญ่และมีทีมพัฒนาหลายทีม Microservices จะช่วยให้ทำงานได้ง่ายขึ้น
ยากกว่าแน่นอนครับ เพราะต้องจัดการเรื่อง Network, Security, Distributed Tracing, และอื่นๆ อีกมากมาย แต่ถ้าทำได้ดี มันจะ Scale ได้ดีกว่าและมีความยืดหยุ่นมากกว่า
เริ่มจาก Project เล็กๆ ก่อนครับ ลองทำ Service สักตัวนึง แล้วค่อยๆ ขยายไปเรื่อยๆ อย่าพยายามทำทุกอย่างพร้อมกัน
เลือก Technology ที่ทีมเราถนัดครับ ไม่จำเป็นต้องใช้ Technology ใหม่ล่าสุดเสมอไป ขอแค่ตอบโจทย์และทีมเรา Support ได้ก็พอ
Microservices ไม่ใช่ Silver Bullet ที่จะแก้ปัญหาได้ทุกอย่าง ต้องพิจารณาให้ดีว่าเหมาะสมกับ Project ของเราหรือไม่ แต่ถ้าทำได้ดี มันจะช่วยให้ระบบของเรา Scale ได้ดีขึ้นและมีความยืดหยุ่นมากขึ้น iCafeForex ใครสนใจเรื่อง Microservices ลองศึกษาเพิ่มเติมได้จาก SiamCafe Blog นะครับ