05. การหมดเวลาและการลองใหม่ — ยาที่กลายเป็นต้นเหตุของโรค
ปฏิทรรศน์ของตรรกะการกู้คืน
การลองใหม่กลายเป็นตัวเร่งหลักที่ทำให้ระบบล่มทั้งระบบอยู่บ่อยครั้ง ทั้งที่มันถูกออกแบบมาเพื่อเพิ่มความน่าเชื่อถือ ด้วยการกลบความผิดพลาดชั่วคราวในระบบกระจายศูนย์ไว้ ปี 2015 ระบบ DynamoDB ขัดข้อง และ Amazon Web Services บันทึกไว้เองว่าตรรกะการลองใหม่แบบอัตโนมัติเปลี่ยนปัญหาเฉพาะจุดให้กลายเป็นบริการล้มเหลวทั่วทั้งระบบอย่างยืดเยื้อ โดยไม่มีใครตั้งใจ เซิร์ฟเวอร์จัดเก็บข้อมูลแต่ละเครื่องส่งคำร้องขอสมาชิกภาพซ้ำไปยังบริการเมทาดาตาที่รับภาระเกินกำลังอยู่แล้ว ผลคือวงจรป้อนกลับเชิงบวก ที่ถาโถมใส่ส่วนประกอบของโครงสร้างพื้นฐานที่กำลังแย่อยู่ก่อนแล้ว เหตุการณ์นี้ชี้ว่าตรรกะการลองใหม่นั่นเองคือกลไกที่ตรึงระบบไว้ในสภาวะเสื่อมประสิทธิภาพ ไม่ใช่สะพานไปสู่การกู้คืน อัตราข้อผิดพลาดค้างอยู่ที่ ~55% สำหรับลูกค้า ตัวเลขนั้นบอกว่าการส่งคำร้องขอซ้ำโดยไม่ดูสภาพระบบ อาจทำให้ทรัพยากรที่ขาดแคลนอยู่แล้วยิ่งขาดหนักขึ้น แทนที่จะแก้ให้หาย
ความล้มเหลวแบบกึ่งเสถียรและการลดภาระงาน
ความล้มเหลวแบบกึ่งเสถียรคือระบบที่ยังติดอยู่ในสภาวะหน่วงสูงหรือผิดพลาดสูง ทั้งที่เงื่อนไขที่จุดชนวนถูกกำจัดไปนานแล้ว Nathan Bronson, Abutalib Aghayev, Aleksey Charapko และ Timothy Zhu โต้แย้งไว้ในเอกสาร HotOS ปี 2021 ว่าวงจรที่ขับเคลื่อนด้วยการลองใหม่แบบนี้คือลักษณะเฉพาะที่นิยามระบบกระจายศูนย์สมัยใหม่ กรณีศึกษาที่ชัดที่สุดคือรายงานชันสูตรเหตุขัดข้องของ AWS DynamoDB ปี 2015 บริการเมทาดาตากู้คืนได้ก็ต่อเมื่อทีมงานลงมือระงับคำร้องขอขาเข้าทั้งหมดด้วยมือเท่านั้น นั่นคือการลดภาระงาน ปฏิเสธงานโดยตั้งใจเพื่อรักษาบริการไว้ และมันได้ผลกว่าการลองใหม่แบบอัตโนมัติที่ต่อลมหายใจให้เหตุขัดข้องมาก่อนหน้านั้นมาก ปัญหาอีกรูปแบบหนึ่งคือฝูงชนแห่เข้ามาพร้อมกัน วิศวกรมักกันไว้ด้วยการถอยเวลาแบบทวีคูณพร้อมการสุ่มเต็มรูปแบบ คือหน่วงเวลาเท่ากับ random(0,1) คูณด้วย min(cap, base x 2^attempt) Marc Brooker เขียนไว้ใน AWS Architecture Blog ปี 2015 และวางสูตรนี้เป็นมาตรฐานการบรรเทาปัญหาของอุตสาหกรรม เพื่อกันไม่ให้ไคลเอนต์ลองใหม่พร้อมกันเป็นจังหวะเดียว
ฉันทามติเกี่ยวกับความเสี่ยงของการลองใหม่
อันตรายของวงจรลองใหม่ที่ไร้การควบคุมไม่มีข้อโต้แย้งที่สำคัญเหลืออยู่ หลักฐานจากงานวิจัยทางวิชาการและรายงานชันสูตรเหตุขัดข้องจากหน้างานตรงกันทั้งหมด Bronson และคณะ อ้างถึงเหตุการณ์ในอุตสาหกรรมหลายครั้งที่ซ้ำรอยความล้มเหลวของ DynamoDB และยืนยันว่าการขยายตัวของการลองใหม่เป็นปรากฏการณ์เชิงระบบที่เกิดซ้ำได้ ปัจจุบันสาขานี้ยอมรับแล้วว่าความปลอดภัยเป็นปัญหาเชิงควบคุม ต้องจัดการภาระงานอย่างชัดแจ้ง ไม่ใช่ปัญหาของส่วนประกอบชิ้นเดียวที่ลองใหม่แล้วจบ
ตัวอย่าง: ส่งคำร้องขอที่ล้มเหลวซ้ำในระบบที่ภาระงานล้นมือ ก็เหมือนเทน้ำเพิ่มลงท่อระบายน้ำที่ตัน แล้วหวังว่าแรงดันจะดันสิ่งอุดตันให้หลุด
คำตัดสิน. ตรรกะการลองใหม่ที่ก้าวร้าวเกินไปคือสาเหตุอันดับต้นของเหตุขัดข้องขนาดใหญ่ที่หล่อเลี้ยงตัวเองได้ และควรถูกแทนที่ด้วยการลดภาระงานในช่วงที่แย่งชิงทรัพยากรกันสูง
จะพลิกคำตัดสินได้เมื่อ: มีระบบขนาดใหญ่แสดงให้เห็นว่าการลองใหม่โดยไร้การควบคุมภายใต้ภาระงานสุดขั้ว กู้คืนได้เร็วกว่าการลดภาระงานหรือกลยุทธ์การถอยเวลาอย่างสม่ำเสมอ
แหล่งอ้างอิง. 2021 · Nathan Bronson, Abutalib Aghayev, Aleksey Charapko, Timothy Zhu, "Metastable Failures in Distributed Systems" — paper PDF · 2015 · Amazon Web Services, "Summary of the Amazon DynamoDB Service Disruption and Related Impacts in the US-East Region" — AWS postmortem
บทถัดไป · 6 / 1206. ความสำเร็จที่เงียบงัน — ความล้มเหลวที่รายงานว่าทุกอย่างเรียบร้อยดี