כשל נקודתי לעומת כשל רוחבי: למה האופן שבו מערכת נכשלת חשוב לא פחות מהכשל עצמו

תוכן עניינים

כשל נקודתי לעומת כשל רוחבי: למה האופן שבו מערכת נכשלת חשוב לא פחות מהכשל עצמו

כשמערכת נכשלת, השאלה הראשונה היא לרוב “מה נשבר?”

אבל במערכות מורכבות, זו לא השאלה החשובה. השאלה החשובה באמת היא: איך הכשל מתפשט.

מה זה כשל נקודתי

כשל נקודתי הוא כשל שמוגבל לרכיב ברור:

  • שירות אחד
  • פונקציה אחת
  • תלות אחת שנפלה

הנזק מקומי. שאר המערכת ממשיכה לעבוד, אולי בצורה חלקית, אולי עם ביצועים פחות טובים - אבל היא נשארת יציבה.

כשל כזה הוא לא נעים, אבל הוא ניתן להבנה, לניטור ולתיקון.

מה זה כשל רוחבי

כשל רוחבי נראה אחרת לגמרי.

כאן, תקלה קטנה יחסית -

  • timeout שלא טופל
  • retry אגרסיבי מדי
  • תור שהתנפח
  • תלות סינכרונית אחת יותר מדי

מתפשטת לרוחב המערכת: שירותים נוספים נתקעים, משאבים ננעלים, והמערכת כולה מאטה או קורסת.

לא בגלל שהכול נשבר - אלא בגלל שהכול קשור.

ההבדל הקריטי: בידוד, לא עוצמה

ההבדל הקריטי הוא לא בעוצמת הכשל, אלא במידת הבידוד.

כשל נקודתי נשאר מקומי כי המערכת יודעת להציב גבולות:

  • isolation בין רכיבים
  • backpressure
  • timeouts
  • כשל שמוחזר ככשל, ולא נסחב הלאה

כשל רוחבי קורה כשאין גבולות, וכשל אחד מקבל רשות לגרור אחריו את כולם.

שרשרת תגובות, לא באג אחד

מערכות לא קורסות בגלל באג אחד. הן קורסות בגלל שרשרת תגובות.

רכיב אחד מאט → אחרים ממתינים → התורים גדלים → ה-tail latency מתפוצץ → והעומס הופך מערכתי.

הכשל כבר לא שייך למקום שבו התחיל.

המשל

נורה אחת שנכבית - זה כשל נקודתי.

קצר שמפיל את כל החשמל - זה כשל רוחבי.

לא בגלל שהקצר “גדול”, אלא בגלל שאין הפרדה.

סיכום

מערכת יציבה לא שואפת להימנע מכשלים. זה בלתי אפשרי.

היא שואפת לדבר אחר: שכל כשל יישאר נקודתי.

כי ההבדל בין תקלה נסבלת לבין קריסה מערכתית הוא כמעט תמיד ההבדל בין כשל שמבודד - לכשל שמאפשרים לו להתפשט.

תגובות