จากบทความเรื่อง Software Architecture and Design InfoQ Trends Report :: April 2022 จาก InfoQ
ม่ีเรื่องที่น่าสนใจมากมาย
หนึ่งในนั้นคือ Design for failure
หรือการออกแบบระบบเพื่อให้สามารถรับมือกับความผิดพลาดได้
ทั้งความผิดพลาดที่เราคาดหวังและไม่คาดหวังได้

ระบบงานไม่ได้จบเพียงแค่ส่งมอบหรือ deploy เท่านั้น
แต่ยังต้องสนับสนุนทาง business และสร้างความพึงพอใจให้กับลูกค้าด้วย
ดังนั้นระบบงานที่ดี ควรประกอบไปด้วย

  • การทำงานอย่างถูกต้องตามที่คาดหวัง
  • ระบบมีความน่าเชื่อถือ
  • ระบบสามารถเข้าได้งานได้เสมอ (24×7)

แน่นอนว่า การทำงานได้อย่างถูกต้องของระบบนั้สำคัญมาก ๆ
แต่สิ่งที่ขาดไม่ได้คือ 2 เรื่องต่อมา
เพื่อทำให้ระบบมีความน่าเชื่อถืแและเสถียร
ดังนั้นในการออกแบบควรต้องวางแผนไว้เสมอ

เนื่องจากระบบงานหนึ่ง ๆ นั้นมีส่วนประกอบทั้ง service และ component มากมาย
รวมทั้งติดต่อกันผ่านระบบ network ต่าง ๆ อีก
แน่นอนว่าทำให้ระบบงาน สามารถเกิดข้อผิดพลาดได้อย่างมากมาย
ดังนั้นเราจึงต้องทำระบบ automatic fail-over และทำ redundancy ส่วนต่าง ๆ
หรืออาจจะต้องวางแผนการรับมือจากความผิดพลาด (Design for failure)
หรืออาจจะเรียกว่า resilience pattern
เพื่อทำให้ระบบรับมือกับความผิดพลาดได้
และสามารถช่วยให้ระบบกลับมาทำงานได้ปกติรวดเร็วที่สุด
หรือลดผลกระทบต่อผู้ใช้งานให้มากที่สุดนั่นเอง

เป้าหมายของระบบที่มักจะใช้งานคือ Availability

โดยจะมีส่วนประกอบจากค่า Uptime และ Downtime
นั่นคือเราจะเพิ่ม Uptime ให้มากที่สุด
และลดเวลา Downtime ให้น้อยที่สุด

ในการพัฒนาระบบสมัยใหม่นั้น
เราจะสนใจการลดเวลาการ Downtime ให้น้อยลง
ด้วยการลดเวลา Mean Time To Recovery
หรือ หรือเวลาการนำระบบกลับมาให้ทำงานได้แบบปกติ
ซึ่งประกอบไปด้วย เวลาต่าง ๆ เหล่านี้

  • เวลาที่เรารู้ว่าปัญหาเกิดขึ้น
  • เวลาในการหาต้นเหตุของปัญหา
  • เวลาในการแก้ไข
  • เวลาในการทดสอบ
  • เวลาในการ deploy
  • เวลาที่กลับมาทำงานได้ปกติ

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

รูปแบบของการออกแบบเพื่อรองรับข้อผิดพลาด

ประกอบไปด้วย

  • Redundancy
  • Replication data
  • Isolate หรือการแยกทั้ง service และ database หรืออาจจะใช้แนวคิด Bulkhead มาช่วย
  • Timeout
  • Retry
  • Fail fast
  • Fall back
  • Rate limit
  • Circuit breaker
  • Asynchronous communication

อะไรที่มันจะ fail ได้ มันย่อม fail เสมอ

Reference Websites