GH GambleHub

API კონტრაქტის თავსებადობა

რატომ გვჭირდება ხელშეკრულების თავსებადობა

ხელშეკრულების თავსებადობა არის API- ს განვითარების უნარი არსებული ინტეგრაციების დაშლის გარეშე. მზარდ სისტემებში, API უფრო ხშირად იცვლება, ვიდრე მომხმარებელთა კოდი; თავსებადობა საშუალებას გაძლევთ წარმოადგინოთ ფიჩები განმეორებით, „დიდი გადასასვლელების“ კმაყოფილების გარეშე.

მთავარი იდეა: კონტრაქტი პირველადი, ცვლილებები ხდება თავსებადობის წესების შესაბამისად და ავტომატურად შემოწმებულია.

ძირითადი ცნებები

კონტრაქტი არის ინტერფეისის ოფიციალური სპეციფიკაცია: რესურსები/მეთოდები/მოვლენები, მონაცემთა სქემები, შეცდომების კოდები, ლიმიტები, SLA, უსაფრთხოების მოთხოვნები.
მიმწოდებელი (provider) - API- ს მფლობელი. მომხმარებელი (მომხმარებელი) - კლიენტი/ინტეგრაცია.

თავსებადობა:
  • Backward: ახალი მიმწოდებელი მუშაობს ძველ მომხმარებლებთან.
  • ფორვარდი: ძველი მიმწოდებელი მუშაობს ახალ მომხმარებლებთან (ჩვეულებრივ მიიღწევა „ტოლერანტული მკითხველი“).
  • Full: დაცულია როგორც backward, ასევე forward (ყველაზე ძლიერი ვარიანტი).
  • დანამატი - არჩევითი ელემენტების დამატება არსებული დარღვევის გარეშე.

ვერსიის პოლიტიკა

Semantic Versioning (რეკომენდებულია):
  • MAJOR არის დარღვევის ცვლილებები (მხოლოდ ახალი API ხაზის გამოშვებისას): '/v2 ',' სერვისი. v2`).
  • MINOR - დანამატის ცვლილებები (ახალი არჩევითი ველები/მეთოდები).
  • PATCH - კორექტირება ხელშეკრულების შეცვლის გარეშე.
  • დეპრესიის პოლიტიკა: მოძველებული ელემენტების გამოცხადება, მხარდაჭერის ფანჯარა, სათაურების/მეტამონაცემების გაფრთხილებები, მოხსნის გეგმა.

უსაფრთხო საშიში ცვლილებები

უსაფრთხო (ჩვეულებრივ, ზურგჩანთა კომპოზიცია)

არჩევითი ველის დამატება JSON/Protobuf/Avro- ში.
ახალი ენდოინტის/მეთოდის/ღონისძიების დამატება.
Enum- ის გაფართოება ახალი მნიშვნელობებით, თუ მომხმარებლები ტოლერანტულები არიან უცნობი მნიშვნელობებისთვის.
ლიმიტების ზრდა (მაგალითად, 'maxItems') მინიმალური გამკაცრების გარეშე.
არასრული დამატება სწორი ნაგულისხმევებით.
აღწერილობის/მაგალითების ტექსტის შეცვლა.

საშიში (არღვევს თავსებადობას)

ველების შეცვლა/მოცილება, მათი ტიპის ან სავალდებულო ცვლილება.
სტატუს კოდების/შეცდომების სემანტიკის შეცვლა (მაგალითად, იყო '200', გახდა '204' ან '404').
იდენტიფიკატორის ფორმატის შეცვლა (UUID-int).
ვალიდაციის გამკაცრება (უფრო მკაცრი მინიმალური/ნიმუშები) ვერსიის გარეშე.
წესრიგისა და სტრუქტურის ცვლილება gRPC ნაკადებში/მოვლენებში.
ჭდეების ნომრების გადატანა Protobuf- ში ახალი მინდვრებისთვის.

თავსებადობა ურთიერთქმედების სტილში

REST/HTTP + JSON Schema

დანამატი: ჩვენ აღვნიშნავთ ახალ ველებს, როგორც 'optional '/' nullable'.
Tolerant Reader კლიენტში: უცნობი ველების უგულებელყოფა; ნუ დაეყრდნობით წესრიგს.
ვერსია: მაიორი - გზაზე ('/v2 ') ან მედია (' აპლიკაცია/vnd. example. v2+json`).
ETag/If-Match: უსაფრთხო რბოლებისთვის.
შეცდომები: ერთი ფორმატი ('ტიპი', 'code', 'title', 'detail', 'trace _ id'), არ შეცვალოთ 'კოდის "მნიშვნელობები მაჟორის გარეშე.
პაგინაცია: კურსორები სასურველია offset; დაამატეთ ველები 'შემდეგი _ cursor', არ შეცვალოთ არსებული მნიშვნელობა.

gRPC / Protobuf

ჭდეების ნუმერაცია უცვლელია. დისტანციური ჭდეების გამოყენება შეუძლებელია.
ახალი ველები - 'optional '/' repeated', გონივრული ნაგულისხმევი სერვერზე.
ნუ შეცვლით შეტყობინებების წესსა და სავალდებულო წესს Streaming-RPC- ში.
შეცდომების სტატუსი - სტაბილური ('INVALID _ ARGUMENT', 'FAILED _ PRECONDITION' და ა.შ.); ახალი სემანტიკა - მეთოდის/მომსახურების ახალი ვერსია.

Event-driven (Kafka/NATS/Pulsar) + Avro/JSON Schema

მოვლენების სახელწოდება: 'domain. action. v{major}`.
ახალი ველები არჩევითია; განასხვავეთ ბირთვი და გამდიდრება ('.enriched').
სქემების რეგისტრატორები: თავსებადობის წესები (BACKWARD/FORWARD/FULL) თემაზე/ღონისძიებაზე.
enum- ის გაფართოება დასაშვებია მომხმარებელთა მხარეს tolerant reader- ით.
კონფიგურაციის/შეკვეთის გასაღების შეცვლა = დამანგრეველი ცვლილებები.

GraphQL

ველების/ტიპების დამატება უსაფრთხოა; მოცილება/სახელი - მხოლოდ @ deprecated და მიგრაციის ფანჯრის საშუალებით.
არ შეცვალოთ ტიპები/არა არაკომპეტენტური მაიორი.
აკონტროლეთ complexity/depth - ლიმიტები ხელშეკრულების ნაწილია.

სტაბილური ევოლუციის ნიმუშები

Additive-first: გაფართოება დაშლის გარეშე.
კაპიტალი: მომხმარებლები აცხადებენ, რომ ისინი მხარს უჭერენ (სათაურები/პარამეტრები/შეთანხმებები), სერვერი ადაპტირდება.
ხელშეკრულების საზღვრები: ჩაწერეთ MGC (მინიმალური საგარანტიო ხელშეკრულება) და გამოყავით გაფართოებები (უკანა პირამიდის მოდელი).
Tolerance by default: მომხმარებლები უგულებელყოფენ ზედმეტი და სწორად ამუშავებენ უცნობი მნიშვნელობებს.
Dual-write/Dual-emit: ძირითადი ცვლილებებით, ერთდროულად გამოუშვეთ 'v1' და 'v2'.
Sunset headers/Events: წინასწარ აცნობეთ ვერსიის მოხსნის შესახებ.

მთავრობა და ავტომატიზაცია

API ლინტერები:
  • OpenAPI/Spectral: სახელები, პაგინაცია, შეცდომის კოდი, ველების ფორმატები.
  • Buf/Protobuf: ჭდეების ხელახალი გამოყენების აკრძალვა, პაკეტების ნოტაცია.
  • AsyncAPI/Schema Registry: სქემების თავსებადობა CI დონეზე.
  • კონტრაქტების კატალოგი (SSOT): სქემების/ვერსიების ცენტრალიზებული რეესტრი დიფების ისტორიასთან.
  • API Guild: გილდია/კომიტეტი, რომელიც იღებს წესებს, შაბლონებს და ცვლილებებს.
  • Change Management: RFC/ADR, release notes, მიგრაციის ჰაიდები.

თავსებადობის ტესტირება

CI Schema-diff: ჩვენ ბლოკავს სპეკის დარღვევის ცვლილებებს (OpenAPI-diff, Buf breaking, SR კომპოზიცია).
Consumer-Driven Contracts (CDC): Pact/მსგავსი არის მიმწოდებლის შემოწმება კონკრეტული მომხმარებლების კონტრაქტების წინააღმდეგ.
Golden samples: საცნობარო მოთხოვნები/პასუხები და რეგრესიის მოვლენები.
E2E Canary: ტრაფიკის განლაგება/ცალკეული საკონსულტაციო ჯგუფები.
Chaos/latence: Timauts/retray- ის შემოწმება - latency-SLO- ს ცვლილება ითვლება ხელშეკრულების ცვლილებად.

მიგრაცია და დეპრესია

1. გამოაცხადეთ დეპრესია: გაითვალისწინეთ ელემენტი, მიუთითეთ sunset ვადა და ალტერნატივა.
2. შეინარჩუნეთ თავსებადობის პერიოდი: ორმაგი თავისუფალი/ორმაგი ემიტი, ხიდები, გადამყვანები.
3. შეაგროვეთ ტელემეტრია: ვინ იყენებს ძველს?
4. კომუნიკაცია: ბიულეტენები, გამოშვება, სატესტო სტენდები.
5. ამოღება: ფანჯრის შემდეგ - მოცილება ფიქსირებული გამოშვებით.

ცვლილებების მაგალითები

REST

იყო:
json
{ "id":"p1", "status":"authorized" }
გახდა (დანამატი, უსაფრთხო):
json
{ "id":"p1", "status":"authorized", "risk_score": 0. 12 }

კლიენტები, რომლებიც უგულებელყოფენ უცნობ მინდვრებს, არ იშლება.

Protobuf

proto message Payment {
string id = 1;
string status = 2; // don't change tag numbers optional double risk_score = 3; // additive
}

Event

`payment. authorized. v1 '(ბირთვი) +' payment. enriched. v1 '(გამდიდრება). კრიტიკული გზის მომხმარებლები კითხულობენ ბირთვს და არ არის დამოკიდებული გამდიდრებაზე.

ანტიპატერები

Swagger-wash: ოფიციალურად არის დაზუსტება, მაგრამ მომსახურების ქცევა განსხვავდება მისგან.
Breaking by stealth: შეიცვალა ტიპი/სტატუსი/ფორმატი ახალი ვერსიისა და მიგრაციის ფანჯრების გარეშე.
ნედლეული CDC მოვლენები, როგორც საჯარო კონტრაქტი: BD სქემების გაჟონვა, ევოლუციის შეუძლებლობა.
მკაცრი კლიენტი: ეცემა უცნობი მინდვრებით/მნიშვნელობებით; tolerant reader- ის არარსებობა.
Protobuf ტეგების ხელახალი გამოყენება: მონაცემების მშვიდი კორუფცია.
ლატენტობა, როგორც „არაკონტრაქტული“: მათ მოულოდნელად გაუგრძელეს p95 - მომხმარებლები იშლება ტაიმაუტებში.

თავსებადობის სია (მერჯამდე)

  • დანამატის ცვლილებები (ან ძირითადი ვერსია მომზადებულია).
  • ლინტერები/ჩეკები დასრულებულია, თავსებადობის წესები მწვანეა.
  • შეცდომები/კოდები/სტატუსები არ შეცვლილა სემანტიკა.
  • Enum გაფართოვდა ძველი მნიშვნელობების აკრძალვის გარეშე; მომხმარებლები - ტოლერანტი.

MGC საზღვრები უცვლელია.

  • განახლდა მაგალითები/დოკუმენტაცია/SDK.
  • მაჟორისთვის - გეგმა ორმაგი-write/dul-emit, sunset თარიღი, კომა გეგმა.
  • ტესტები CDC/Golden/E2E დასრულებულია.

FAQ

როგორ განსხვავდება backward forward თავსებადობისგან?
Backward - ახალი სერვერები არ არღვევენ ძველ მომხმარებლებს. Forward - ახალი მომხმარებლები არ იშლება ძველ სერვერებზე (tolerant reader- ის და სისუფთავე ნაგულისხმევის საშუალებით).

როდის უნდა გააკეთოთ '/v2 '?
როდესაც ინვარიანტები/სემანტიკა იცვლება, ველები/მეთოდები ამოღებულია, საჭიროა უსაფრთხოების ახალი მოდელი - ახალი ხაზის გაშვება უფრო ადვილი და გულწრფელია.

შესაძლებელია თუ არა Schema Registry/linters- ის გარეშე ცხოვრება?
თეორიულად - დიახ, პრაქტიკულად - ეს არის ხშირი რეგრესები და „ფარული“ ხარვეზები. ავტომატიზაცია იხდის.

შეგიძლიათ გაფართოვდეთ Enum?
დიახ, თუ მომხმარებლები სწორად ამუშავებენ უცნობ მნიშვნელობებს (fallback/ignore). წინააღმდეგ შემთხვევაში - მაიორი.

შედეგი

კონტრაქტის თავსებადობა არის + დისციპლინის + ავტომატიზაციის წესები. დაპროექტეთ დანამატი, შეცვალეთ დარღვევის ცვლილებები, გამოიყენეთ tolerant reader, შეამოწმეთ დიფები და CDC ავტომატურად, დაგეგმეთ დეპრესია. ასე რომ, API შეძლებს სწრაფად განვითარდეს და ინტეგრაცია დარჩეს სტაბილური.

Contact

დაგვიკავშირდით

დაგვიკავშირდით ნებისმიერი კითხვის ან მხარდაჭერისთვის.ჩვენ ყოველთვის მზად ვართ დაგეხმაროთ!

Telegram
@Gamble_GC
ინტეგრაციის დაწყება

Email — სავალდებულოა. Telegram ან WhatsApp — სურვილისამებრ.

თქვენი სახელი არასავალდებულო
Email არასავალდებულო
თემა არასავალდებულო
შეტყობინება არასავალდებულო
Telegram არასავალდებულო
@
თუ მიუთითებთ Telegram-ს — ვუპასუხებთ იქაც, დამატებით Email-ზე.
WhatsApp არასავალდებულო
ფორმატი: ქვეყნის კოდი და ნომერი (მაგალითად, +995XXXXXXXXX).

ღილაკზე დაჭერით თქვენ ეთანხმებით თქვენი მონაცემების დამუშავებას.