Degrading Functionality (การลดระดับฟังก์ชันการทำงาน)

ส่วนสำคัญของการสร้างระบบที่ยืดหยุ่นทนทาน โดยเฉพาะเมื่อฟังก์ชันการทำงานของคุณกระจายอยู่ใน microservice หลายตัวที่อาจขึ้นหรือลง คือความสามารถในการลดระดับฟังก์ชันการทำงานอย่างปลอดภัย ลองนึกภาพหน้าเว็บมาตรฐานบนเว็บไซต์ ecommerce ของเรา เพื่อประกอบส่วนต่างๆ ของเว็บเพจนั้นเข้าด้วยกัน เราอาจต้องใช้ microservice หลายตัวมาช่วย microservice ตัวหนึ่งอาจแสดงรายละเอียดของสินค้าที่วางขาย อีกตัวอาจแสดงราคาและระดับสต็อก และเราอาจกำลังแสดงเนื้อหาตะกร้าสินค้าด้วย ซึ่งอาจเป็น microservice อีกตัวหนึ่ง ถ้าบริการใดบริการหนึ่งล่ม และนั่นทำให้หน้าเว็บทั้งหมดใช้งานไม่ได้ เราก็สร้างระบบที่มีความยืดหยุ่นทนทานน้อยกว่าระบบที่ต้องการแค่บริการเดียวเท่านั้นที่ต้องพร้อมใช้งาน

สิ่งที่เราต้องทำคือเข้าใจผลกระทบของแต่ละ outage และหาวิธีลดระดับฟังก์ชันการทำงานอย่างเหมาะสม จากมุมมองทางธุรกิจ เราต้องการให้ workflow การรับคำสั่งซื้อของเรามีความทนทานที่สุดเท่าที่จะทำได้ และเราอาจยอมรับการลดระดับฟังก์ชันบางส่วนเพื่อให้แน่ใจว่าส่วนนี้ยังทำงานได้อยู่ ถ้าระดับสต็อกใช้งานไม่ได้ เราอาจตัดสินใจดำเนินการขายต่อไปและค่อยจัดการรายละเอียดทีหลัง ถ้า microservice ตะกร้าสินค้าใช้งานไม่ได้ เราคงมีปัญหาใหญ่ แต่เรายังสามารถแสดงหน้าเว็บพร้อมรายการสินค้าได้ อาจแค่ซ่อนตะกร้าสินค้าหรือแทนที่ด้วยไอคอนที่บอกว่า "จะกลับมาเร็วๆ นี้!"

ด้วยแอปพลิเคชันแบบ single-process monolithic เราไม่มีอะไรต้องตัดสินใจมากนัก สุขภาพของระบบในบริบทนี้ค่อนข้าง binary—process นั้นขึ้นหรือลงเท่านั้น แต่ด้วยสถาปัตยกรรม microservice เราต้องพิจารณาสถานการณ์ที่ซับซ้อนกว่ามาก สิ่งที่ถูกต้องควรทำในแต่ละสถานการณ์มักไม่ใช่การตัดสินใจทางเทคนิค เราอาจรู้ว่าอะไรเป็นไปได้ทางเทคนิคเมื่อตะกร้าสินค้าล่ม แต่ถ้าเราไม่เข้าใจบริบททางธุรกิจ เราก็จะไม่เข้าใจว่าควรทำอะไร ตัวอย่างเช่น บางทีเราอาจปิดทั้งไซต์ ยังให้ผู้คนเลื่อนดูแคตตาล็อกสินค้าได้ หรือแทนที่ส่วนของ UI ที่มีตัวควบคุมตะกร้าสินค้าด้วยเบอร์โทรศัพท์สำหรับสั่งซื้อ แต่สำหรับทุก interface ที่หันหน้าเข้าหาลูกค้าที่ใช้ microservice หลายตัว หรือทุก microservice ที่พึ่งพา downstream collaborator หลายตัว คุณต้องถามตัวเองว่า "จะเกิดอะไรขึ้นถ้าตัวนี้ล่ม?" และรู้ว่าต้องทำอะไร

ด้วยการพิจารณาความสำคัญของแต่ละความสามารถของเราในแง่ cross-functional requirements เราจะอยู่ในตำแหน่งที่ดีกว่ามากในการรู้ว่าเราทำอะไรได้บ้าง ทีนี้มาดูสิ่งที่เราทำได้จากมุมมองทางเทคนิคกัน เพื่อให้แน่ใจว่าเมื่อความล้มเหลวเกิดขึ้น เราสามารถรับมือกับมันได้อย่างนุ่มนวล