Resilient System Design

สิ่งที่นักพัฒนาอย่างพวกเราตระหนักรู้อยู่เสมอ คือ การออกแบบระบบให้สามารถทำงานได้ด้วยตัวระบบเอง หากว่าระบบต้นทาง หรือระบบปลายทาง ดับไป ซึ่งการออกแบบให้ระบบมีความยืดหยุ่นสูงน่าจะเป็นแนวคิดนึงที่มาช่วยเราได้
แนวคิด Resilient System Design คือ แนวทางการออกแบบระบบซอฟต์แวร์ให้สามารถทำงานต่อได้ แม้จะเกิดความล้มเหลวบางส่วนของระบบขึ้น เช่น ระบบภายนอกล่ม ฐานข้อมูลตอบช้า หรือมีข้อผิดพลาดของ services บางตัว โดยมีเป้าหมายหลักคือ ความต่อเนื่อง (continuity) และ การฟื้นตัว (recovery) ของระบบภายใต้สถานการณ์ไม่ปกติ
จะเป็นอย่างไรหากระบบเราต้องไปหยิบ file master data จากระบบกลางของบริษัทมาใช้งานในทุกวัน แต่เกิดมีข้อผิดพลาดขึ้น ซึ่งอาจเป็นระบบเราเองไม่สามารถหยิบ file ได้ชั่วขณะ หรือระบบกลางวาง file ไม่สำเร็จ เป็นต้น
ดังนั้น เราจึงมีการออกแบบระบบเราให้สอดคล้องกับความต้องการใช้งานระบบ ซึ่งจะมีการชั่งน้ำหนัก ข้อดีข้อเสียต่างๆ ให้ได้ solution ที่ระบบยังสามารถทำงานต่อไปได้ โดยไม่ส่งมอบของที่ใหญ่เกินความจำเป็นจากการใช้งานจริงๆ

ตัวอย่าง
channel A ที่เรากำลังพัฒนาอยู่ มีความจำเป็นต้องใช้ file master data จังหวัดในประเทศไทย จากระบบ C ซึ่งมีการวาง file ในทุกวัน และเรามีการออกแบบป้องกันความผิดพลาดในกรณีไปหยิบไฟล์ไม่ได้ โดยให้ใช้ข้อมูลเดิมไปก่อน เพราะเราได้ทบทวน requirement แล้วว่าหาก process การ update file master data ไม่สำเร็จ และไม่มีข้อมูล master data ตรงนี้ จะทำให้ channel A ไม่สามารถทำงานต่อไปได้ โดยมีผลกระทบกับลูกค้าจำนวนมาก ดังนั้น การมีข้อมูลที่ไม่ล่าสุดของวันนี้ ก็ยังดีกว่าไม่มีเลย
Resilient Systems Design ไม่ใช่เรื่องของ technical เพียงอย่างเดียว แต่คือแนวคิดที่ให้ความสำคัญกับ ‘ความต่อเนื่อง’ ของบริการ ไม่ว่าจะเกิดอะไรขึ้น ระบบควรอยู่ให้ได้ และที่สำคัญไม่แพ้กันเลย คือ การ design ที่ยังคงส่งมอบระบบตามความต้องการใช้งาน โดยที่ไม่ได้มีการออกแบบที่เกินความจำเป็น (over engineer)
ขอให้สนุกกับการออกแบบระบบค่ะ ^^