Feature Flags va fich
Feature Flag (FF) - kodni chiqarmasdan tizimning xatti-harakatlarini oʻz ichiga olgan/oʻchiradigan boshqariladigan shart. Bayroqlar: xavfsiz chichlarni haydash, foydalanuvchilar/bozorlar/tenantlar guruhlarini nishonga olish, muammoli komponentlarni tezda o’chirish, tajriba o’tkazish va rantaymdagi parametrlarni konfiguratsiya qilish imkonini beradi.
Asosiy maqsadlar:- Relizlarda blast radiusni kamaytirish.
- Joylashtirish va faollashtirishni boʻlish.
- Audit, SLO va «bir marta bosish» bilan oʻzgarishlarni shaffof boshqarish.
1) Bayroqlarning turlari va ularni qachon qo’llash
Release flags - yangi fichni bosqichma-bosqich kiritish (dark → canary → ramp-up → 100%).
Ops/kill-switch - bog’liqliklarni (provayder, quyi tizim, og’ir hisoblash) bir zumda uzib qo’yish.
Experiment (A/B, multi-variant) - trafikni variantlarga (weights, sticky bucketing) ajratish.
Permission/Entitlement - rollar/rejalar/yurisdiksiyalar bo’yicha chichlarga kirish.
Remote Config - bayroqdan/konfigadan xulq-atvor parametrlari (chegara, taymaut, formula).
Migration flags - ma’lumotlar sxemalarini/yo’llarini o’zgartirish (yangi indeks/DB/endpointga o’tish).
Anti-pattern: bir xil «hamma haqida» bayrog’ini fichu, komp-svitch va parametrlarga bo’ling.
2) Bayroq ma’lumotlari modeli (minimal)
yaml flag:
key: "catalog. new_ranker"
type: "release" # release ops kill experiment permission config migration description: "New Directory Ranking"
owner: "search-team@company"
created_at: "2025-10-01T10:00:00Z"
ttl: "2026-01-31" # delete deadline after 100% enable rules:
- when:
tenant_id: ["brand_eu","brand_latam"]
region: ["EE","BR"]
user_pct: 10 # progressive percentage then: "on"
- when:
kyc_tier: ["unverified"]
then: "off"
variants: # for experiments
- name: "control"; weight: 50
- name: "v1"; weight: 30
- name: "v2"; weight: 20 payload:
v1:
boost_freshness: 0. 3 boost_jackpot: 0. 2 v2:
boost_freshness: 0. 2 boost_jackpot: 0. 4 prerequisites: # dependent flags/schema versions
- key: "catalog. index_v2_ready"
must_be: "on"
audit:
require_ticket: true change_window: "09:00-19:00 Europe/Kyiv"
safeguards:
max_rollout_pct: 50 # stop threshold auto_rollback_on:
p95_ms: ">200"
error_rate: ">2%"
3) Baholash va targeting (evaluation)
Ключи таргетинга: `tenant_id, region/licence, currency, channel, locale, role, plan, device, user_id, cohort, kyc_tier, experiment_bucket`.
Baholash tartibi: prerequisites → deny-qoidalar → allow-qoidalar → defolt.
Sticky bucketing: tajriba uchun barqaror identifikatorni xeshlang (masalan,’hash (user_id, flag_key)’- foydalanuvchi har doim bitta variantni oladi.
ts result = evaluate(flag, context) // pure function if (!prereqs_ok(result)) return OFF if (deny_match(result, ctx)) return OFF if (allow_match(result, ctx)) return resolve_variant_or_on(result, ctx)
return flag. default
4) FF taqsimoti va arxitekturasi
Variantlar:- Server-side SDK (tavsiya etilgan): haqiqat manbalari va bekenddagi kesh; mantiqni birxillashtirish.
- Edge/CDN evaluation: perimetrda tezkor targeting.
- Client-side SDK: UI ni personallashtirish kerak bo’lganda, lekin - faqat minimal kontekstda va sezgir qoidalarsiz.
- Config-as-Code: bayroqlarni repozitoriyada saqlash, CI validatsiyasi, CD orqali rollout.
- Startup bootstrap + streaming updates (SSE/gRPC) + oxirgi snapshot uchun fallback.
- SLA «freshness» bayroqlari: p95 ≤ 5 s.
5) Chiqarilish strategiyasi
5. 1 Dark Launch
Ficha yoqilgan, lekin foydalanuvchiga koʻrinmaydi; metrika va xatolarni to’playmiz.
5. 2 Canary
Bitta yurisdiksiya/tenantdagi 1-5% trafikni kiritamiz; monitoring p95/p99, xatolar, konversiya.
Stop conditions - metriklar bo’yicha avtokatofning chegara triggerlari.
5. 3 Progressive Rollout
10% → 25% → 50% → 100% dastur bo’yicha qo’lda/avto-tekshirish.
5. 4 Shadow / Mirroring
So’rovlarni yangi yo’lda (ko’rinmas) takrorlaymiz va natijalarni/yashirlikni taqqoslaymiz.
5. 5 Blue/Green + FF
Ikkita versiyani joylashtiramiz; bayroq trafikni boshqaradi va segmentlarga qaramlikni o’zgartiradi.
6) Qaramlik va kross-servis konsistentligi
prerequisites va «health-bayroqlar» dan foydalaning: indeks qurilgan, migratsiya tugagan.
Hodisalar orqali muvofiqlashtirish:’FlagChanged (flag_key, scope, new_state)’.
1. o’qish yo’li → 2) metrikalarni tekshirish → 3) write/side-effects.
- Servis kontraktlari: defolt xavfsiz bo’lishi kerak (fail-safe OFF).
7) Kuzatuv va SLO
Bayroq/variant/segment metrikasi:- `flag_eval_p95_ms`, `errors_rate`, `config_freshness_ms`.
- Biznes-metriklar:’ctr’,’conversion’,’ARPU’,’retention’, guardrails (masalan, RG-hodisalar).
- Avtokatof uchun avtomatik SLO ostonalari.
Logi/treysing:’flag _ key’,’variant’,’decision _ source’(server/edge/client),’context _ hash’qoʻshing.
Dashbordlar: ostonali «zinapoya» rollout, segmentlar bo’yicha xatolar heatmap.
8) Xavfsizlik va komplayens
PII - kontekstda minimallashtirish.
RLS/ACL: kim qaysi bayroqlarni oʻzgartirishi mumkin (domenlar/bozorlar boʻyicha).
Oʻzgarishlar uchun soat oynalari (change windows) va sezgir bayroqlar uchun «ikki marta tasdiqlash».
Oʻzgarmas audit: kim/qachon/nima/nega (ticket/incident link).
Yurisdiksiyalar: bayroqlar tartibga soluvchi taqiqlarni chetlab o’tmasligi kerak (masalan, taqiqlangan mamlakatda o’yinni o’z ichiga olishi kerak).
9) «Uzoq umr ko’radigan» bayroqlarni boshqarish
Har bir bayroqda TTL/olib tashlash sanasi mavjud.
100% qo’shilgandan so’ng, kod shoxlarini olib tashlash uchun task yarating, aks holda «bayroq-qarz» o’sadi.
Bayroqlarni’migration ’/’ one-time’deb belgilang, ularni doimiy’permission/config’dan ajrating.
10) Kontrakt API/SDK misoli
Evaluation API (server-side)
http
POST /v1/flags/evaluate
Headers: X-Tenant: brand_eu
Body: { "keys":["catalog. new_ranker","rgs. killswitch"], "context": { "user_id":"u42", "region":"EE" } }
→ 200
{
"catalog. new_ranker": { "on": true, "variant":"v1", "as_of":"2025-10-31T12:10:02Z" },
"rgs. killswitch": { "on": false, "variant":null, "as_of":"2025-10-31T12:10:02Z" }
}
Client SDK (кэш, fallback)
ts const ff = await sdk. getSnapshot() // bootstrap const on = ff. isOn("catalog. new_ranker", ctx)
const payload = ff. payload("catalog. new_ranker", "v1")
11) Boshqa konturlar bilan o’zaro hamkorlik qilish
Rate limits/kvotalar: bayroqlar hodisa paytida RPS/trottling ni tushirishi mumkin.
Circuit breaker/degradation: kill-switchi og’ir yo’llarni o’chiradi va degradatsiyani o’z ichiga oladi.
Katalog/personalizatsiya: bayroqlar vazn/tartib qoidalarini oʻzgartiradi (Remote Config orqali).
DB migratsiyasi: bayroqlar bosqichma-bosqich o’qish/yozuvlarni yangi sxemaga o’tkazadi (read-replica → dual-write → write-primary).
12) Pleybuklar (runbooks)
1. 25% qoʻshilgandan keyingi hodisa
Avtokatof ishladi → Barcha/segment uchun OFF bayrog’i, on-call chiptasi, stats yig’ish, RCA.
Eskirgan shoxni migration bayroq orqali vaqtincha yoqish.
2. Katalog boʻyi p95
Ostona’p95 _ ms> 200’- avtokatof; ’flag _ key = catalog. new_ranker`.
Soddalashtirilgan ranglash (payload config) signallarini yoqish.
3. Yurisdiksiyaning nomuvofiqligi
Permission bayrog’i’NL’- OFF + post-fakt auditi, «region deny» qo’riqlash qoidasini noto’g’ri ochdi.
4. A/B ga dispersiya
Tajribani toʻxtatish, CUPED/stratified tahlil qilish, yangilangan tarozilar bilan qayta ishlash.
13) Test sinovi
Unit: qoidalar/ustuvorliklar/prerekvizitlarni determinik baholash.
Contract: bayroqlar sxemasi (JSON/YAML), validatorlar, merj oldidagi CI tekshiruvi.
Property-based: «deny> allow», «most specific wins», barqaror bucketing.
Replay: haqiqiy kontekstlarni yangi moslamada takrorlash.
E2E: kanareya skriptlari (step-up/step-down), avtokatofni va audit-hodisalarni tekshirish.
Chaos: strimingning uzilishi, eskirgan snapshot, bayroqlarning ommaviy yangilanishi.
14) Tipik xatolar
Mijoz bayroqlaridagi maxfiy mantiq (sizib chiqish/almashtirish).
TTL → «qabriston» bayroqlarining kodda yo’qligi.
Segmentatsiyasiz «universal» bayroqlar → muammoni mahalliylashtirish mumkin emas.
Gardrails/avtokatoflar yo’q - qo’lda sodir bo’lgan hodisalar.
Bayroqlar o’rtasidagi mos kelmaydigan bog’liqliklar → tsikllar/rasinxron.
Har bir soʻrovdagi bayroqlarni keshsiz baholash
Audit/o’zgarishlar oynasining yo’qligi - komplayens xavfi.
15) Sotishdan oldingi chek-varaq
- Bayroq turi, owner, tavsifi, TTL va tiket talabi bilan yaratilgan.
- Maqsadli qoidalar aniqlangan;’deny’nomaqbul mintaqalar/rollarga.
- Sticky bucketing aniqlangan; identifikator barqaror tanlangan.
- Prerekvizitlar va health-bayroqlar tayyor; defolt xavfsiz.
- Dashbordlar va alertlar p95/p99, error_rate, biznes-guardrails.
- Avtokatof sozlangan; rollout to’xtash chegarasi va qaytarish shartlari.
- Kanar rejasi: foizlar/bosqichlar/o’zgarishlar oynasi/mas’ul.
- Konfiglar CI da tasdiqlanadi; snapshot klastyerlar/hududlar bo’yicha taqsimlangan.
- Qo’llab-quvvatlash/mahsulot uchun hujjatlar; hodisalar pleybuklari.
- 100% dan keyin kod va bayroq shoxlarini olib tashlash rejasi.
16) «Migratsiya» bayrog’i namunasi (DQ/indeks)
yaml flag:
key: "search. use_index_v2"
type: "migration"
description: "Switching reads to index v2"
prerequisites:
- key: "search. index_v2_built"
must_be: "on"
rules:
- when: { tenant_id: ["brand_eu"], user_pct: 5 } then: "on"
- when: { tenant_id: ["brand_eu"], user_pct: 25 } then: "on"
safeguards:
auto_rollback_on:
search_p95_ms: ">180"
error_rate: ">1%"
ttl: "2026-02-01"
Xulosa
Feature Flags - bu nafaqat «ochiq/yopiq», balki o’zgarishlar xavfini boshqarish intizomi. Bayroqlarning aniq turlari, determinik targeting, guardrails bilan progressiv hisob-kitoblar, avtokatof, audit va olib tashlash rejasi relizlarni oldindan aytib bo’ladigan, hodisalarni esa qisqa va nazoratli qiladi. Bayroqlarni birinchi darajali fuqarolar sifatida arxitekturaga joylashtiring va siz qimmatni tez-tez, xavfsiz va mazmunli yetkazishingiz mumkin.