Պայմանագրային փորձարկում
1) Որտե՞ ղ օգտագործել պայմանագրերը
HTTTRT/JSON 'ռեսուրսներ, համայնքներ, ֆիլտրեր, գաղափարախոսություն, սխալներ։
GRPC/Delobuf: հաղորդագրությունների տեսակները, կարգավիճակները, սեմանտիկան «dead.ru», backward-compat v.proto։
GraphQL 'սխեմաներ, non-nox, հրահանգներ, պերմիշեն դաշտերի վրա։
Հաղորդագրություններ/strims (Kafka/Pulsar/MSS): event սխեմաները (Avro/JSON/Delobuf), կուսակցության բանալիները, կարգը, գաղափարական բանալիները։
Ներքին SDK/գրադարանները 'հանրային գործառույթներ/բացառություններ/արտադրողականության պայմանագրեր։
2) CDC մոդել 'դերեր և արտեֆակտներ
Սպառողը հրապարակում է սպասումների պայմանագիրը (մոտավոր հարցումներ/պատասխաններ, տեսակների մատրիցներ, ինվարանտներ)։
Մատակարարը շեղում է պարամետրերի ստուգումը իր կոդերի/հարմարվողի/handler 's-ի դեմ։
Բրոքերը (Pact Broker/Backstage/artefact-repo) պահպանում է տարբերակները, թեգերը ("wwww.ru", "canary") և microsoft 'consumer @ v provider @ v "։
Մրցույթի քաղաքականությունը 'պրովայդերի դրույքաչափը արգելված է, եթե խախտվում է ցանկացած «պրոդ-ռելեվանտային» պայմանագիր։
3) Ի՞ նչ ամրագրել պայմանագրում (HTTP օրինակ)
Առնվազն
Մեթոդ/պարամետրեր/վերնագրեր (համեղ auth, idempotent բանալին)։
Մարմինը և տիպիկ մատրիցները (տիպը/ձևաչափը/ռեգեքպը/միջակայքը)։
Սխալների իրականացումը և կառուցվածքը. կայուն «error _ code»։
Սեմանտիկ ինվարանտներ 'տեսակավորում, եզակիություն, մոնոնտոնիզմ «created _ at»։
Նավթի սպասումները (oporation): p95, չափի լիմիտներ, rate-limit վերնագրեր։
Պայմանագրի հատվածը (պարզեցված)
json
{
"interaction": "GET /v1/users/{id}",
"request": { "method": "GET", "path": "/v1/users/123", "headers": {"Accept":"application/json"} },
"matchers": {
"response.body.id": "type:number",
"response.body.email": "regex:^.+@.+\\..+$",
"response.body.created_at": "format:rfc3339"
},
"response": {
"status": 200,
"headers": {"Content-Type":"application/json"},
"body": {"id": 123, "email": "alice@example.com", "created_at": "2025-10-31T12:00:00Z"}
},
"error_cases": [
{
"name":"not_found",
"request":{"path":"/v1/users/9999"},
"response":{"status":404, "body":{"error_code":"USER_NOT_FOUND"}}
}
]
}
4) Իրադարձությունների պայմանագրերը (event-driven)
Իրադարձության սխեման '"type", "version", "id'," occurred _ at _ utc "," proder "," wwww.ject "," payload "։
Invarants: անփոփոխ «id '» և «(type, id)», կարգուկանոնը կուսակցության ստեղնի սահմաններում, «sequence» մոնոնիականությունը։
Schema Registry: պահպանում է էվոլյուցիան և կանոնները (backward/forward/fox)։
Կոնսյուսերի պայմանագիր-թեստերը '«ոսկե» իրադարձություններ և բացասական փուլեր (անհայտ դաշտեր, nullable)։
Avro-սխեմայի օրինակը (հատված)
json
{
"type":"record","name":"UserRegistered","namespace":"events.v1",
"fields":[
{"name":"id","type":"string"},
{"name":"occurred_at_utc","type":{"type":"long","logicalType":"timestamp-millis"}},
{"name":"email","type":"string"},
{"name":"marketing_opt_in","type":["null","boolean"],"default":null}
]
}
5) Էվոլյուցիա և համատեղելիություն
Հետաքննության տարբերակները 'MAJOR-ի սեմանտիկան։ MINOR. PATCH "(MAJOR - կոտրող)։
REST-ի կանոնները
Մի կոտրեք, մի հեռացրեք դաշտերը, մի փոխեք տեսակը/արժեքը «error _ code»։
Ավելացրեք օպտիկական դաշտերը դեֆոլտով։ նոր էնդպոինտներ «մոգության» փոխարեն։
Դեպրեսիա 'գովազդ, զուգահեռ աջակցություն, հեռացում մետրերով։
GraphQL: Դաշտերը միայն ավելացրեք, non-nants ներկայացնել փուլերի միջոցով։ տեղաբաշխման հրահանգներ։
GRPC/International: չօգտագործել դաշտերի համարները։ միայն ավելացրեք նոր optional։
Events: «vN» սխեմա; պահպանակները պարտավոր են անտեսել անհայտ դաշտերը (ծույլ)։
6) Բացասական և ինվարանտային ստուգումներ
Negative: սխալ տեսակներ, արգելված արժեքներ, հակամարտական պարամետրեր, ավելի բարձր, քան սահմանները։
Diariants: Պատասխանների տեսակավորումը, «id» եզակիությունը, «next _ cursor» ճկունությունը, կրկնության ընթացքում հակամարմնային պատասխանը։
Ժամանակավոր ասպեկտների պայմանագրերը ՝ "created _ at 'RFC339/UTC, տեղական օրվա ճիշտ կանխատեսումը տրանսպորտային պայմանագրի մի մասն չէ, փոխանցվում է բիզնեսի ինվարանտներին։
7) Մոսկվան-գեներացիան և տեղական զարգացումը
Մատակարարներից ստեղծվում են պրովայդերի օրինակներ սպառողի զարգացման համար։
Իրադարձությունների համար '«վալիդային/սահմանային» հաղորդագրությունների գեներատորներ, համաձայն սխեմայի։
Ալգորիթմները նշվում են պայմանագրի տարբերակով և հավաքման ամսաթվով։ արգելված է հրապարակումը։
8) CI/CD (Jours-pline)
1. Consumer CI:
Lint/հավաքածու wwww.unit/պայմանագիր-թեստերը ցույց են տալիս հրատարակությունը www.ract-broker (07: 'consumer @ 1։ 7. 0`).
2. Provider CI:
Տեղական/բեռնարկղում ռուսական ռելեվանտային շարժիչների («www.ru »/« staging») բարձրացումը հաստատեց broker կարգավիճակի հրապարակումը։
3. Release Gate:
Պրովայդերի դրույքաչափը արգելափակված է, եթե չունենք չկատարված պայմանագրեր։
4. Nightly Matrix:
Մատրիցա www.consumer versions provider versions '; հաշվետվություններ և անհանգստություններ։
9) Օրինակներ օրինակների վերաբերյալ
9. 1 REST 'դասընթացների պագինացիա (պայմանագրային ինվարանտ)
Պատասխանը պարունակում է «items []», «next _ cursor» (nullable), «limit», «total» (oporatal)։
Invariants: 'len (items) www.limit', կրկնակի մարտահրավեր նույն «cursor» -ի հետ։
Սխալ, եթե միևնույն ժամանակ նշված են «cursor» և «page»։
9. 2 Idempotenty POST
Պայմանագիրը պահանջում է «Idempotency-Key» վերնագիրը։
Invariant: Նույն բանով երկրորդ հարցումը վերադարձնում է նույն «id »/կարգավիճակը։
9. 3 Իրադարձություններ ՝ կարգուկանոնի երաշխիքներ
Պայմանագրում կուսակցության բանալին '«partection _ key = user _ id»։
Invarant: «sequence» -ը միապաղաղ աճում է ստեղնաշարի ներսում։ կոնսյումերը պետք է կրկնություններ մշակի։
10) Ապահովությունն ու գաղտնիությունը պայմանագրերում
Չի ներառել PDN/գաղտնիքները օրինակներում միայն սինթետիկ է։
Ամրագրել անվտանգության պարտադիր վերնագրերը '«Authorization», «X-Signature», «Replay-Systvention»։
Webhuks-ի համար ստորագրության պայմանագիրը և պատասխանը '2x '/retraev։
Պայմանագիրը-թեստերի լոգարաններում զգայուն դաշտերի դիմակավորում է։
11) Գործիքներ
Pact/Pactflow/Pact Broker - HTTP/International պայմանագրեր, կոդավորման մատրիցա։
OpenAPI/AsyncAPI - + թեստային գեներատորներ (Dredd, Schemathesis)։
Karate/REST Assured-ը REST կոդավորման բեմական ստուգումներ է։
Windobuf/gRPC-ը '«buf», «Nobolint», թեստերը։ Schema Registry-ի համար Avro/JSON/Delo հոսքերում։
GraphQL-ի համար (graphql-compat), wwww.apshot-ի սխեմաների թեստերը։
12) Կեղծ պրովայդերի ստուգման (պարզեցված)
python def verify_contract(provider, contract):
for case in contract["cases"]:
req = build_request(case["request"])
res = provider.handle(req) # локально/контейнер assert match_status(res.status, case["response"]["status"])
assert match_headers(res.headers, case["response"].get("headers", {}))
assert match_body(res.body, case["matchers"], allow_extra_fields=True)
for neg in contract.get("error_cases", []):
res = provider.handle(build_request(neg["request"]))
assert res.status == neg["response"]["status"]
assert res.json.get("error_code") == neg["response"]["body"]["error_code"]
13) Anti-patterna
«Postman Skrinschots» -ը պայմանագիր է, չկա տարբերակներ/տիպիկ խաղողներ/ավտոմատ վալիդացիա։
Oversneyping: Պայմանագիրը ճշգրիտ արժեքներ է արձանագրում տեսակների/պաթոգենների փոխարեն ՝ կեղծ անկումներ։
Մեկ ընդհանուր պայմանագիր տարբեր տարածաշրջանների/ալիքների համար 'անտեսում է փոփոխականությունը (դրոշները, գեո կանոնները)։
Պայմանագրեր առանց բրոկերների/մատրիցայի. Դուք չեք կարող հասկանալ, թե որ տարբերակները համատեղելի են։
E2e-ի փոխարեն 'դանդաղ, թանկ, անկայուն։
Բացասական/invariant դեպքերի բացակայությունը, միայն «կանաչ ուղին» փորձարկվում է։
14) Դիտողությունն ու շահագործումը
Կարգավիճակի արտահանումը broker + dashbord «health Express»։
Ալբերտներ 'պրովայդերի նոր անկումներ ընդդեմ «07» -contratts, իրադարձությունների «unknown field» աճը։
Ուղեգիր ՝ «wwww.ract _ id», «version», «decision _ id», ստուգման լոգարաններում։
15) Դեպրեսիայի գործընթացը
1. Ավելացնել դաշտը/էնդպոինտը (չի կոտրում)։
2. Նշեք հինը որպես «deprecated» ճշգրտության մեջ, հայտարարեք ժամանակը։
3. Հետևեք սպառողներին լոգարաններով/բրոկերով; միգրացիոն դելդներ։
4. Միացրեք «ստվերային» deny steidge (www.y-run), ապա enforce։
5. Հեռացնել օգտագործման զրոյական մասնիկից և ստուգման հաստատումից հետո։
16) Ճարտարապետի չեկի թերթիկը
1. Հայտնաբերվել են սպառողները և նրանց սեփականատերերը։ Պայմանագրերը տարբերակվում են։
2. Կա՞ ն բրոքեր և մատրիցա, որոնք ունեն միջավայրեր։
3. Պայմանագիրը ներառում է բացասական և invariants (idiempotention, կուրսորներ, տեսակավորում)։
4. Իրադարձությունների համար Schema Registry-ը և միգրանցների ռեժիմը։
5. Propline-ը արգելափակում է պրովայդերի թողարկումը, երբ խախտվում է prod-2019-ը։
6. Արագ տեղայնացման և էվոլյուցիայի քաղաքականության գործընթացը։
7. Արտադրվում են օրինագծեր, կան տեղական իրադարձությունների գեներատորներ։
8. ՊԴ-ի դիմակավորում և անվտանգության պարտադիր վերնագրեր։
9. Metrics/alerts պայմանագրերով միացված են, կան զեկույցներ։
10. Պայմանագրերը ստուգվում են CI-ում երկու կողմերում (consumer և provider)։
Եզրակացություն
Պայմանագրային փորձարկումը փոխանցում է «ճշմարտությունը» փոխազդեցությունների մասին տարբերակված արտեֆակտների և դարձնում է կանխատեսելի։ CDC-ն, բրոքերը և սխեմաների էվոլյուցիայի կարգապահությունը փոխարինում են «կոտրող անակնկալները» կառավարվող գործընթացին 'արագ ստուգումներ, հստակ ինվարանտներ և տարբերակների թափանցիկ համատեղելիություն։ Սա նվազեցնում է e2e արժեքը, արագացնում է օրինագծերը և բարելավում ամբողջ պլատֆորմի որակը։