כתיבה בכמה אזורים: היכן השינוי למעשה נקבע?
ניתוב מביא בקשה לאזור; רק גבול של טרנזקציה הופך כתיבה לאטומית. תנו שם לאינווריאנטה, בחרו את הבעלים, ואז תכננו את הניסיון החוזר סביבה.
שני שרתי אפליקציה בשני אזורים, לקוח אחד שכותב דרך VPN, ושאלה שאף אחד לא כתב: איזה רכיב מחליט שהכתיבה קרתה? הניתוב מביא את הבקשה לתהליך. גבול של טרנזקציה מחליט מתי השינוי הופך לעמיד וגלוי. אלה עבודות שונות שמבצעות מערכות שונות, והפער ביניהן הוא המקום שבו חיות רוב התקלות בכתיבה בריבוי אזורים.
התחילו מכלל העסק, לא מהמפה
התחילו במשפט על כלל העסק ולא על הגאוגרפיה: אילו קריאות וכתיבות חייבות להצליח יחד, ואילו שינויים מקבילים חייבים להיות בלתי אפשריים בזמן שזה קורה. עבור שריון מלאי זה אומר שבדיקת המלאי והשריון או ששניהם נכנסים לתוקף או שאף אחד מהם, ושום הזמנה שנייה לא רשאית לצרוך את אותה יחידה בינתיים.
| Requirement | What satisfies it | What does not |
|---|---|---|
| All-or-nothing application | A transaction inside one owning system | A VPN path between regions |
| No double spend | Isolation strong enough to exclude the conflict | Atomicity alone |
| Survive a region loss | Replication the database itself documents | Two independent databases behind one client |
דווקא השורה האמצעית הזו היא שצוותים מדלגים עליה. אטומיות בלי בידוד מספיק מאפשרת לשתי טרנזקציות כל אחת להיחתם כראוי ובכל זאת להפיק מצב שהעסק מחשיב כבלתי אפשרי, ושום כמות של לוגיקת ניסיון חוזר לא מתקנת את זה אחר כך.
גבול סמכותי אחד מנצח שני שרתים אזוריים
שרתי אפליקציה אזוריים יכולים להישאר במקומם, כל עוד הם מגישים את הפעולה לשירות שמבצע אותה בתוך גבול טרנזקציה נתמך אחד. שכבת האפליקציה הופכת לנתב של כוונה; שכבת הנתונים מחזיקה באמת.
השאירו את הגבול הזה קצר וקרוב לנתונים שהוא נוגע בהם. טרנזקציה שנשארת פתוחה בזמן שאדם עונה להנחיה, או בזמן שקריאה חוצה שני אזורים, מבזבזת את זמנה בהחזקת מנעולים ומגדילה את הסיכוי שמשהו אחר יפוג מאחוריה. התקלה הזו נראית כמו בעיית מסד נתונים ולמעשה היא בעיית תכנון שלובשת תחפושת כזו. העברת ההחלטה לשכבת הנתונים בדרך כלל מסלקת אותה לגמרי.
BEGIN;
UPDATE inventory SET reserved = reserved + 1
WHERE sku = 'A-100' AND available >= 1;
INSERT INTO reservation (sku, order_id) VALUES ('A-100', 'ord-9f');
COMMIT;
קראו את השרטוט הזה כגבול, לא כהמלצת ביצועים. הנקודה היא שהבדיקה וההכנסה חולקות חתימה אחת, ולכן הזמנה מקבילה או רואה את המלאי נצרך או לא רואה אותו כלל.
מה מסד נתונים משוכפל נותן ומה לא
מסד נתונים משוכפל יכול לספק גבול רחב יותר כאשר מודל הטרנזקציות שלו תומך בכך. Spanner מתעד טרנזקציות קריאה-כתיבה אטומיות בתוך מסד נתונים אחד על פני טבלאות, עם בידוד והתנהגות ניסיון חוזר מוגדרים. זו הבטחה שקוראים, בודקים ונשענים עליה בכוונה.
זו גם הבטחה שמגיעה מהמוצר, לא מהמסלול. VPN בין אזורים משנה איך חבילות נוסעות ואיך תקלות מציגות את עצמן. הוא לא מרחיב גבול טרנזקציה ולו בשורה אחת, כמה שהמנהרה תיראה בריאה. ערבוב בין השניים מייצר ארכיטקטורות שבהן כל רכיב עובר את הבדיקה שלו והנתונים עדיין לא מסכימים.
שני מסדי נתונים לא הופכים למערכת אחת
שני מסדי נתונים שמנוהלים בנפרד לא מקבלים מנהל טרנזקציות משותף מפני שלקוחות יכולים להגיע לשניהם. אם העסק באמת זקוק להתחייבות אטומית על פני השניים, מנגנון התיאום, המשתתפים ותהליך השחזור חייבים להיבחר ולהיות מוסמכים ולא להיות מונחים כמובן מאליו.
חשבו על הרגע שבו משתתף או קישור נעלם אחרי שהעבודה הוכנה. התחייבות מבוזרת נתמכת יכולה להשאיר מצב לא ברור שדורש נוהל שחזור והחלטה אנושית, והיא אינה מגיעה עם הבטחה שכל אזור יישאר ניתן לכתיבה דרך כל מחיצה.
אם לעומת זאת תיאום אסינכרוני מקובל, אמרו זאת במפורש וכתבו את מצבי הביניים העסקיים ואת כללי הפיוס. שרשרת של שלבים שנחתמו מקומית עם פיצוי היא תכנון לגיטימי; היא פשוט אינה טרנזקציה אטומית אחת בשם אחר.
תכננו את הניסיון החוזר לפני התקלה הראשונה
לקוח יכול לאבד את התגובה אחרי שהפעולה נחתמה, ולכן הקורא לא יכול להתייחס לפסק זמן כאל כשל. שמרו זהות בקשה עמידה והשתמשו בתוצאת השירות או במנגנון אידמפוטנטיות לפני ניסיון חוזר לשנות, אחרת הניסיון החוזר הופך לכתיבה שנייה.
קריאות חזרה אוטומטיות של טרנזקציות יכולות גם לרוץ יותר מפעם אחת אחרי ביטול שניתן לחזור עליו, מה שהופך אותן לבית גרוע להשפעות חיצוניות בלתי הפיכות. החזיקו אותן מחוץ לקריאת החזרה אלא אם זרימת העבודה מגדירה עבורן פרוטוקול בטוח מפורש. אותה זהירות חלה על כל דבר שעולה כסף או שולח הודעה. חיוב כפול הוא שיחה קשה בהרבה משורת יומן כפולה.
הקבלה צריכה לשחזר ארבעה תרחישים: שני לקוחות שמתחרים על אותה שורה, ביטול שהשירות אומר שניתן לחזור עליו, חתימה שהתשובה שלה לא מגיעה לעולם, ואובדן של אזור או של הקישור ביניהם. תעדו את התוצאה העסקית שנחתמה ואת המצבים שלא נפתרו לצד תכנון הניתוב, כדי שאף אחד לא יחשוב שהרשת היא הרכיב שמספק את ההבטחה.