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