IT General
น้องๆ หลายคนอาจจะเคยได้ยินคำว่า "Microservices" กันมาบ้างแล้ว แต่ยังไม่ค่อยเข้าใจว่ามันคืออะไรกันแน่ เอาแบบง่ายๆ เลยนะ สมัยผมทำร้านเน็ต SiamCafe เมื่อ 20 กว่าปีก่อนเนี่ย เรามีโปรแกรมคิดเงิน (Billing System) ตัวเดียว ทำทุกอย่าง ตั้งแต่ login, คิดเงิน, สรุปยอดขาย, จัดการสมาชิก ทุกอย่างรวมอยู่ในโปรแกรมเดียว ถ้าโปรแกรมตัวนี้มีปัญหา ทุกอย่างจบเห่! ลูกค้าเล่นไม่ได้ ร้านเจ๊ง! นี่แหละคือ Monolithic Architecture
Microservices เหมือนกับการที่เราแยกส่วนต่างๆ ของโปรแกรมคิดเงิน ออกเป็นส่วนย่อยๆ เช่น ส่วน login ก็เป็น service หนึ่ง ส่วนคิดเงินก็เป็นอีก service หนึ่ง ส่วนจัดการสมาชิกก็เป็นอีก service หนึ่ง ข้อดีคือ ถ้าส่วน login มีปัญหา ส่วนอื่นๆ ก็ยังทำงานได้อยู่ นี่คือหัวใจหลักของ Microservices ครับ คือการแบ่งโปรแกรมขนาดใหญ่ (Monolith) ออกเป็นบริการย่อยๆ ที่ทำงานแยกกันได้
แล้วทำไม Microservices ถึงสำคัญ? สมัยนี้โลกมันเปลี่ยนไปไวมาก! Requirement เปลี่ยนตลอดเวลา! ถ้าเราใช้ Monolith เวลาจะแก้ฟีเจอร์อะไรทีนึง ต้องแก้ทั้งโปรแกรม แล้วต้อง deploy ทั้งโปรแกรม เสียเวลามาก! Microservices ช่วยให้เราแก้เฉพาะส่วนที่เราต้องการแก้ แล้ว deploy เฉพาะส่วนนั้นได้เลย เร็วและคล่องตัวกว่าเยอะ!
Microservices คุยกันผ่าน API ครับ API ก็เหมือนกับเมนูอาหารในร้านอาหาร เราสั่งอาหาร (request) แล้วเชฟก็ทำอาหาร (process) แล้วเสิร์ฟอาหารให้เรา (response) Microservices ก็เหมือนกัน Service หนึ่งส่ง request ไปยังอีก service หนึ่ง อีก service หนึ่งก็ process แล้วส่ง response กลับมา
API ที่นิยมใช้กันก็คือ REST API ครับ REST ย่อมาจาก Representational State Transfer เป็นรูปแบบการออกแบบ API ที่เรียบง่ายและยืดหยุ่น ใช้ HTTP protocol ในการสื่อสาร
GET /users/{id} // ดึงข้อมูลผู้ใช้
POST /users // สร้างผู้ใช้ใหม่
PUT /users/{id} // แก้ไขข้อมูลผู้ใช้
DELETE /users/{id} // ลบผู้ใช้
Microservices มักจะถูก deploy ใน container ครับ Container ก็เหมือนกับกล่องที่เราใส่โปรแกรมของเราเข้าไป แล้วเอาไปรันที่ไหนก็ได้ ไม่ว่าจะเป็นเครื่องของเรา, Server ของบริษัท, หรือ Cloud Container ที่นิยมใช้กันก็คือ Docker
พอมี container เยอะๆ การจัดการก็เริ่มยากแล้วครับ เราเลยต้องมี Orchestration Tool มาช่วยจัดการ container เหล่านี้ Orchestration Tool ที่นิยมใช้กันก็คือ Kubernetes (K8s) Kubernetes ช่วยให้เรา deploy, scale, และ manage container ได้ง่ายขึ้น
การเริ่มต้นใช้งาน Microservices ไม่ใช่เรื่องง่ายครับ ต้องมีการวางแผนและออกแบบที่ดี เริ่มจาก...
ถ้าเรามีโปรแกรม Monolith อยู่แล้ว ขั้นตอนแรกคือการวิเคราะห์และแบ่งส่วนโปรแกรมออกเป็นส่วนย่อยๆ แต่ละส่วนควรจะมีความเป็นอิสระต่อกันมากที่สุด
ยกตัวอย่างเช่น โปรแกรมคิดเงินของ SiamCafe เราอาจจะแบ่งออกเป็น:
API Gateway ทำหน้าที่เป็นจุด entry point ของ Microservices ทั้งหมด Client จะคุยกับ API Gateway แทนที่จะคุยกับ Microservices โดยตรง API Gateway จะ route request ไปยัง Microservice ที่เหมาะสม
API Gateway ช่วยให้เรา:
# ตัวอย่าง routing configuration ใน API Gateway (ใช้ Nginx)
location /auth/ {
proxy_pass http://authentication-service/;
}
location /billing/ {
proxy_pass http://billing-service/;
}
Microservices สามารถสร้างด้วยภาษาโปรแกรมมิ่งและ framework ที่หลากหลาย เลือก technology stack ที่เหมาะสมกับทีมและความต้องการของเรา
ตัวอย่าง Technology Stack ที่นิยมใช้กัน:
อย่าลืมลองเข้าไปอ่านบทความอื่นๆ ใน SiamCafe Blog นะครับ มีเรื่อง IT สนุกๆ อีกเยอะเลย!
Microservices ไม่ใช่ Silver Bullet ครับ มันมีข้อดีข้อเสียแตกต่างกันไป ขึ้นอยู่กับสถานการณ์และ requirement ของแต่ละโปรเจค มาดูกันว่า Microservices ต่างจาก Monolith อย่างไร
| Feature | Monolith | Microservices |
|---|---|---|
| Deployment | ง่ายกว่า | ซับซ้อนกว่า |
| Scaling | ยากกว่า (ต้อง scale ทั้ง application) | ง่ายกว่า (scale เฉพาะ service ที่ต้องการ) |
| Technology Stack | จำกัด (มักใช้ technology เดียว) | หลากหลาย (แต่ละ service สามารถใช้ technology ที่แตกต่างกันได้) |
| Fault Isolation | แย่ (ถ้ามีปัญหาที่ส่วนใดส่วนหนึ่ง กระทบทั้ง application) | ดี (ถ้ามีปัญหาที่ service หนึ่ง service อื่นยังทำงานได้) |
| Complexity | ต่ำกว่าในระยะแรก | สูงกว่า (ต้องจัดการ distributed system) |
นอกจาก Monolith แล้ว ยังมีทางเลือกอื่นๆ อีก เช่น Service-Oriented Architecture (SOA) SOA คล้ายกับ Microservices แต่มีขนาดใหญ่กว่าและซับซ้อนกว่า มักใช้ในองค์กรขนาดใหญ่ที่มี legacy system เยอะๆ
สรุปแล้ว Microservices เหมาะกับโปรเจคขนาดใหญ่ ที่ต้องการความยืดหยุ่นสูง และมีทีมงานที่มีความเชี่ยวชาญในการจัดการ distributed system ถ้าโปรเจคของเรามีขนาดเล็กและไม่ซับซ้อน Monolith อาจจะเป็นทางเลือกที่ดีกว่า
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะครับ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย! แล้วอย่าลืมแวะไปอ่านบทความอื่นๆ ใน SiamCafe Blog ด้วยนะครับ!
เอาล่ะน้องๆ หลังจากที่เราคุยกันเรื่องภาพรวม Microservices ไปแล้ว คราวนี้มาดูเคล็ดลับที่พี่เจอมากับตัว สมัยทำร้านเน็ต SiamCafe (รุ่นบุกเบิกเลยนะนั่น!) มันก็ไม่ได้เหมือนกันเป๊ะๆ หรอก แต่หลักการหลายอย่างเอามาปรับใช้ได้
จำไว้ว่า Microservices ไม่ใช่ Silver Bullet นะเว้ย! มันไม่ได้แก้ปัญหาทุกอย่างได้ บางที Monolith แบบเดิมๆ อาจจะเวิร์คกว่าด้วยซ้ำ เลือกใช้ให้ถูกสถานการณ์สำคัญสุด
Microservices คือการ "กระจายความเสี่ยง" และ "เพิ่มความเร็วในการพัฒนา" แต่ก็ต้องแลกมาด้วยความซับซ้อนที่มากขึ้น ต้องชั่งน้ำหนักให้ดี
สมัยก่อนผมทำร้านเน็ตฯ เวลามีปัญหาเกม, ระบบคิดเงิน, หรืออะไรก็ตาม มักจะโยนกันไปมา ปวดหัวสุดๆ Microservices ก็เหมือนกัน ถ้าทีมไม่รับผิดชอบตั้งแต่ต้นจนจบ มันจะกลายเป็นปัญหาคลาสสิก "ไม่ใช่ความผิดฉัน!"
ให้แต่ละทีมดูแล Service ของตัวเองอย่างเต็มที่ ตั้งแต่ Design, Development, Testing, Deployment, Monitoring จนถึง Support นั่นแหละ
นึกภาพร้านเน็ตฯ สมัยก่อน ที่มี Router ตัวเดียวเป็นทางเข้าออก Internet ทุกเครื่อง API Gateway ก็เหมือนกัน ทำหน้าที่เป็นหน้าบ้านให้ Client เข้ามาเรียกใช้ Microservices ต่างๆ
ข้อดีคือ ช่วยจัดการเรื่อง Authentication, Authorization, Rate Limiting, Routing และอื่นๆ ทำให้ Microservices แต่ละตัวไม่ต้องกังวลเรื่องพวกนี้
Microservices มันเยอะแยะไปหมด ถ้าไม่มีระบบ Monitoring & Logging ที่ดีพอ จะเหมือนงมเข็มในมหาสมุทร เวลาเกิดปัญหาขึ้นมา จะหาต้นตอไม่เจอเลย
สมัยก่อนผมใช้โปรแกรม Monitor เครื่องลูกข่ายในร้านเน็ตฯ Microservices ก็เหมือนกัน ต้องมี Dashboard ที่เห็นภาพรวมของทุก Service, Log ที่ละเอียดพอ และ Alert ที่ทันท่วงที
// ตัวอย่าง Log format ที่ควรกำหนด
{
"timestamp": "2024-01-26T10:00:00Z",
"service": "order-service",
"level": "INFO",
"message": "Order created successfully",
"orderId": "12345",
"customerId": "67890"
}
Docker และ Kubernetes ไม่ใช่ของเล่น แต่มันคือเครื่องมือที่ช่วยให้การ Deploy และ Manage Microservices ง่ายขึ้นเยอะ
Docker ช่วยให้เรา Package Microservice พร้อม Dependency ต่างๆ ให้เป็น Image ที่ Run ได้ทุกที่ ส่วน Kubernetes ช่วยจัดการ Container เหล่านั้น ให้ Scale ได้ตามต้องการ
iCafeForexProject ที่มี Complexity สูง, ต้องการ Scale ได้ง่าย, และมีทีมพัฒนาหลายทีม ที่สามารถทำงานแยกกันได้
ถ้าทีมเล็กมากๆ อาจจะยังไม่จำเป็นต้องใช้ Microservices ลองเริ่มจาก Monolith ก่อน แล้วค่อยๆ Extract ออกมาเป็น Microservices ทีหลังก็ได้
ใช้ Pattern อย่าง SAGA หรือ Eventual Consistency ในการจัดการ Transaction ที่ข้ามหลาย Services
มีเยอะมาก! ตั้งแต่ Framework (Spring Boot, Micronaut, Go Kit), Message Queue (RabbitMQ, Kafka), Service Discovery (Eureka, Consul), API Gateway (Kong, Tyk) เลือกใช้ให้เหมาะกับ Project ของตัวเอง
ถ้าไม่มี Automation ที่ดีพอ ใช่เลย! แต่ถ้ามี CI/CD Pipeline ที่แข็งแกร่ง มันจะช่วยให้การ Deploy Microservices ง่ายและเร็วขึ้นมาก
Microservices Architecture คือดาบสองคม มันมีข้อดีมากมาย แต่ก็มาพร้อมกับความซับซ้อนที่มากขึ้น ต้องศึกษาให้ดี วางแผนให้รอบคอบ และเลือกใช้ให้ถูกสถานการณ์
จำไว้ว่า Technology เปลี่ยนไปเรื่อยๆ แต่หลักการพื้นฐานยังคงอยู่ เรียนรู้จากประสบการณ์จริง และปรับตัวให้เข้ากับสถานการณ์เสมอ
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะครับ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย!
SiamCafe Blog