Backpressure - כשלא אומרים "כן" לכול
Backpressure - כשלא אומרים “כן” לכול
אחרי שראינו למה מערכות נשברות מ-spikes ולא מעומס קבוע, עולה שאלה לא נוחה אך הכרחית:
מה קורה כשהמערכת פשוט לא מסוגלת לעמוד בקצב?
האינסטינקט הנפוץ הוא: לנסות לעמוד בזה בכל מחיר.
וזו בדיוק הבעיה.
מערכות שלא יודעות להגיד “לא”
מערכת שמנסה לקבל כל בקשה:
- מחזיקה תורים הולכים ומתארכים
- גוררת Latency גבוה לכל הבקשות
- ומעמיסה גם על רכיבים בריאים
היא אולי אדיבה - אבל היא מסוכנת.
כי במקום להיכשל מוקדם ומקומית, היא גורמת לכשל רחב ואיטי.
מה זה בעצם Backpressure
Backpressure הוא עיקרון פשוט אך לא אינטואיטיבי:
כאשר רכיב במורד השרשרת מתקשה - הוא מאותת לרכיב שמעליו להאט, לדחות, או לעצור.
לא להעמיס עוד. לא “להסתדר איכשהו”. אלא לשקף את המציאות.
זהו מנגנון שבו הקצב מוכתב על-ידי החוליה החלשה, ולא על-ידי מי ששולח הכי מהר.
למה Backpressure מרגיש לא טבעי
כי הוא מנוגד לאינטואיציה של שירות.
קל יותר לחשוב:
- “נכניס לתור ונפתור אחר כך”
- “לא נאכזב עכשיו”
- “המערכת תתאושש”
אבל בפועל, כל בקשה שנכנסת בזמן עומס היא התחייבות עתידית.
Backpressure הוא הבחירה לא להתחייב.
איפה שמים Backpressure
Backpressure אינו רכיב אחד - הוא החלטה על גבול.
אפשר לממש אותו ב:
- דחיית בקשות בשער הכניסה
- הגבלת קצב בין רכיבים
- החזרת שגיאה מהירה במקום המתנה
- או עצירה זמנית של קבלת בקשות מתור
המקום המדויק פחות חשוב מהעיקרון: העומס חייב להיבלם לפני שהוא מתפשט.
ההבדל בין דחייה לשבירה
יש הבדל קריטי בין:
להגיד “לא עכשיו” לבין: להגיד “כן” ואז לא לעמוד בזה
דחייה:
- פוגעת בחלק מהבקשות
- שומרת על המערכת
- ומאפשרת התאוששות מהירה
שבירה:
- פוגעת בכולן
- יוצרת אי-יציבות
- ומובילה לקריסות שרשרת
Backpressure הוא הבחירה בדחייה מבוקרת על פני שבירה כללית.
המשל
אפשר לחשוב על מעלית.
אם היא מלאה, היא פשוט לא נסגרת על עוד אנשים.
היא לא מנסה “להסתדר”, לא לוחצת יותר חזק, ולא מקווה שמשהו יקרה.
היא לא מסתכנת בכך שתפסיק לעבוד מרוב עומס.
היא מגבילה - וכך נשארת בטוחה.
Backpressure כעיקרון תרבותי
מערכות שיש בהן Backpressure משדרות:
- גבולות ברורים
- עדיפות ליציבות על פני נימוס
- והבנה שעומס הוא חלק מהחיים
מערכות שאין בהן Backpressure נשענות על תקווה.
ובפרודקשן, תקווה אינה אסטרטגיה. היא סיכון.
מבט קדימה
Backpressure עוצר את הזרימה - אבל הוא לא פותר הכול.
כי גם תור “מבוקר” הוא עדיין תור.
ובשלב מסוים צריך לשאול: מה המחיר של ההמתנה עצמה?
בפוסט הבא נצלול לנקודה הזו בדיוק: למה Queue אינו פתרון - אלא התחייבות עתידית שעלולה להפוך לחוב.
📚 פוסטים נוספים בסדרה: כשהתקשורת נשברת
- חלק 0 כשהתקשורת נשברת - הנדסה תחת עומס, כשל ואי-ודאות
- חלק 1 הנחת היסוד המסוכנת - הרשת אמינה "ברוב הזמן"
- חלק 2 Timeouts - ההחלטה הקשה ביותר בתקשורת
- חלק 3 Retries - מנגנון התאוששות או מכפיל נזק
- חלק 4 Load אינו אויב - Spikes כן
- חלק 6 Queue אינו פתרון - הוא התחייבות
- חלק 7 Ordering - למה סדר הוא מותרות יקרות
- חלק 8 Idempotency - לתכנן כאילו הכול יישלח פעמיים
- חלק 9 Consistency מול Availability - לא תיאוריה, אלא בחירה יומיומית
- חלק 10 RPC, Messaging, Streaming - שלוש פילוסופיות תקשורת
- חלק 11 Stateless זה לא שאין State - זה איפה הוא נמצא
- חלק 12 תקשורת כמשקפת תרבות הנדסית
- חלק 13 מערכות שמחזיקות - לא בגלל שהן חכמות, אלא בגלל שהן צנועות
- חלק 14 מה למדנו - מפת הדרך של הסדרה כולה