Тескери шайкештик
Артка шайкештик деген эмне
Тескери шайкештик (backward compatibility) - системанын системасы жаңыланып жатканда эски кардарларды/керектөөчүлөрдү кабыл алуу жана туура иштетүү касиети. Жөнөкөй: Сиз кызматтын/окуялардын жаңы версиясын чыгарасыз жана учурдагы интеграциялар өзгөрүүсүз иштей берет.
Ачкыч: келишимдерди бузбоо. Ар кандай эволюция - буга чейин чыгарылган эмес, кошуу аркылуу.
Негизги принциптер
1. Additive-first
Жаңы талаалар/ыкмалар/окуялар кошумча кошулат. Бар болгон эч нерсе алынып салынбайт жана маанисин өзгөртпөйт.
2. Минималдуу кепилдик келишими (MGC)
негизги аныктоо - талаалар/иш жыйындысы, ансыз скрипт маанисин жоготот. Ядро туруктуу. Калганынын баары - кеңейтүү.
3. Tolerant reader
Кардарлар белгисиз талааларды четке кагып, жаңы enum (fallback) баалуулуктарын туура иштетишет.
4. Версия саясаты
Бузуучу өзгөрүүлөр - major-line аркылуу гана ('/v2 ',' payments. v2`, `event. v2`). Минор - аддитивдүү.
5. Байкоо - келишимдин бир бөлүгү
Логтордо/тректерде жана метрикаларда кардардын версиясы, форматы, capability-желектери көрүнүп турат. Бул миграцияны башкарууга мүмкүндүк берет.
Коопсуз vs коркунучтуу өзгөрүүлөр
Адатта коопсуз (BC-OK)
Кошумча талааларды кошуу (JSON/Euro/Protobuf 'optional '/' nullable').
Жаңы эндпоинттерди/ыкмаларды/окуяларды кошуу.
Кошумча маанилер менен enum кеңейтүү (толеранттуу reader менен).
Валидациянын алсызданышы (максимумдарды көбөйтүү, альтернативдик форматтарды кошуу).
Мааниге таасир этпеген аталыштарды/метадеректерди кошуу.
Коркунучтуу (Breaking)
Талааларды алып салуу/атын өзгөртүү, учурдагы талаалардын түрүн же милдеттүүлүгүн өзгөртүү.
Статус семантикасын/ката коддорун өзгөртүү.
Башка талаалар үчүн protobuf тегтерин кайра колдонуу.
Окуянын партиялаштыруу ачкычын алмаштыруу (агрегат үчүн тартипти бузат).
эски кардарлар түшүп баштайт эмне үчүн SLA/убакыт катуулатуу.
өз ара стили боюнча
REST/HTTP + JSON
Кошумча: жаңы талаалар - 'optional', сервер аларды эски кардарлардан талап кылбайт.
Версия: major - жолдо ('/v2 ') же медиатип; minor - кеңейтүү аркылуу жана '? include = '/'? fields ='.
Каталар: бирдиктүү формат; major жок коддорду/семантиканы өзгөртүүгө болбойт.
ETag/If-Match: жарышсыз коопсуз жаңыртуулар үчүн.
Демпотенттик: POST үчүн 'Idempotency-Key' - эски кардарлар ретрадагы эффектти "эки эсе" бербейт.
gRPC / Protobuf
Теги өзгөрүүсүз. Өчүрүлгөн тегдер кайра колдонулбайт.
Жаңы талаалар - 'optional '/' repeated'; демейки баалуулуктар туура эски код менен иштетилет.
Стриминг: minor алкагында билдирүүлөрдүн тартибин/милдеттүүлүгүн өзгөртпөө.
Каталар - туруктуу статустардын жыйындысы; жаңы семантика → жаңы ыкма/кызмат ('.v2').
Event-driven (Kafka/NATS/Pulsar) + Avro/JSON/Proto
Аталышы: 'домен. action. v{major}`.
Core vs Enriched: ядро туруктуу; байытуу - айрым түрлөрү/темалар ('.enriched').
Схемалардын шайкештик режими: көбүнчө BACKWARD; CI шайкеш келбеген өзгөрүүлөргө бөгөт коёт.
Партиялануу: ачкыч (мисалы, 'payment _ id') - келишимдин бир бөлүгү; аны өзгөртүү - breaking.
GraphQL
Талааларды/түрлөрүн кошуу - ОК; алып салуу/атын өзгөртүү - '@deprecated' жана көчүрүү терезеси аркылуу.
негизги жок "nullable → non-nullable" жогорулатуу эмес.
Control complexity/depth - лимиттерди өзгөртүү = келишимди өзгөртүү.
BC сактоого жардам паттерндер
тескери пирамида модели: негизги турукташтыруу, кошумча кеңейтүү.
Capability negotiation: кардар колдоо мүмкүнчүлүктөрүн ('X-Capabilities '/handshake) билдирет, сервер ылайыкташтырылган.
Dual-run/dual-emit: көчүрүү учурунда бир эле учурда 'v1' жана 'v2'.
Adapters: Proxy/Gateway "оор" кардарлар үчүн өтүнүчтөрдү 'v1 v2' которгон.
Expand-and-contract (DD үчүн): адегенде жаңысын кошуп, жазууну/окууну баштоо, андан кийин гана эскисин алып салуу.
Governance жана жараяны
1. Контракттардын каталогу (схемалардын реестри): шайкештик саясатчылары менен чындыктын бирдиктүү булагы.
2. CI/CDдеги линтерлер жана дифф чектери: OpenAPI-diff, Buf-breaking, Euro/JSON схемасынын шайкештигин текшерүү.
3. CDC/Consumer-Driven Contracts: провайдер реалдуу керектөө келишимдери боюнча текшерилет.
4. Алтын үлгүлөрү: эталондук суроолор/жооптор/регресс үчүн окуялар.
5. Өзгөртүү башкаруу: RFC/ADR боюнча breaking, sunset пландары, байланыш.
Депрекейт жана эски версияларын алып салуу
Эскирген белгилөө ('@deprecated', сүрөттөмөлөр, 'Deprecation', 'Sunset' аталыштары).
Миграция терезеси: алдын ала жарыяланган дата, тесттик стенд, коддун мисалдары.
Телеметрия колдонуу: дагы ким 'v1'? версиясы боюнча метрика/логи сегменти.
Dual-run нөлгө чейин жол, андан кийин - жок.
Байкоо жана иш көрсөткүчтөр
Версиялар боюнча суроо-талаптардын/билдирүүлөрдүн пайызы.
Бошотулгандан кийин эски кардарларда каталар/таймауттар үлүшү.
шайкеш эмес PayLoad үлүшү (шлюз/агым чыпкалары боюнча схема валидациясы).
Керектөөчүлөрдүн миграция лагы (дагы канча 'v1' угат).
Кайра шайкештикти текшерүү
Schema-diff: fail при remove/rename/type-change.
Келишим-тесттер: эски SDK/кардарлар жаңы ишке ашырууга каршы кууп.
E2E-канарейка: p95/p99, коддору, retrains салыштыруу, жаңы нускасында эски жол бир бөлүгү.
Окуялардын репликасы: проекциялар эч кандай айырмачылыктар жок эски логикадан жаңы логика менен чогултулат.
Fault-injection: кечигүү/жарым-жартылай жооп - эски кардарлар түшпөйт.
Мисалдар
REST (кошумча)
Болгон:json
{ "id": "p1", "status": "authorized" }
Бул:
json
{ "id": "p1", "status": "authorized", "risk_score": 0. 12 }
Эски кардарлар "тобокелдик _ score" эске албай, иштөөнү улантууда.
Protobuf
proto message Payment {
string id = 1;
string status = 2;
optional double risk_score = 3 ;//new field, safe
}
//Tags 1 and 2 cannot be changed/deleted without v2
Окуялар (негизги + байытуу)
`payment. authorized. v1 '- өзөгү (минималдуу фактылар).
`payment. enriched. v1 '- тетиктер; керектөөчүлөр байытууга көз каранды эмес.
Антипаттерндер
Swagger-wash: жаңыртылган схемасы, бирок кызмат эски жол менен (же тескерисинче).
Жашыруун сыныктар: талаанын маанисин/статусун версиясыз өзгөрттү.
Protobuf-тегтерди кайра колдонуу: "тынч" маалымат коррупциясы.
Катуу кардарлар: бейтааныш талаалар/enum боюнча түшүп; толерант reader жок.
Mega-endpoint: бири-бири менен - ар кандай өзгөртүү мүмкүн болуучу сынык болуп калат.
чыгаруу алдында чек тизмеси
- өзгөртүүлөр кошумча; негизги (MGC) тийген эмес.
- Linters/diff чектери өттү; breaking-желектери жок.
- Кардарлардын SDK жаңыртылган (же кошумча кеңейтүү үчүн талап кылынбайт).
- Кардарлар менен толерант reader кирет; enum-fallback текшерилген.
- Метрика/Логи версия жана capability-желектерди камтыйт.
- Потенциалдуу сыныктар үчүн '/v2 ', dual-run жана sunset планы бар.
- Документтер/мисалдар такташты, алтын топтомдору бар.
FAQ
Backward vs forward - айырмасы эмнеде?
Backward - жаңы серверлер эски кардарлар менен иштешет. Forward - жаңы кардарлар эски серверлер менен туура иштешет (толеранттуу reader жана тыкан дефолттордун эсебинен). Толук тегерек - толук compatibility.
Ар дайым чоң өзгөрүүлөр үчүн '/v2 'кылышым керекпи?
Ооба, эгерде инварианттар/түрлөрү/ачкычтары/семантикасы бузулса. Болбосо, линияны сактап, кошумча түрдө өнүгүңүз.
Кантип enum?
Эскилеринин маанисин өзгөртпөстөн жаңы маанилерди кошуңуз. Кардарлар белгисиз мааниде fallback болушу керек.
буга чейин "сындырып" болсо, эмне кылуу керек?
Rebound, hot-fix адаптер, релизи 'v2' менен dual-run, байланыш жана миграциялык жол.
Жыйынтык
Тескери шайкештик - бул эволюциянын дисциплинасы: ядрону турукташтыруу, кошумча кеңейтүү, толеранттуу reader киргизүү, текшерүүлөрдү автоматташтыруу жана аң-сезимдүү депрекейт жүргүзүү. Ошентип, сиз кардарларды "көрүнбөгөн" өзгөрүүлөрдүн калдыктарынын астында калтырбастан, платформаны тез өнүктүрө аласыз.