ЁЯФв рдзрдбрд╛ 09 тАФ Versioning: рдЬреБрдиреЗ рдлреЙрд░реНрдо рди рдлреЗрдХрддрд╛ рдирд╡реЗ рдлреЙрд░реНрдо
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдорд╛рдЧреЗ: lesson-08-pagination-filtering ┬╖ рдкреБрдвреЗ: lesson-10-rate-limits-caching
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ08, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд рдЖрдзреАрдкрд╛рд╕реВрди forms рднрд░рдгрд╛рд▒реНрдпрд╛ apps рдирд╛ рди рдореЛрдбрддрд╛ counter рдХрд╕рд╛
рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреЛ: additive рдмрджрд▓, рдореЛрдбрдгрд╛рд░реЗ
рдмрджрд▓ (breaking changes), /v1 тЖТ /v2, рдЖрдгрд┐ рдПрдЦрд╛рджрд╛ form рдирд┐рд╡реГрддреНрдд рдХрд░рдгреНрдпрд╛рдЪреА рд╕рднреНрдп рдкрджреНрдзрдд.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╡реАрд╕ apps рд░реЛрдЬ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдЪрд╛ form рднрд░рддрд╛рдд. рдПрдХрд╛ рд╕рдХрд╛рд│реА office рд▓рд╛ рдмрджрд▓ рд╣рд╡рд╛ рдЕрд╕рддреЛ. рдмрджрд▓ рджреЛрди рдкреНрд░рдХрд╛рд░рдЪреЗ рдЕрд╕рддрд╛рдд:
- рд░рдХрд╛рдирд╛ рдЬреЛрдбрдгреЗ тЮХ тАФ рдирд╡реАрди рдРрдЪреНрдЫрд┐рдХ field (
house), рдирд╡реАрди endpoint (/v1/homework), рдХреЛрдгрд╛рд╡рд░рд╣реА рд╕рдХреНрддреА рдирд╕рд▓реЗрд▓реА рдирд╡реАрди рдХрд┐рдВрдордд. рдЬреБрдиреЗ apps рдЪрд╛рд▓реВрдЪ рд░рд╛рд╣рддрд╛рдд: рддреНрдпрд╛рдВрдирд╛ рдорд╛рд╣реАрдд рдирд╕рд▓реЗрд▓реНрдпрд╛ рд░рдХрд╛рдиреНрдпрд╛рдВрдХрдбреЗ рддреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░рддрд╛рдд. рд╕реБрд░рдХреНрд╖рд┐рдд. рддреЗрдЪ version. - рд░рдХрд╛рдирд╛ рдмрджрд▓рдгреЗ рдХрд┐рдВрд╡рд╛ рдХрд╛рдврдгреЗ ЁЯТе тАФ
classрдЪреЗ рдирд╛рд╡sectionрдХрд░рдгреЗ,gradeрд▓рд╛ рдЖрдХрдбрд╛ рдмрдирд╡рдгреЗ, рдПрдЦрд╛рджреЗ app рдЬреНрдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗ рддреЗ field рдХрд╛рдврдгреЗ. рдмрджрд▓ ship рд╣реЛрддрд╛рдХреНрд╖рдгреА рдЬреБрдиреЗ apps рдореЛрдбрддрд╛рдд. рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╛рд╣реА. рдирд╡реАрди version.
рдореНрд╣рдгреВрди office рдирд╡реАрди form /v2 рдореНрд╣рдгреВрди рдЫрд╛рдкрддреЗ рдЖрдгрд┐ рдХрд╛рд╣реА рдХрд╛рд│
/v1 рд╕реБрджреНрдзрд╛ рджреЗрдд рд░рд╛рд╣рддреЗ. рддреЗ рдирд┐рд╡реГрддреНрддреАрдЪреА рд╕рднреНрдпрдкрдгреЗ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ: рдкреНрд░рддреНрдпреЗрдХ v1 рдЙрддреНрддрд░рд╛рд╡рд░
Deprecation рд╕реВрдЪрдирд╛, рдПрдХ Sunset рддрд╛рд░реАрдЦ, рдПрдХ
migration рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ, рдЖрдгрд┐ рддреЗ counter рд╡рд░ рд▓рдХреНрд╖ рдареЗрд╡рддреЗ тАФ v1 рддреЗрд╡реНрд╣рд╛рдЪ рдХрд╛рдврд▓реЗ рдЬрд╛рддреЗ рдЬреЗрд╡реНрд╣рд╛
рдЖрдгрдЦреА v1 slips рдпреЗрдгреЗ рдмрдВрдж рд╣реЛрддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
v1["ЁЯФв /v1/students<br/>{id, name, class, grade}"]
add["тЮХ additive: + house, + /homework<br/>same version, old apps fine"]
brk["ЁЯТе breaking: class тЖТ section,<br/>grade тЖТ number"]
v2["/v2/students<br/>new form, side by side"]
sunset["ЁЯЧУя╕П Deprecation + Sunset headers on v1<br/>metrics per version тЖТ remove v1 when quiet"]
v1 -->|"1 safe"| add
v1 -->|"2 not safe"| brk --> v2
v2 -.->|"3"| sunset
тЭУ рдХрд╛рдп
- Additive (рди рдореЛрдбрдгрд╛рд░реЗ): рдирд╡реАрди рдРрдЪреНрдЫрд┐рдХ request fields, рдирд╡реАрди response fields, рдирд╡реАрди endpoints, рдирд╡реАрди enum рдХрд┐рдорддреА рдЬрд░ clients рдирд╛ рдЕрдиреЛрд│рдЦреА рдХрд┐рдорддреАрдВрдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░рд╛рдпрд▓рд╛ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЕрд╕реЗрд▓ рддрд░. Validation рдЪрд╛ рдирд┐рдпрдо рд╕реИрд▓ рдХрд░рдгреЗ рд╕рд╣рд╕рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрд╕рддреЗ; рддреЛ рдХрдбрдХ рдХрд░рдгреЗ рдореЛрдбрдгрд╛рд░реЗ рдЕрд╕рддреЗ.
- рдореЛрдбрдгрд╛рд░реЗ (breaking): field рдЪреЗ рдирд╛рд╡ рдмрджрд▓рдгреЗ/рдХрд╛рдврдгреЗ, type рдХрд┐рдВрд╡рд╛ рдЕрд░реНрде рдмрджрд▓рдгреЗ, status code
рдмрджрд▓рдгреЗ, error рдЪреЗ
codes рдмрджрд▓рдгреЗ, auth рдЪреНрдпрд╛ рдЕрдЯреА рдмрджрд▓рдгреЗ, cursor рдЪрд╛ рдЕрд░реНрде рдмрджрд▓рдгреЗ. - Version рдХреБрдареЗ рд░рд╛рд╣рддреЗ: path рдордзреНрдпреЗ (
/v1/, рджрд┐рд╕рдгрд╛рд░реЗ, route рдХрд░рддрд╛ рдпреЗрдгрд╛рд░реЗ, cache рдХрд░рддрд╛ рдпреЗрдгрд╛рд░реЗ тАФ рдЖрдордЪреЗ), рдХрд┐рдВрд╡рд╛ header рдордзреНрдпреЗ (Accept: application/vnd.school.v2+json, рд╕реНрд╡рдЪреНрдЫ URLs, logs рдордзреНрдпреЗ рдЕрджреГрд╢реНрдп). рджреЛрдиреНрд╣реА рдЪрд╛рд▓рддрд╛рдд; рдПрдХ рдирд┐рд╡рдбрд╛ рдЖрдгрд┐ рдХрдзреАрдЪ рдорд┐рд╕рд│реВ рдирдХрд╛. - Deprecation (
Deprecation: true,Sunset: <date>,Link: <migration guide>) headers рдореБрд│реЗ clients рддреЗ program рджреНрд╡рд╛рд░реЗ рдУрд│рдЦреВ рд╢рдХрддрд╛рдд; рдкреНрд░рддреНрдпреЗрдХ version рдЪреНрдпрд╛ рд╡рд╛рдкрд░рд╛рдЪреЗ metrics рд╕рд╛рдВрдЧрддрд╛рдд рдХреА рддреЗ рдХрд╛рдврдгреЗ рдХрдзреА рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗ. - рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдирд╛ рдордЬрдмреВрддрдкрдгрд╛: servers рдЕрдиреЛрд│рдЦреА request fields рдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░рддрд╛рдд (рдХрд┐рдВрд╡рд╛ рддреЗ рд╕рд╛рддрддреНрдпрд╛рдиреЗ рдирд╛рдХрд╛рд░рддрд╛рдд); clients рдЕрдиреЛрд│рдЦреА response fields рдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░рддрд╛рдд. рд╣реА рдПрдХрдЪ рд╕рд╡рдп рдмрд╣реБрддреЗрдХ рдмрджрд▓ additive рдмрдирд╡рддреЗ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг API рдореНрд╣рдгрдЬреЗ рдЕрд╢рд╛ code рд▓рд╛ рджрд┐рд▓реЗрд▓реЗ рд╡рдЪрди рдЬреЛ рддреБрдореНрд╣реА рдкрд╛рд╣реВ рдХрд┐рдВрд╡рд╛ update рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА. Version рд╢рд┐рд╡рд╛рдпрдЪрд╛ рдореЛрдбрдгрд╛рд░рд╛ рдмрджрд▓ рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╡рд░ рдПрдХрддреНрд░ рдХреЛрд╕рд│рдгрд╛рд░реЗ outage тАФ рдиреЗрдордХреА рддреАрдЪ рдЧреЛрд╖реНрдЯ рдЯрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА counter рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд▓рд╛ (рдзрдбрд╛ 01). Versioning рдореНрд╣рдгрдЬреЗ рдиреЛрдХрд░рд╢рд╛рд╣реА рдирд╛рд╣реА; рдкреБрдвреЗ рдЬрд╛рдд рдЕрд╕рддрд╛рдирд╛рд╣реА office рдЖрдкрд▓рд╛ рд╢рдмреНрдж рдХрд╕рд╛ рдкрд╛рд│рддреЗ рддреЗ рд╣реЗ рдЖрд╣реЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
рдкреНрд░рддреНрдпреЗрдХ path /v1/ рдиреЗ рд╕реБрд░реВ рд╣реЛрддреЛ (school_api.py рдордзрд▓реЗ VERSION) рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ
response рд╡рд░ X-API-Version: v1 рдЕрд╕рддреЗ. STUDENTS рдордзреНрдпреЗ рдЖрдгрд┐
openapi.yaml рдордзрд▓реНрдпрд╛ Student рдордзреНрдпреЗ field рдЬреЛрдбрдгреЗ additive рдЖрд╣реЗ; class рдЪреЗ рдирд╛рд╡ рдмрджрд▓рдгреЗ рд╣реЗ рддреБрдордЪреЗ
рдкрд╣рд┐рд▓реЗ /v2 рдард░реЗрд▓.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# 1) additive: add "house": "red" to every student in STUDENTS and to the Student schema. Restart.
curl -s http://127.0.0.1:8080/v1/students/2 # old clients still parse this тАФ they ignore "house"
# 2) breaking, done right тАФ on paper (5 minutes):
# write the /v2 form with "section" instead of "class", the Deprecation + Sunset headers you would add to v1,
# and the one-paragraph migration note. Then decide the date you would remove v1 тАФ and what metric tells you it is safe.
# 3) look at the version stamp:
curl -si http://127.0.0.1:8080/v1/health | grep -i x-api-version
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
рдкрд╛рдпрд░реА 1 рдирдВрддрд░ smoke test рдЕрдЬреВрдирд╣реА рд╕реБрд░реБрд╡рд╛рддреАрдкрд╛рд╕реВрди рд╢реЗрд╡рдЯрдкрд░реНрдпрдВрдд pass рд╣реЛрддреЛ (рддреЛ рддрдкрд╛рд╕рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХрд╢рд╛рдЪреЗрд╣реА рдирд╛рд╡ рдмрджрд▓рд▓реЗ рдирд╛рд╣реА) рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдд house рджрд┐рд╕рддреЗ. рдкрд╛рдпрд░реА 3 рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрддрд░рд╛рд╡рд░ X-API-Version: v1 рдЫрд╛рдкрддреЗ. рддреБрдордЪреНрдпрд╛ рдкрд╛рдпрд░реА-2 рдЪреНрдпрд╛ рдЯрд┐рдкрдгрд╛рдд рдПрдХ field, рдПрдХ header, рдПрдХ рддрд╛рд░реАрдЦ рдЖрдгрд┐ рдПрдХ metric рдЕрд╕рддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА additive рдмрджрд▓ рдЖрдгрд┐ рдореЛрдбрдгрд╛рд░рд╛ рдмрджрд▓ рдпрд╛рдВрддрд▓рд╛ рдлрд░рдХ рдУрд│рдЦреВ рд╢рдХрддрд╛, рдкрд╣рд┐рд▓рд╛ рддреНрдпрд╛рдЪ version рд╡рд░ ship рдХрд░реВ рд╢рдХрддрд╛, рдЖрдгрд┐ рджреБрд╕рд▒реНрдпрд╛рдЪреЗ рдирд┐рдпреЛрдЬрди рдХреЛрдгрд╛рд▓рд╛рд╣реА рди рдореЛрдбрддрд╛ рдХрд░реВ рд╢рдХрддрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- "рдЖрдкрдг рдлрдХреНрдд рдирд╛рд╡ рдмрджрд▓реВ, рд╕рдЧрд│реЗ update рдХрд░рддреАрд▓" тАФ рддреБрдордЪреНрдпрд╛ рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреБрд╕рд╛рд░ рдХреЛрдгреАрдЪ update рдХрд░рдд рдирд╛рд╣реА
- рдкреНрд░рддреНрдпреЗрдХ endpoint рдХрд┐рдВрд╡рд╛ рдкреНрд░рддреНрдпреЗрдХ field рдиреБрд╕рд╛рд░ versioning тАФ рд╕рдВрдкреВрд░реНрдг counter рд╕рд╛рдареА рдПрдХрдЪ version
- metrics рд╢рд┐рд╡рд╛рдп
/v1рдХрд╛рдпрдо рдареЗрд╡рдгреЗ тАФ рдЬреЗ рдореЛрдЬрддрд╛ рдпреЗрдд рдирд╛рд╣реА рддреЗ рддреБрдореНрд╣реА рдирд┐рд╡реГрддреНрдд рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА - рдПрдХрд╛рдЪ рд╡реЗрд│реА рд╕рдЧрд│реЗ рдмрджрд▓рдгрд╛рд░реЗ
/v2тАФ рдореЛрдареЗ rewrites рдЕрдбрдХрддрд╛рдд; рдЫреЛрдЯреЗ рдореЛрдбрдгрд╛рд░реЗ рдмрджрд▓ ship рд╣реЛрддрд╛рдд - рдЕрдиреЛрд│рдЦреА fields рд╡рд░ fail рд╣реЛрдгрд╛рд░реЗ clients тАФ рддреЗ рдкреНрд░рддреНрдпреЗрдХ additive рдмрджрд▓рд╛рд▓рд╛ рдореЛрдбрдгрд╛рд░рд╛ рдмрджрд▓ рдмрдирд╡рддрд╛рдд
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рд▓реЛрдХрд╛рдВрдирд╛ рдЖрд╡рдбрдгрд╛рд░реЗ APIs (Stripe, GitHub) рдкреНрд░рдХрд╛рд╢рд┐рдд sunset рддрд╛рд░рдЦрд╛рдВрд╕рд╣ рд╡рд░реНрд╖рд╛рдиреБрд╡рд░реНрд╖реЗ рдЬреБрдиреЗ versions рдЪрд╛рд▓рд╡рдд рдЖрд▓реЗ рдЖрд╣реЗрдд. рд▓реЛрдХ рдЬреНрдпрд╛рдВрдирд╛ рд╕реЛрдбреВрди рдЬрд╛рддрд╛рдд рддреНрдпрд╛рдВрдиреА рдПрдЦрд╛рджреНрдпрд╛ рдордВрдЧрд│рд╡рд╛рд░реА рдПрдХ field рдореЛрдбрд▓реЗрд▓реЗ рдЕрд╕рддреЗ.
тПня╕П рдкреБрдвреЗ
рднрд╛рд░рд╛рдЦрд╛рд▓рдЪрд╛ counter: rate limits, caching, timeouts рдЖрдгрд┐ backoff тАФ рд░рд╛рдВрдЧ, рдкреНрд░рдд, рдЖрдгрд┐ рд╕рднреНрдп client.
git checkout lesson-10-rate-limits-caching