เราจะไป Microservice ดีใหมนะ ?
เป็น Trend ใหม่ กันไปเสียแล้ว กับการปรับเปลี่ยน Software Architecture
ไปในรูปแบบ Microservices
“Microservices” คำนี้ ไม่ได้พึ่งมาฮ็อตฮิตกันตอนนี้นะ
จริงๆแล้ว เกิดมาตั้งแต่ ปี 2011 และถูกกล่าวถึงกันอย่างแพร่หลาย เรื่อยมา
เปรียบเทียบ Monolith vs Microservices
Monolith
น่าจะเป็น สถาปัตยกรรมที่ใชักันอย่างแพร่หลายในปัจจุบัน (2017)
โดยเป็นการเอา Service ทั้งหมดรวบกันเป็นชิ้นเดียว
แล้วนำไป ติดตั้งบน Web Server หรือ App Server เช่น ใน Java อาจ เป็น War , Ear file และ นำไปติดตั้งยกชุด
ข้อดี
- Performance ดีกว่า เพราะทำงานภายในระบบเดียวกัน
- Codebase เดียว Maintain ง่าย ทั้งในแง่ Source code และ Operation Support
- การ Debug / Test ไม่ซับซ้อน
- จัดการเรื่อง Security ง่ายกว่า
ข้อด้อย
- ทำการขยายขนาด เพื่อรองรับการใช้งานที่เพิ่มขึ้นลำบาก
- กรณีบาง Service พัง อาจส่งผลกับการทำงานของระบบโดยรวม
Microservices
— James Lewis และ Martin Fowler
ให้คำจำกัดความ ของ Microservices
โดยสรุปไว้ว่า
- เป็นรูปแบบการพัฒนา Application ที่ประกอบด้วย การแบ่ง Service ออกเป็นชิ้นเล็กๆ
- Service สามารถทำงาน จนจบกระบวนการได้ด้วยตัวเอง
- แต่ละ Services ไม่จำเป็นที่จะต้องเขียนด้วยภาษาโปรแกรมแบบเดียวกัน
- สามารถแยกใช้วิธีการเก็บข้อมูล ที่แตกต่างกันได้
สมมุติว่า เราพัฒนาระบบ E-Wallet ก็จะสามารถ แยก ฟังชั่น ต่างๆ ออกเป็นระบบเล็กๆ ดังนี้
- Registration (ระบบลงทะเบียน)
- Authentication (ระบบล็อคอิน)
- Top-up (ระบบเติมเงิน)
- Transfer (ระบบโอนเงิน)
- Payment (ระบบชำระเงิน)
จะเห็นได้ว่า เราทำการแยกการพัฒนาระบบ
เป็นแต่ละ Service ออกจากกันอย่างชัดเจน ทำให้เมื่อบางระบบพัง ก็จะกระทบระบบอื่นน้อยลงเช่นกัน
ข้อดี
Scalable : สามารถขยายขนาดเพื่อรองรับผู้ใช้งานได้ง่าย เช่น เลือกขยาย Service ที่ถูกใช้งานเยอะๆ
Reliability : บาง Service พัง ก็ไม่กระทบกับระบบโดยรวม เพราะแยกการทำงานจากกันชัดเจน
Design autonomy : แต่ละ Service สามารถเลือกใช้ เทคโนโลยี ที่แตกต่างกัน ตามความเหมาะสม
Modifiability : ปรับเปลี่ยนได้ไว เนื่องจากแยก Service อย่างชัดเจน
ไม่จำเป็นต้อง Deploy ทั้งระบบ
ข้อด้อย
Complexity : ออกแบบฯ Architecture ให้ดี ยาก
Performance : Performance อาจไม่ดีนักถ้าเทียบกับ Monolith เพราะเป็นการเรียกใช้งานระหว่าง Service ไม่ใช่ใน Process เดียวกัน
Security : แยกหลาย Service ทำให้ จัดการ Security ยากขึ้น
Data : กรณีแยก การเก็บข้อมูลจากกัน จะยากต่อการจัดการ Data consistency
เลือกยังไงดี ระหว่าง Monolith / Microservices
จะเห็นว่า กรณีระบบที่ไม่ซับซ้อนมาก
การเลือกใช้ Monolith จะได้ Productivity ที่ดีกว่า
แต่เมื่อไรก็ตามที่ระบบเริ่มซับซ้อนมากขึ้น ๆ
Monolith กลับได้ Productivity ลดลงอย่างเห็นได้ชัดสำหรับผมแล้ว การจะนำ Microservices มาปรับใช้เป็นเรื่องดี
ที่มาพร้อมกับความท้าทาย ในหลายๆ ด้าน
ทั้งในแง่การเตรียมจำนวนบุคลากร การเพิ่มพูนความรู้ ความเข้าใจ
รวมถึงการวาง Architecture ให้สามารถพัฒนา บำรุงรักษาได้ง่ายในอนาคต
แต่ถ้าทำได้แล้ว มันจะเจ๋งมากๆ เลย ว่ามะ