Circuit Breaker: איך מונעים כשל בשירות אחד מלהפיל את כל המערכת

מאת צוות מדיה דיל · 30.08.2026 · טכנולוגיה · 6 דק׳

כשל בשירות אחד יכול להתפשט לכל המערכת אם אף אחד לא עוצר אותו. Circuit Breaker הוא הדפוס שמונע אפקט דומינו בארכיטקטורת מיקרו-שירותים.

שירות A קורא לשירות B, ושירות B נתקע או מגיב לאט מאוד. בלי הגנה, כל בקשה לשירות A מחכה לתשובה מ-B שלא מגיעה, עד שגם משאבי A מתמלאים ונופלים — כשל אחד קטן הופך לנפילה מדורגת של כל המערכת. Circuit Breaker נועד לעצור בדיוק את זה.

ההשראה מהעולם החשמלי

הרעיון שאול ממפסק חשמלי אמיתי: כשזרם חורג מהתקין, המפסק "קופץ" ומנתק את המעגל, מונע נזק נוסף במקום לתת לזרם החריג להמשיך לזרום. Circuit Breaker תוכנתי עושה בדיוק את זה עבור קריאות בין שירותים.

שלושת המצבים: Closed, Open, Half-Open

במצב Closed (רגיל), קריאות עוברות כרגיל לשירות היעד. אם אחוז הכשלים חוצה סף מסוים, המפסק עובר למצב Open — כל קריאה נדחית מיד בלי אפילו לנסות לפנות לשירות הכושל, מה שמונע בזבוז זמן וניקוז משאבים על קריאות שכמעט בטוח ייכשלו. אחרי פרק זמן, המפסק עובר למצב Half-Open ומרשה כמה קריאות בדיקה — אם הן מצליחות, חוזרים ל-Closed; אם לא, חוזרים ל-Open.

Fail Fast: היתרון המרכזי

במקום שכל בקשה תחכה לטיים-אאוט מלא לפני שהיא נכשלת, מפסק פתוח מחזיר כשל מיידי. זה משמעותי במיוחד תחת עומס — משאבים (Threads, חיבורי רשת) לא ננעלים בהמתנה לשירות שכנראה לא יענה בכל מקרה.

Fallback: מה קורה כשהמפסק פתוח

Circuit Breaker לרוב משולב עם לוגיקת Fallback — תשובה חלופית שמוחזרת כשהשירות המקורי לא זמין. לדוגמה, אם שירות המלצות נופל, המערכת יכולה להחזיר רשימת "מוצרים פופולריים" גנרית במקום שגיאה מוחלטת — חוויית משתמש מעט פחות מותאמת, אבל לא שבורה.

שילוב עם Retry: לא סותרים, משלימים

Retry (ניסיון חוזר) והמפסק לא סותרים זה את זה — Retry מטפל בכשלים חולפים בודדים (תקלת רשת רגעית), בעוד Circuit Breaker מזהה כשל מתמשך ועוצר את ניסיונות ה-Retry עצמם לפני שהם הופכים לעומס נוסף על שירות שכבר קורס.

הגדרת הסף הנכון

סף רגיש מדי (למשל 2 כשלים) גורם למפסק להיפתח על תנודות רגילות ברשת; סף רגוע מדי לא מגן מהר מספיק. הכיוונון הנכון דורש הבנה של דפוסי הכשל האמיתיים של השירות הספציפי, לא מספר שרירותי אחיד לכל המערכת.

Circuit Breaker כחלק ממערכת עמידה רחבה יותר

מפסק מעגל הוא רק כלי אחד בארגז הכלים של הנדסת עמידות (Resilience Engineering) — יחד עם Timeout, Bulkhead (בידוד משאבים בין שירותים), ו-Rate Limiting. השילוב הזה קריטי במיוחד במערכות מבוזרות מורכבות, מהסוג שדנו בו במאמר על Saga Pattern וטרנזקציות מבוזרות.

Bulkhead: בידוד משאבים בין שירותים

דפוס Bulkhead, בהשראת מחיצות אטומות בספינה, מקצה בריכת משאבים נפרדת (Threads, חיבורים) לכל שירות חיצוני, כך שגם אם שירות אחד תופס את כל המשאבים שהוקצו לו, זה לא פוגע ביכולת לפנות לשירותים אחרים. Circuit Breaker ו-Bulkhead משלימים זה את זה — האחד עוצר קריאות לשירות כושל, השני מבודד את הנזק גם לפני שהמפסק מספיק להיפתח.

ניטור מצב המפסק בזמן אמת

מפסק שעובר למצב Open הוא איתות קריטי לצוות התפעול — מדד שצריך להופיע בדשבורד ניטור בזמן אמת, לא רק ביומן שנבדק אחרי תקלה. זיהוי מהיר שמפסק נפתח מאפשר תגובה מהירה יותר לבעיה בשירות התלוי, לפני שהיא משפיעה על חוויית משתמשים רבים.

ספריות מוכנות במקום מימוש עצמי

ברוב השפות קיימות ספריות בשלות שמממשות Circuit Breaker נכון מהקופסה — Resilience4j ב-Java, Polly ב-.NET, opossum ב-Node.js. מימוש עצמי מהיר נראה פשוט על הנייר, אבל קל לפספס בו את פינות המקרה העדינות (ריבוי חוטים, כיוונון סף דינמי) שספרייה בשלה כבר פתרה.

המערכת שלכם רגישה לכשל בשירות בודד? מוזמנים לפתוח שיחה בוואטסאפ.

תגיות: Circuit Breaker · Resilience Engineering · Microservices · Distributed Systems

← חזרה לבלוג · צור קשר