חמש שגיאות אינטגרציה קריטיות של API בהפעלה
שגיאה # 1. אין אימפוטנציה ו ”סערה” של נסיגות
תסמינים: הזמנות/תשלומים כפולים, אי התאמה בכמויות, החזרות שנויות במחלוקת, התראות DLQ גדלות.
Root: משלוח חוזר של בקשות/פנקסי רשת הם נורמליים. אם פעולת ”צור/כבה” אינה אידמפוטנטית, מגשים מחדש מכפילים את הנזק.
איך לעשות את זה?
Idempotency-Key/' operation _ id 'לכל השיטות הלא בטוחות (POST/PATCH).
אינדקס ייחודי בבסיס הנתונים עבור "operation _ id'. שידור חוזר - החזר את התוצאה הקודמת.
Webhooks דרך טבלת Inbox (dedupe by ”event _ id + signate”). אירועים יוצאים מהארון.
רטריי: מקסימום 1-2 פעמים, אקספוננט + jitter, רק לפעולות בטוחות.
אמנת HTTP (דוגמה):http
פוסט/v1/תשלומים
Idempotency-Key: ik_f35a2
תוכן-סוג: יישום/json
”סכום”: 5000, ”מטבע”: ”EUR”, ”מקור”: ”card_..."”sql
תשלומי שולחן שינוי להוסיף קונסטריינט uniq_op ייחודי (operation_id);פיתון עבור i בטווח (2):
נסה: החזר call_api (מטען, פסק זמן = 0. 6)
מלבד פסק זמן:
שינה (0. 05 2i + אקראי. אחיד (0, 0. 05))
הרם את הדמיוןweather condition[ ] לכל ההיגיון ”כסף/יצירת” יש 'operation _ id' and uniq index.[ ] ספרי אינטרנט נכנסים רק דרך תיבת דנ "א עם עובד אידמפוטנט.[ ] הלקוח SDK קובע אוטומטית את מפתח האידמפוטנטיות.שגיאה מספר 2. פסקי זמן/מגשים נגד SLO:
- תסמינים: p95 פתאום צף משם, תורים גדלים, מפסק ”פוני”.
- Root: ה-SLO הכולל של התגובה הוא 400-600 ms, ופסקי זמן ל-API חיצוניים הם 1-2 S, ואפילו מגשים מחדש x 3. אתה עושה יותר ממה שאתה יכול ואתה להסתער ההתמכרות עם חזרות.
איך לעשות את זה?
עיתוי התקציב: אם SLO הוא 400 ms, זמן מעבר לזרם: 250-300 ms; פסק זמן מוחלט של בקשת SLO.
Backpressure/Backpressure: semaphores/worker-book לקריאות לכל תלות. צפוף פי 429/503 בבת אחת.
מפסק: ”פתוח” עם פסקי זמן/5xx, ”חצי פתוח” מינון.
בקרת כניסה: להגביל את הקונקורנסי (לכל חוט, לכל פוינט/PSP).
דוגמה (קדימה):go sem: = הפוך (chan strut;, 64 )//תחרות גבול PSP Func callPSP (ctx. הקשר, Req Req) (Res, שגיאה)
בחר *
case sem <- strut ():
defer func () <- sem ()
c, לבטל: = הקשר. עם Timeout (ctx, 300time. אלפיות שנייה)
דפר ביטול ()
להחזיר psp. דו (c, req)
ברירת מחדל:
החזר RES's, שליחות עסוקה//כישלון מיידי במקום תור אינסופי
}
}[ ] פסקי זמן קצרים יותר מ-SLO; רטריי 2; יש ריגוש.[ ] בריכות/סמפורות ל-API חיצוני; מפסק חשמלי עם מדדים.[ ] בדרכים עמוסות, אנחנו חוזרים 429/Retry-After, לא לשמור על קשרים.שגיאה מספר 3. אבטחה חלשה: חתימות Webhook, סודות, TLS
תסמינים: ”טלפונים של אחרים” עוברים, סודות בקוד/יומן, סיכוני MITM.
אין חתימה/בדיקת רעננות, סודות חיים בקבצי env, TLS ישנים וכותרות חלשות.
איך לעשות את זה?
חתימה של חוברות אינטרנט HMAC-SHA256 + 'X-Timestamp' (חלון ציון 5-10 דקות), השוואה קפדנית של חתימה.
MTLS עבור אינטגרציות קריטיות או IP-list-list.
סיבוב של סודות באמצעות כספת/ענן KMS; זכויות מינימום; ביקורת חיסור.
TLS 1. 2/1. 3 בלבד, HSTS, נכון CORS (רשימת המקור הצרה).
אימות חתימה (פייתון):Python def לאמת (sig_hdr, ts_hdr, גוף, סוד):
אם שרירי בטן (זמן. זמן () - int (ts_hdr))> 600: להעלות פג תוקף ()
Calc = hmac. (סוד חדש, (ts_hdr + ”” + גוף). Encode (), Haslib. Sha256). הקסדיגסט (באנגלית: hexdigest
אם לא המק. compare_digest (calc, sig_hdr): להעלות BadSig ()[ ] כל הספרים חתומים ומאומתים; חלון הטריות מוגבל.[ ] סודות בקמ "ס/כספת, יש סיבוב וביקורת.[ ] TLS/HSTS מופעל; נקודת CORS; IP/mTLS במקום המתאים.שגיאה מספר 4. סחף חוזה: התוכנית ”חי את חייו”
התסמינים: הדרבן נפל ”רק אצל כמה לקוחות”, 500/422 ביומנים, גרסאות שונות של ה-SDK וה-API.
שורש: אין תיאור קפדני של חוזים, שינויים לא תואמים לאחור, שדות ”שקטים”, משמעויות שונות לאותם שמות.
איך לעשות את זה?
חוזה-ראשון: OpenAPI/AsyncAPI + שרת/לקוח דור; לאירועים - Avro/Protobuf + Schema Registry.
ורסיונינג: 'v1' v2 '(URI/header), סטייה-תכנית, חסד-נקודה.
אחורה-compat: רק שינויים תוספים בשחרורים מינוריים; לא ניתן למחוק/לשנות את שם ללא v-bump.
מבחני חוזה: Pact/Buf - ספק/צרכן נבחנים ב CI.
דוגמאות:יאמל (yaml)
OpenAPI: ברור סוג של סכום ביחידות amount_minor קטנות:
סוג: מספר שלם מינימום: 0 תיאור: סכום במינימום יחידות מטבע (מספר שלם)[ החוזים ] מאוחסנים ב-GIT, המודיעים מאשרים/שוברים אם אינם מתאימים.[ סכימה ] נרשמת לאירועים, ”אחורה/קדימה” תאימות.[ ] עמוד עגינה של שינויים, תאריכי שפל, ספסל מבחן לשותפים.שגיאה מספר 5. השקת ”עיוור”: ללא מדדים/רישומים/שבילים וארגז חול
התסמינים: ”שום דבר לא נראה לעין”, התמיכה מתמלאת, ידיים מנופחות בדרבן.
שורש: יכולת ההבחנה לא נכללה, אין סינתטיים, ארגז החול נוסה ”במילים”.
איך לעשות את זה?
מדדי RED/USE: קצב/שגיאה/latency על כל קצה, על ידי מסלול/שיטה.
קורלציה: "trace _ id' בכל הרישומים והתגובות; צרור של zapros↔vebkhuk.
סינתטיים: בדיקות בריאות (כניסה/הפקדה), SLA ניטור T + 60 עבור חוברות אינטרנט.
ארגז חול/שלב: מפתחות/תחומים מבודדים לחלוטין, PSP פיקטיבי, רשומות ”לא כלולות בדיווחים”.
תגובה עם זיהוי עקבות:http
HTTP/1. 1 202 מתקבל
עקבות: 7f2b3d8e9c1a4
מיקום :/ v1/ops/req_42/status[ ] מדדי RED/USE, לוחות מחוונים, התראות (תסמינים + סיבות).[ ] שבילים מקצה לקצה; יומני JSON, לא PII, עם "trace _ id'.[ ] סינתטיים מאזורי מפתח; ארגז חול נדרש, מפתחות שונים.Prelunch Plan (T-7 # T-0)
T-7 ימים:- סריקת חוזה סופית: האם יש שינויים לא מתאימים; להקפיא מזימות.
- סודות/תעודות: בדיקת סבב, גישה, מדיניות KMS.
- סינתטיים 24 × 7, התראות קשורות בכוננות.
- העמסת מיני-ריצה (פרץ 2-5 דקות): p95/בריכות/תורים באזור הירוק.
- DRUN-RUN (שידור חוזר, 5XX, jitter), בדיקת DLQ.
- ”ספר טלפונים” של שותפים: אנשי קשר L1/L2, ערוץ חדר מלחמה.
- תעבורת ערוצים 5% * 25% * 50% עבור שערי SLO; מוכן לגלגל בחזרה.
- מתג-חיסול/דגלי תכונה על תכונות מסוכנות כלולים.
- חדר המלחמה פעיל, תבניות מצב מוכנות.
תוכנית רולבק (אם משהו השתבש)
1. שחרר את התנועה לגרסה היציבה/מסלול הקודם.
2. לבטל פישפלאג שינויים שנויים במחלוקת.
3. לייצב תורים/בריכות, לעצור נסיגות בסערה.
4. פוסט-תקרית: לאסוף ציר זמן, שורשים, משימות (תיקונים מקדימה/חוזה).
התחל טבלת בדיקה עצמית (קצר)
לעתים קרובות שאל ”מה אם”...
... הספק אינו תומך במפתח אידמפוטנטי?
Stork 'hash' (גוף) '+' partner _ request _ id 'והכנס את האידמפוטנטיות שלך.
... קובצי אינטרנט לפעמים באים ”לפני” התשובה?
לתפור על "operation _ id' ולשמור באופן זמני את הסטטוס" לא ידוע pressibile "; מפייס תקופתי יסגור סתירות.
... צריך לתמוך בלקוחות ישנים וחדשים?
גרסה של נקודות הקצה ('/v1&fospos ו- '/v2 '), מסלול על ידי כותרת/URI, שמור על תאימות לאחור לפחות למשך N חודשים.
המשך תקציר
כישלונות אינטגרציה הם כמעט תמיד על אותו הדבר: אין אידמפוטנטיות, פסקי זמן לא נכונים ונסיגות, חתימה חלשה של פתקי אינטרנט, סחף חוזה וחוסר ראות. תקן חוזים מראש, אפשר יכולת תצפית, הצב גבולות/תרמיל גב, לחתום על כל האינטראקציות החיצוניות ולהפעיל סינתטיים. אז, גם במקרה של כשלים של שותפים, השחרור שלך יישאר לניהול - ללא כסף שאבד ב retras, וללא לילה ללא שינה לכל הצוות.
