Teskari moslik
Teskari muvofiqlik nima
Backward compatibility - bu tizim yangilanayotganda eski mijozlar/iste’molchilarni qabul qilish va ularga to’g’ri ishlov berish xususiyatidir. Sodda: siz xizmatning yangi versiyasini chiqaryapsiz va mavjud integratsiyalar o’zgarishsiz ishlamoqda.
Kalit: kelishuvlarni buzmaslik. Har qanday evolyutsiya - qo’shish orqali, ishlab chiqarilgan narsalarni qayta tuzish orqali emas.
Bazaviy prinsiplar
1. Additive-first
Yangi maydonlar/usullar/hodisalar ixtiyoriy ravishda qoʻshiladi. Mavjud boʻlgan hech narsa olib tashlanmaydi va maʼnosini oʻzgartirmaydi.
2. Minimal kafolat kontrakti (MGC)
Skript mazmunini yoʻqotadigan maydon/amallar toʻplamini aniqlang. Yadro barqaror. Qolganlari - kengayishlar.
3. Tolerant reader
Mijozlar nomaʼlum maydonlarga eʼtibor bermaydi va yangi enum (fallback) qiymatlarini toʻgʻri qayta ishlaydi.
4. Versiyalar siyosati
Buzuvchi oʻzgarishlar - faqat major liniyasi orqali (’/v2’,’payments. v2`, `event. v2`). Minorlar - qo’shimcha.
5. Kuzatilganlik - kontraktning bir qismi
Loglar/treyslar va metriklarda mijozning versiyasi, formati, capability bayroqlari ko’rinadi. Bu migratsiyani boshqarish imkonini beradi.
Xavfsiz va xavfli o’zgarishlar
Odatda xavfsiz (BC-OK)
Ixtiyoriy maydonlarni qoʻshish (JSON/Euro/Protobuf’optional ’/’ nullable’).
Yangi endpoint/metod/hodisalarni qoʻshish.
Enumni qoʻshimcha qiymatlar bilan kengaytirish (agar tolerant reader boʻlsa).
Validatsiyani zaiflashtirish (maksimumlarni oshirish, muqobil formatlarni qo’shish).
Maʼnoga taʼsir qilmaydigan sarlavhalar/meta maʼlumotlar qoʻshish.
Xavfli (Breaking)
Maydonlarni olib tashlash/qayta nomlash, mavjud maydonlarning turini yoki majburiyligini oʻzgartirish.
Status/xato kodlari semantikasini oʻzgartirish.
Protobuf-teglardan boshqa maydonlar uchun qayta foydalanish.
Voqeani partiyalash kalitini o’zgartirish (agregat uchun tartibni buzadi).
SLA/taymautlarni kuchaytirish, bu esa eski mijozlarning pasayishiga olib keladi.
Oʻzaro aloqa uslublari boʻyicha
REST/HTTP + JSON
Qoʻshimcha: Yangi maydonlar’optional’, server ularni eski mijozlardan talab qilmaydi.
Versiyalar: major - yo’lda (’/v2’) yoki mediatipda; minor -’? include = ’/’? fields =’kengaytmalari orqali.
Xatolar: yagona format; major’siz kodlarni/semantikani o’zgartirmaslik.
ETag/If-Match: poygasiz xavfsiz yangilanishlar uchun.
Idempotentlik: POST uchun’Idempotency-Key’- eski mijozlar retrajlarda effektni ikki baravar oshirmaydi.
gRPC / Protobuf
Teglar oʻzgarmaydi. Olib tashlangan teglar qayta ishlatilmaydi.
Yangi maydonlar -’optional ’/’ repeated’; andoza qiymatlar eski kod bilan toʻgʻri ishlanadi.
Striming: minor doirasidagi xabarlarning tartibi/majburiyligini oʻzgartirmang.
Xatolar - statuslarning barqaror to’plami; yangi semantika → yangi usul/xizmat (’.v2’).
Event-driven (Kafka/NATS/Pulsar) + Avro/JSON/Proto
Nomlanishi:’domain. action. v{major}`.
Core vs Enriched: yadro barqaror; boyitish - alohida turlar/mavzular (’.enriched’).
Sxemalarning moslashuv rejimi: koʻproq BACKWARD; CI mos kelmaydigan oʻzgarishlarni bloklaydi.
Partiyalashtirish: kalit (masalan,’payment _ id’) - kontraktning bir qismi; uni o’zgartirish - breaking.
GraphQL
Maydonlarni/turlarni qo’shish - OK; olib tashlash/qayta nomlash -’@deprecated’va migratsiya oynasi orqali.
Majorsiz «nullable → non-nullable» ni oshirmang.
complexity/depth - limitlarni oʻzgartirish = shartnomani oʻzgartirish.
BC saqlashga yordam beradigan patternlar
Teskari piramida modeli: yadrosini barqarorlashtiring, ixtiyoriy ravishda kengaytiring.
Capability negotiation: mijoz qoʻllab-quvvatlanadigan imkoniyatlar (’X-Capabilities ’/handshake) haqida xabar beradi, server moslashmoqda.
Dual-run/dual-emit: migratsiya paytida bir vaqtning o’zida’v1’va’v2’ni saqlang.
Adapterlar: proksi/geytvey «ogʻir» mijozlar uchun soʻrovlarni tarjima qiladi.
Expand-and-contract (DB uchun): avval yangisini qoʻshing, yozishni/oʻqishni boshlang, shundan keyingina eskisini oʻchiring.
Governance va jarayon
1. Kontraktlar katalogi (sxemalar reyestri): muvofiqlik siyosatchilari bilan yagona haqiqat manbai.
2. CI/CDdagi linterlar va diff-cheklar: OpenAPI-diff, Buf-breaking, Euro/JSON Schema mosligini tekshirish.
3. CDC/Consumer-Driven Contracts: provayder isteʼmolchilarning haqiqiy shartnomalari uchun tekshiriladi.
4. Golden samples: regress uchun maʼlumot soʻrovlari/javoblar/hodisalar.
5. Change management: RFC/ADR breaking, sunset rejalari, kommunikatsiya.
Deprekeyt va eski versiyalarni olib tashlash
Eskirgan (’@deprecated’, tavsiflar,’Deprecation’,’Sunset’sarlavhalari).
Migratsiya oynasi: oldindan eʼlon qilingan sana, test stendi, kod namunalari.
Foydalanish telemetriyasi: yana kim’v1’da? versiya bo’yicha metrik/loglarni segmentlang.
Dual-run nolgacha trafikni o’chirish.
Kuzatuvchanlik va operatsion metriklar
Versiyalar boʻyicha soʻrovlar/xabarlar foizi.
Relizdan keyin eski mijozlarda xato/taymaut ulushi.
Mos kelmaydigan payload ulushi (shlyuzda/oqim-filtrlarda sxema bo’yicha validatsiya).
Isteʼmolchilar migratsiyasi lagi (yana qancha’v1’eshitiladi).
Teskari moslikni sinash
Schema-diff: fail при remove/rename/type-change.
Shartnoma-testlar: Eski SDK/mijozlar yangi sotuvga qarshi kurashmoqda.
E2E-kanareyka: eski trafikning yangi versiyasiga bir qismi, p95/p99, kodlar, retraylarni taqqoslash.
Voqealar nusxasi: proyeksiyalar eski logdan hech qanday tafovutsiz yangi mantiq bilan yig’iladi.
Fault-injection: kechikishlar/qisman javoblar - eski mijozlar tushmaydi.
Namunalar
REST (qoʻshimcha)
Mavjud:json
{ "id": "p1", "status": "authorized" }
Shunday bo’ldi:
json
{ "id": "p1", "status": "authorized", "risk_score": 0. 12 }
Eski mijozlar «risk _ score» ga eʼtibor bermay, ishlashda davom etadilar.
Protobuf (teglar)
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
Voqealar (yadro + boyitish)
`payment. authorized. v1’- yadro (minimal faktlar).
`payment. enriched. v1’- detallar; yadro iste’molchilari boyitishga bog’liq emas.
Antipatternlar
Swagger-wash: sxemani yangiladik, lekin xizmat eski uslubda (yoki aksincha).
Yashirin boʻshliqlar: dala/maqom maʼnosini versiyasiz oʻzgartirdi.
Protobuf-teglardan qayta foydalanish: ma’lumotlarning «sokin» korrupsiyasi.
Qattiq mijozlar: notanish maydonlarga tushadi/enum; tolerant reader yoʻq.
Mega-endpoint: bitta-bitta - har qanday o’zgarish potentsial sinishga aylanadi.
Chiqarish oldidan chek varaqasi
- O’zgarishlar qo’shimcha; yadro (MGC) tegmagan.
- Linterlar/diff-cheklar o’tdi; breaking bayroqlari yoʻq.
- Mijoz SDKlari yangilandi (yoki qoʻshimcha kengaytirish uchun talab qilinmaydi).
- Mijozlarda tolerant reader yoqilgan; enum-fallback tekshirildi.
- Metrika/loglarda versiya va capability bayroqlari mavjud.
- Potentsial sinish uchun ’/v2’, dual-run va sunset rejasi mavjud.
- Hujjatlar/misollar yangilandi, golden toʻplamlar mavjud.
FAQ
Backward vs forward - qanday farq bor?
Backward - yangi serverlar eski mijozlar bilan ishlaydi. Forward - yangi mijozlar eski serverlar bilan to’g’ri ishlaydi (tolerant reader va ehtiyotkorlik bilan defoltlar hisobiga). To’liq doira - full compatibility.
Katta oʻzgarishlar uchun har doim ’/v2’qilish kerakmi?
Agar invariantlar/turlar/kalitlar/semantika buzilsa. Aks holda, chiziqni saqlang va qo’shimcha ravishda evolyutsiya qiling.
Enum haqida nima deyish mumkin?
Eskisini oʻzgartirmasdan yangi qiymatlar qoʻshing. Mijozlar nomaʼlum qiymatda fallback boʻlishi kerak.
«Singan» boʻlsa - chi?
Orqaga qaytish, hot-fix adapteri,’v2’s dual-run, kommunikatsiya va migratsiya gaydasi.
Jami
Teskari muvofiqlik - evolyutsiya intizomi: yadrosini barqarorlashtiring, qo’shimchani kengaytiring, tolerant readerni joriy qiling, tekshiruvlarni avtomatlashtiring va ongli ravishda deprekeyt qiling. Shunday qilib, siz mijozlaringizni «ko’rinmas» o’zgarishlar ostida qoldirmasdan platformani tez rivojlantira olasiz.