Logo GH

התאמת API ותאימות חוזה

TL; DR

תאימות היא משמעת, לא מזל. לשמור על מדיניות גירסה ברורה (SemVer), לשנות מתמטיקה (מה ”שובר”, מה שלא), מבחני חוזה, סכימות, ונהלי שקיעה. עבור כסף ותאימות - REST/gRPC קפדנית עם vN, עבור אגרגציות UI - GraphQL אבולוציונית עם '@ disured'. תמיד: תנועה כנרית, תאימות לאחור, מחזור שחרור אחד, מדריכי נדידה, טלמטריה בשטח.

1) מושגים ומטרות בסיסיים

התאמה לאחור (BC): לקוחות ישנים מתאימים לשרת החדש.
FFC: לקוחות חדשים מתאימים לשרת הישן (מוגבל).
תאימות חוט: הפורמט על התייל אינו נשבר (חשוב במיוחד עבור gRPC/Protobuf).
סימוור: "מייג 'ור. מינורי. Patch '- לשבור את החוזה = להעלות מייג' ור.

המטרה היא למזער שינויים מפריעים ולספק חלונות נדידה צפויים.

2) שינוי מטריקס: מה שאתה יכול ולא יכול

סוג השינוימנוחהGRPC (פרוטובוף)GraphQL
הוסף שדה (תגובה)+ בטוח+ בטוח (מספר שדה חדש)+ בטוח
הוספת שדה אופציונלי (בקשה)אם השרת סובל היעדרות של+ בטוח+ בטוח
מחק שדהשבירה -- אם תשתמש שוב במספר -after '@ decreted' lick למחוק אחרי החלון
שינוי שם שדהשבירה -- (שינוי שם, לשמור מספר)כינוי/שני שדות זמן
שינוי סוג/תבניתשבירה -- בשינוי סוג חוט --אם שובר את המעגל
שינוי סמנטיקה סטטוס/שגיאהשבירה -קודים/חלקים - חוזה- שוברים לקוחות
שינוי סדר באנוםערכי הוא בטוחאם מספרי אנום יציבים+ בשם בטוח
נקודת סוף/שיטות חדשות+ בטוח+ בטוח+ בטוח
שינוי סגידה/מסנניםבזהירות, להוסיף אפשרויות+ באמצעות שדות חדשים+ באמצעות ויכוחים חדשים

3) מדיניות לסגנונות API שונים

3. 1 מנוחה

גרסה ב ־ URI ("/v1/... ) או תחום ('api-v1. '). גרסת כותרת למקרים פנימיים בלבד.
הוסף, אל תמחק: שדות חדשים - אוקי, סימן ישן כ ”מנותק” בתרשים ועזוב לפחות למחזור אחד.
סטטוסים/שגיאות: אל תשנו את הקודים והמבנה. קוד/שגיאה. הודעה/טעות. פרטים ".
אידמפוטנטיות אינה משתנה: אל תהפוך ”פוסט” מאובטח עם ”מפתח אידמפוטנטי” לאתגר ”שונה מבחינה התנהגותית”.

3. 2 GRPC/Protobuf

מספרי שדה הם קדושים: אל תשתמש שוב במספרים שנמחקו, סמן כ ”שמורים”.
רק הוספת שדות אופציונליים/רפיט חדשים; "חובה קשה" - באמצעות אימות, לא מחדש ".
חבילות גרסה: 'תשלומים. v1 ',' תשלומים. v2 '.
תאימות שירות: RPCs חדשים * שיטה חדשה; אנחנו לא משנים את ההתנהגות של הישן.

proto message Payout {
reserved 4 ;//field deleted, number reserved string id = 1;
string currency = 2;
int64 amount_minor = 3;
// v2: optional string comment = 5;
}

3. 3 GraphQL

אבולוציה ללא v2: הוספת שדות/סוגים; מחיקה - דרך '@ decreted (סיבה) "עם ההכרזה של החלון.
שאילתות מתמידות: ללקוחות ציבוריים, להשתמש בלבן של שאילתות - קל יותר לשלוט בתאימות.
שטח ברמת AuthZ וטלמטריה: יודעים אילו שדות משמשים למעשה לפני מחיקה.

graphql type Payout {
id: ID!
amountMinor: Long!
currency: String!
comment: String @deprecated(reason: "Use note")
note: String
}

3. 4 חוברות אינטרנט

גרסה במסלול ('/webhooks/v1/piples ') ומעטפת אירוע קבועה (' event _ id', 'type', 'ts',' data ').
שמור חתימות/NMAS ללא שינוי; אלגוריתמים חדשים כאפשרות עם דגל.
הרחבות - רק דרך הנתונים של השדות החדשים. ובלי למחוק את הישנים.

4) שער API וניתוב גרסה

ניתוב מבוסס חוקים: על ידי קידומת '/v1 ', על ידי כותרת' X-Api-Version ', על ידי תחום.
Shadow/Canary: לשקף חלק מתנועת הייצור בגרסה החדשה ”אל הצללים”, להשוות את התשובות.
Rate/Quotas לכל גרסה: מגן על לקוחות מבוגרים במהלך הגירה.

כותרות שקיעה למנוחה:
  • שקיעה: - תאריך כיבוי גרסה
  • הפחתה: נכון - הגרסה הופכת למיושנת
  • קישור: rel = ”ירידה” - על changelog/nigering המדריך
דוגמה (בסגנון נגינקס, מפושט):
nginx location ~ ^/v2/ {
proxy_pass http://api_v2;
}
location ~ ^/v1/ {
add_header Deprecation "true";
add_header Sunset "Thu, 01 May 2026 00:00:00 GMT";
proxy_pass http://api_v1;
}

5) רישומי מזימות וחוזים

סכימת OpenAPI/JSON (ראשי תיבות של OpenAPI/JSON Schem תיאורי פרוטובוף (Protobuf): רישום SDL ל ־ GraphQL.
בדיקת CI: לינטרים + ”בדיקת שבירת שינויים” ביחסי ציבור.
חוזים המונעים על ידי צרכנים (CDC): בדיקות צרכניות (Pact/analog) - הגנה מפני הפסקות לא בולטות.
Changelog: ניתן לקריאה במכונה (לדוגמה, Changelog. md' + לשחרר הערות ברישום).

6) התפתחות שדות: כללי אגודל

אל תשנה את הפורמט (UUID↔int) ללא שדה חדש '_ v2' ותקופת מעבר.
זמן/מטבע: שמור על ISO-8601/epoch UTC ומטבע amount_minor +; אין קנה מידה (אגורות/סנט).
Enum: הוסף ערכים - בסדר; אל תשנה את המשמעות של הישנים. עבור REST, תן ערכים מחרוזת, לא קלט.
Pagination: מבוסס סמן יציב יותר; אל תשנה את הסמנטיקה של הסמן.

7) הידלדלות ונוהל ”שקיעה”

1. הודעה (T-90/60): changelog, דואר לשותפים, 'Desprection/Sunset' כותרות.
2. זמן שכפול: V1 ו-V2 פועלים במקביל; V1 מצויד באזהרות בתגובות/יומנים.
3. טלמטריה שימוש: מי עוד קורא V1? אנשי קשר נקודתיים.
4. מקפיא V1: רק תיקוני באגים/אין תכונה.
5. Sunset-410 נעלם או עמוד בלוק הוראות נדידה.

8) שחרור ללא כאב: הנחת אסטרטגיות

ניתוב כחול/ירוק או משוקלל: 1-5-25-50-100% תנועה.
חלון תאימות: לפחות 1-2 שחרור מינורי, לעתים קרובות יותר 6-12 חודשים עבור API חיצוני.
מאפיין דגלים לכלול שדות לוגיקה/סניפים חדשים ללא שדרוג.
קריאה/כתיבה-פיצול: קודם הוסף תמיכה לקריאת שדה חדש, ואז תתחיל לכתוב אותו.

9) בדיקת יכולת בין-אופרטיבית (סוויטת אימון)

מבחני זהב לתגובות מגרסאות ישנות יותר.
בדיקות מעגלים: אין פריצה במודיעה.
ההפקה החוזרת פועלת על היערכות עבור V2 (צל).
תסריטי גב/קדימה: לקוח חדש בשרת הישן ולהפך (שבו FC תקף).
בדיקות חוזה של פתקי אינטרנט: אימות של חתימה, תבנית, זמן.

10) מדדים ו ־ SLOs של תהליך הווסינינג

% מהלקוחות ב-MINOR האחרון (80% לפני שקיעה).
שגיאות תאימות/לא זמינות לכל שחרור (מטרה 0).
שיתוף קריאות מורשת (ירידה לשקיעה).
זמן נדידת הלקוח (median/p95).
דלתא Latency/regression delta בין גרסאות (לא יותר גרוע מבסיסי).

11) דוגמאות של חפצים

OpenAPI (מקטע, depriction שדה):
yaml components:
schemas:
Payout:
type: object properties:
id: { type: string, format: uuid }
amount_minor: { type: integer }
currency: { type: string }
comment:
type: string deprecated: true description: "Use note"
note: { type: string }
פרוטובוף (שמור ו-V2 packet):
proto syntax = "proto3";
package payouts. v1;
message Payout { reserved 5; string id=1; int64 amount_minor=2; string currency=3; }
GraphQL (ריקון):
graphql type Query { payout(id: ID!): Payout }

12) ורסינציה של ערוצים סמוכים

SDK/CLI: תלות בגרסת SEMVER + API, תאימות שנקבעה ב ־ README.
אירועים/זרמים (WS/Kafka): גרסה באנבלופה. גרסה "; תכונות חדשות - אופציונליות; דדופ וקורות חיים עובדים אותו הדבר בין הגרסאות.
דיווח/CSV: גרסה בשם קובץ/כותרת; הוספת עמודות ימינה לא משנה את הסדר/סוגים.

13) ממשל ותפקידים

בעל חוזה (בעל דומיין), Steward API (חוקים וקווים), מנהל שחרור (Sunset/Communications).
תהליך שבירת שינויים: הצדקה עסקית, תוכנית הגירה, חפצים, תאריכים.
ספריית API מאוחדת: שם ניתן לראות דיאגרמות, גרסאות, לוח שנה של שקיעה, מגע.

14) אנטי דפוסים

הפסקות ”שקט”: לשנות את מצב/שגיאה/סוג שדה ללא גרסה.
שימוש חוזר במספרי פרוטובוף הורס שידור חוזר ולקוחות ישנים.
GraphQL ללא טלמטריה שדה - הסרת מגע.
Global v2 בסך הכל - megamigration במקום אבולוציה נקודתית.
הגרסה בפרמטר השאילתות של API הציבורי היא תוכנית לא ברורה ופגיעה.
אין מדריכי נדידה ודוגמאות - שותפים דוכן, מועדים משובשים.

15) בדיקת-רשימה של הגרסה החדשה

[ סכימת ] מעודכנת (OpenAPI/Protobuf/SDL), תיקונים ובדיקות שבירה עברו.
[ ] אינטגרציה ובדיקות חוזה (CDC).
[ ] SDK/דגימת קוד/מדריך הגירה ו Changelog מוכן.
[ ] Deprecation/Sunset מאופשר (גרסה ישנה) + כיצד להגר דף.
[ ] קנרית/צל תוכנית, התראות ולוחות מחוונים להשוואת מדדים.
[ ] התאימות לאחור נשמרת לתקופה מוסכמת.
[ ] תוכנית Rollback ומטריצת סיכון הסכימו.

תקציר

API יציב הוא תהליך, לא "אחת ולתמיד. "לחיות לפי הכללים: SemVer + avolution + complose evolution + circuit protection + Sunset process. סגנונות נפרדים (REST/gRPC/GraphQL) ומדיניותם, גרסאות מסלול ל-API של השער, גלגול קנריות, מדידת האפקט. כך תימנעו מ ”שבירת הפתעות”, להאיץ את שילוב השותפים ולשמור על יכולת חיזוי לתחומים כספיים וקריטיים.

Contact

צרו קשר

פנו אלינו בכל שאלה או צורך בתמיכה.אנחנו תמיד כאן כדי לעזור.

התחלת אינטגרציה

Email הוא חובה. Telegram או WhatsApp — אופציונליים.

השם שלכם לא חובה
Email לא חובה
נושא לא חובה
הודעה לא חובה
Telegram לא חובה
@
אם תציינו Telegram — נענה גם שם, בנוסף ל-Email.
WhatsApp לא חובה
פורמט: קידומת מדינה ומספר (לדוגמה, +972XXXXXXXXX).

בלחיצה על הכפתור אתם מסכימים לעיבוד הנתונים שלכם.