מפסק מעגל והשפלה
Circuit Breaker (בראשי תיבות: CB) היא תבנית אבטחה המפריעה לקריאות לתלות מושחתת במיקום הכשל ולהגן על השירותים במעלה הזרם ועל המשתמש. פישוט מכוון של הפונקציונליות במקרה של חוסר משאבים או כשלים (למשל, החזרת נתונים מטופלים/לא שלמים, ביטול תכונות ”יקרות”) ללא השבתה מלאה.
המטרה העיקרית: לשמר את SLO וחוויית המשתמש באמצעות כשלים מבוקרים, במקום טיפות מפלות.
1) מתי ליישם
התלות אינה יציבה: צמיחת p95/p99, פסקי זמן, תשובות שגויות.
צווים חיצוניים עם גבולות/עונשים מחמירים.
גיבוי ”כבד” (חיפוש, המלצות, דוחות), שבו מגשים מחדש את הסערה.
אזורים טעונים מאוד עם סיכון של ריקון בריכות (חיבורים, אשכולות).
2) מצבי CB ומעברים
משולש קלאסי:1. סגור - התנועה הולכת, מדדי שגיאה/תלאות נספרים.
2. שיחות פתוחות נדחות מיידית (אל-כשל) ו/או מועברות לנסיגה.
3. מספר מוגבל של בקשות ”ניסוי” לקבוע אם לסגור את המתג.
מפעיל פתיחה
שגיאה/זמן סף לכל חלון (לדוגמה, 50% מהN האחרון).
סף האחיזה (לדוגמה: p95> היעד).
מדיניות משולבת (שגיאות זמן חרגו).
להחזיק זמן (להתקרר)
קבוע (לדוגמה, 10-60 שניות) או הסתגלות (עלייה מעריכית עם פעולות חוזרות).
3) פסקי זמן, נסיגות וריגושים
פסקי זמן הם תמיד קצרים יותר מ-SLOs במעלה הזרם והם התפשטות המועד האחרון.
רטריי רק לפעולות אידמפוטנטיות; 1-2 ניסיונות מספיקים ברוב המקרים.
Backoff + jitter (ג 'יטר מלא) מונע גלים סינכרוניים של חזרות.
גידור (בקשות חילוף) - חסכוני ורק לקריאות ביקורתיות מאוד.
4) בידוד מחיצות ו ”נתיכים”
חיבור/פועל/תור בריכות לפי תחום וסוג התנועה (VIP, משימות רקע, API ציבורי).
כובע על מקביל לניתוחים ”יקרים”.
בקרת כניסה: כישלון קל לפני ביצוע כאשר התור מלא.
5) גיבוי ותרחישי השפלה
אפשרויות
תגובות מטמון/סגנון: ”מעופש בזמן מחדש”, חוזר נתונים ממטמון L2/L3.
קריאה בלבד: בלוק של כתיבה/פקודות, לאפשר קריאות בטוחות.
תגובות פונדקאות: נתונים לא שלמים (למשל, אין המלצות/אווטארים).
ביטול תפקודי: באופן זמני להסתיר ווידג 'טים/תכונות לא קריטיות.
דגלי תכונה: שינוי מהיר של התנהגות ללא שחרור.
כללים
הגיבוי חייב להיות דטרמיניסטי, מהיר, ובטוח מנתונים.
סמן במפורש את המסלול המושפל ברישומים/רצועות/מדטים.
6) עדיפות ועיצוב תנועה
תוכניות VIP/בתשלום - עדיפות גבוהה יותר/מכסות במקרה של מחסור.
מגבלות קצב וחנק להפחית את הנטל על תלויות מושחתות.
העומס: הפחתה רכה באיכות (למשל: פחות תוצאות, תמונות מקושטות) עד שהתייצב.
7) יכולת תצפית וסימון
מדדי CB
מצב (סגור/פתוח/חצי פתוח) ומשך זמן במצב.
נתח הכישלונות על ידי גורמים: CB-פתוח, פסק זמן, 5xx, מותש מחדש.
p95/p99 latency ”לפני” ו ”אחרי” המתג.
מספר/אחוז של בקשות באמצעות נסיגה.
איתור
אנוטציות של תוחלת: 'מעגל = נפתח', 'נפילה = מטמון', 'הודאה = נדחתה'.
מתאם עם גבולות (429/EoutLimit-), תורים וקליעי חיבור.
יומנים/Audits
סיבה לפתיחה/סגירה, סף, זיהוי תלות.
8) חוזים ופרוטוקול
HTTP
כשל מהיר: '503 שירות לא זמין' עם 'Retry-After' (או '429' בגבולות).
תוכן חלקי/מעופש: '200 '/' 206' עם מטאדטה מושפלת (לדוגמה, 'X-Direded: True').
מדיניות מטמון: ”מטמון-בקרה: מעופש-אם-טעות, מעופש-בזמן-ביטול”.
gRPC
”לא זמין”, ”דדליין _ חרג”, מגש מחדש סמנטיקה על ידי מדיניות לקוח/פרוקסי.
מועד אחרון/פסק זמן בהקשר הבקשה; להפיץ את המועד האחרון במורד השרשרת.
Idempotency
'Idempotency-Key' עבור פעולות פוסט, שכפול בגבול.
9) יישום טיפוסי (קוד פסאודו)
pseudo onRequest(req):
if circuit. isOpen(dep):
return fallbackOrFail(req)
with timeout(T):
try:
resp = call(dep, req)
circuit. recordSuccess(dep, latency=resp. latency)
return resp except TimeoutError or 5xx as e:
circuit. recordFailure(dep)
if circuit. shouldOpen(dep):
circuit. open(dep, coolDown=adaptive())
return fallbackOrFail(req)
דגימה חצי פתוחה
pseudo onTimer():
if circuit. state(dep) == OPEN and coolDownExpired():
circuit. toHalfOpen(dep)
onRequestHalfOpen(req):
if circuit. allowTrial (dep): # e.g. 1 try: call -> success => close catch: reopen with longer coolDown else:
return fallbackOrFail(req)
10) הגדרת סף
חלון תצפית: הזזה N שניות/שאילתות.
סף שגיאה: 20-50% בחלון (תלוי בפרופיל).
סף Latency: p95 nature SLO (לדוגמה, 300-500 ms); העודף נחשב כ ”שגיאה” עבור הסי-בי.
התקררות אדפטיבית: שנות ה-30/30 עם פעולות חוזרות ונשנות.
11) בדיקות ושיטות תוהו ובוהו
כאוס: הזרקת שגיאות איחור/תלות, התפרקות DNS, טיפת מנות.
ימי משחק: מתחיל ”פתיחה” של המתג על סביבה דמוית קרב, בדיקת הנסיגה.
Canary: אפשר מדיניות POC/Degradation תחילה עבור 1-5% מהתנועה.
תקציב SLO: לאפשר ניסויים עד תקצוב טעות מותש.
12) אינטגרציה עם עמידות מרובה
ניתן לאחסן את מצב ה ־ CB לכל דייר (עבור דיירים רועשים) או באופן גלובלי - בהתאם לפרופיל הטעינה.
הקצה את נתוני הגיבוי והמטמונים של "דייר _ id'.
סדרי עדיפויות/מכסות - בהתאם לתוכניות (אח "מים לא צריכים לסבול מהתנהגות סטרטר).
13) רשימת בדיקות לפני המכירה
[ ] זמן ומועדים הם מקצה אל קצה ועקביים.
[ ] המגשים מוגבלים, רק לפעולות אידמפוטנטיות, עם גיבוי + ג 'יטר.
[ ] סף CB מוצדק על ידי נתוני בדיקת עומס.
[ ] שבילי פלבק קיימים, מהירים ומאובטחים; מטמון מדיניות מוגדר.
[ ] בידוד מחיצה: בריכות נפרדות/תורים/גבולות.
[ ] Metrics/trails/looks flag degradation ומדינות CB.
[ תיעוד חוזה תגובה ] (HTTP/gRPC) עם כותרות/קודים לדוגמה.
[ ] תרחישי כאוס וימי משחק מתרחשים באופן קבוע; יש פנקס ריצות.
14) שגיאות אופייניות
אין פסקי זמן = נסיגות ”כל הדרך” ונפילות מפלים.
CB גלובלי יחיד במקום סלקטיבי (על ידי סוף נקודה/שיטה) - כשלים מיותרים.
Open Switch About Fallback Ackets במקום UX מושפל.
רטריי ללא ג 'יטר * סערות סינכרוניות של בקשות.
התקררות ארוכה עם כישלונות לטווח קצר או קצר מדי עם מדינות יציבה - ”פליפ-פלופ”.
היעדר מחיצה - ריקון בריכות משותפות ו ”חסימת ראש הקו”.
15) בחירת אסטרטגיה מהירה
קריאה בעלת חשיבות גבוהה: CB + cache של תגובות שפל + גידור (חסכוני).
רישומים/תשלומים: פסקי זמן מחמירים, מגשים מינימליים, מפתחות אידמפוטנטיות, אין נסיגה מלוכלכת.
CB עם סף אגרסיבי, התקררות אדפטיבית, חניקה קפדנית.
מיקרו-ארובות עומס פועמות: מחיצות, כיפות לכל מקורה, עדיפות אח "מים.
סיכום
שובר מעגלים והשפלה מנוהלת הם ”ביטוח” ארכיטקטוני: הם מתרגמים כשלים כאוטיים להתנהגות צפויה. פסקי זמן ברורים, ריגושים מוגבלים, בריכות מבודדות, נתיבי נפילה מתחשבים, וטלמטריה הופכים את המערכת לעמידה בפני כשלים בתלות ומחזיקים סל "ד גם בתקופות השיא וההתרסקות.