Coding Gun

Microservices คืออะไร?

Microservices คือแนวคิดในการออกแบบระบบรูปแแบบหนึ่ง ซึ่งมาจากคำว่า Micro และ services

ดังนั้น Microservices จะเติม s ด้วยเสมอเพราะเป็นการนำเอา services หลายๆตัว(ที่มีขนาดเล็ก) มาทำงานร่วมกัน

ที่มาของ Microservices

Microservices เกิดจากการสะสมองค์ความรู้จากการทำ Distributed System ดังนั้น Design Patterns ต่างๆ ที่นำมาใช้ใน Microservices นั้นจึงไม่ใช่ของใหม่แต่ได้ถูกประยุกต์ใช้อย่างแพร่หลายมาอย่างยาวนาน

และอีกต้นกำเนิดของ Microservices คือ Service Oriented Architecture(SOA) เป็นแนวคิดที่ได้รับการยอมรับในวงกว้าง แต่เนื่องจากการออกแบบระบบให้เป็น SOA นั้นจำเป็นต้องใช้เครื่องมือที่นำมาเชื่อม Services ต่างๆเข้าหากันเรียกว่า Enterrprise Service Bus(ESB) ซึ่งมีราคาค่อนข้างสูง เราจึงเห็น Implementation เฉพาะในองค์กรที่มีขนาดใหญ่ๆเท่านั้น และในแนวคิดของ SOA นี่เองที่ทำให้เราเริ่มแยก Services ต่างๆออกไปเป็น Web Services (ช่วงนั้นจะยังนิยมใช้ SOAP Service เป็นหลัก) หลังจากนั้นก็เริ่มมีการใช้งาน RESTful services กันมากขึ้นจึงทำให้เริ่มมีการพูดถึง lightweight SOA และได้พัฒนาแนวคิดมาเรื่อยๆจนกลายเป็น Microservices ในปัจจุบัน

Monolithic vs Microservices

Monolithic
รูปภาพ: การออกแบบด้วย Monolithic Architecture ที่รวมทุกอย่างไว้ใน project เดียว

Monolith หรือ Monolithic คือการออกแบบระบบในแบบเดิม ที่เราจะนำทุก services ไปไว้ใน Project เดียวกันทั้งหมด

การเป็น Monolith นั้นทำให้เราปรับเปลี่ยนระบบได้ยาก(ทุกครั้งที่เกิดการเปลี่ยนแปลงจะต้อง Build ระบบใหม่ทั้งก้อน) และยังเจอปัญหาในการ scale อีกด้วย(ถ้่าต้องการรองรับ load มาขึ้นก็ต้องนำ Application นี้ไป deploy ใหม่ทั้งก้อน)

ทำไมต้องเป็น Microservices

แนวโน้มของการพัฒนาซอฟแวร์นั้นจะมีการเพิ่ม requirements และความซับซ้อนมากขึ้นเรื่อยๆในทุกๆปี ดังนั้นเมื่อเวลาผ่านไปความต้องการของ user ก็จะมีมากขึ้นและก็จะยิ่งซับซ้อนมากขึ้นดังนั้นการที่เราพัฒนาระบบขั้นมาเป็นแบบ Monoliths นั้นจะทำให้เกิดข้อจำกัดต่างๆดังนี้

technical dept คือ การที่เราแก้ปัญหาโดยไม่ได้แก้ที่ต้นเหตุ ดังนั้นปัญหาจริงๆจะยังคงอยู่และเมื่อปัญหาที่เราได้หมกไว้นี้กลับมาเกิดขึ้นใหม่ก็จะทำให้ใช้ต้นทุนทั้งเวลาและจำนวนคนที่เข้ามาแก้ไขปัญกานี้มากขึ้น

ซึ่งนี่ก็เป็นสาเหตุว่าทำไมเราจึงควรเปลี่ยนมาเป็น Microservices Architecture เพื่อที่จะลดปัญหาที่ว่ามาทั้งหมดนี้ เพราะเมื่อ source code มีขนาดเล็กลง ปัญหาก็จะน้อยลงตามไปด้วย

การออกแบบ Microservices(Microservices Architecture)

Microservices
รูปภาพ: การออกแบบด้วย Microservices Architecture ที่แบ่งการทำงานออกเป็น service ย่อยๆ
Microservices Architecture คือการออกแบบระบบให้สอดคล้องกับแนวคิดของ Microservices และเนื่องจาก Microservices นั้นไม่ได้มีเฉพาะข้อดีเท่านั้นแต่ยังนำมาซึ่งความซับซ้อน ความยากในการออกแบบ พัฒนาและดูแลให้ services นั้นทำงานได้อย่างราบรื่น

ดังนั้นเราจึงควรออกแบบระบบให้ได้ประโยชน์จากการเป็น Microservices มากที่สุด ในต้นทุนที่คุ้มค่ามากที่สุด หรือแม้กระทั่งพิจารณาว่าระบบที่เรากำลังออกแบบนั้นได้ประโยชน์จากการเป็น Microservices ที่คุ้มค่าหรือไม่ ถ้าไม่คุ้มค่าเราอาจต้องเลือกที่จะให้ระบบเรายังคงเป็น Monolith ต่อไป

เราควรออกแบบ Microservices โดยคำนึงถึง Value ที่ได้จากการเป็น Microservices เสมอ

การออกแบบ Microservices ควรจะต้องเข้าใจแนวคิดเหล่านี้

Microservices ที่ดีต้องมีสิ่งนี้

ในปัจจุบันเรายังเริ่มมีการพูดถึง Microservices ที่สามารถตอบสนองต่อข้อผิดพลาดต่างๆได้ เรียกว่า Reactive Microservices

Downstream and Upstream service

ศัพท์ที่เราใช้เรียก service อยู่บ่อยๆคือ downstream service และ upstream service เนื่องจาก microservices นั้นมีการเรีียก service ต่อเนื่องกันไปเรื่อยๆ เพื่อความเข้าใจว่าเรากำลังพูดถึง service ด้่นหน้าและด้านหลังเราจะเรียกว่า

Upstream and Downstream service
ที่มา https://www.nginx.com/blog/introduction-to-microservices

จากรูป Trip management จะเป็น downstream service ส่วน Passenger management จะเป็น upstream service

เทคโนโลยีที่ใช้ใน Microservices มีอะไรบ้าง?

การจะทำ Microservices นั้นต้องอาศัย skill และ Knowledge ที่เยอะพอสมควร แต่ทุกๆเทคโนโลยีที่พูดถึงนี้ก็ยังจำเป็นต้องใช้ใน Monolithic ด้วยเหมือนกัน เพียงแต่การเป็น Microservices นั้นเทคโนโลยีต่างๆที่กล่าวมานี้มีความจำเป็นมากกว่า Monolithic มากๆ

ข้อดีของ Microservices

สิ่งที่มักจะเป็นความต้องการพื้นฐานของระบบที่จะเป็น Microservices เลยคือ High Availability และ Scalability

ข้อเสียของ Microservices

Communication Cost(Network Latency) กับ Data Consistency ถือว่าเป็นต้นทุนใน Microservices ที่สามารถแลกกับ High Availability และ Scalability ได้

จาก Monolith สู่ Microservices

การจะเป็น Microservices ได้นั้นมีกระบวนการอยู่ 2 วิธีนั่นคือ

Microservices นั้นไม่จำเป็นต้องสร้างขึ้นจากศูนย์เสมอไป

Microservices Design Patterns

Design Patterns คือ การรวบรวมวิธีการแก้ปัญหาที่ได้ผล(Best Practices) เพื่อเป็นกรณีศึกษาให้กับผู้ที่ต้องมา Implement ทีหลังจะได้ไม่เสียเวลาในการแก้ไขปัญหา Microservices เองก็มีปัญหาที่ต้องเจออยู่เยอะมากๆ จึงจำเป็นต้องรวบรวมองค์ความรู้ทั้งจากการทำ Distributed System และวิธีการแก้ไขปัญหาที่หลายๆองค์กรเลือกใช้งาน เพื่อให้เราจะได้ไม่ต้องเสียเวลาในการหาวิธีการแก้ปัญหาเหล่านั้น โดยที่ Microservices design patterns หรือ microservices architecture patterns หลักๆที่เราต้องรู้จักไว้มีดังนี้

Microservices Design Patterns เป็นสิ่งที่เข้าใจยาก แต่ยิ่งคุณเข้าใจ Design Patterns เหล่านี้มากขึ้นเท่าไหร่ปัญหาในการทำ Microservices นั้นยิ่งลดลง

อย่าลืมหลักการที่อยู่เบื้องหลัง Microservices

การเป็น Microservices นั้นมีหลักการที่ต้องยึดถือไว้ตลอดเวลาเลยนั่นคือการเป็น Agile และ DevOps ยกตัวอย่างเช่น Domain Driven Design ต้องอาศัยคนที่มีความเข้าในใน Business อยู่ในทีมด้วย(Agile Principles) เพื่อที่จะช่วยนำทางให้การทำงานของระบบนั้น สอดคล้องและตอบโจทย์ธุรกิจจริงๆ

Agile Principles และ DevOps Principles เป็นหลักการที่ทุกคนในทีมต้องยึดถือไว้ตลอดเวลา

ตัวอย่าง Microservices (Microservices examples)

References (ตามไปศึกษา Microservices ต่อได้ที่นี่)

Related Topic

การสร้าง Distributed Cached ด้วย Redis
Jun 17, 23

microservices

การสร้าง Distributed Cached ด้วย Redis
API Gateway กับ Microservices
Jun 17, 23

microservices

API Gateway กับ Microservices
Database Design
Jun 7, 23

microservices

Database Design
Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security