Feature Flags we Fich
Feature Flag (FF) kody çykarmazdan ulgamyň özüni alyp barşyny öz içine alýan/öçürýän dolandyrylýan şertdir. Baýdaklar: fiçleri howpsuz çykarmaga, ulanyjylaryň/bazarlaryň/tenantlaryň toparlaryny nyşana almaga, problemaly komponentleri çalt öçürmäge, synaglary geçirmäge we parametrleri kärendesine düzmäge mümkinçilik berýär.
Esasy maksatlar:- Goýberilende blast radiusyny azalt.
- Ýerleşdirmegi we işjeňleşdirmegi bölmek.
- Audit, SLO we "bir gezek basmak" bilen üýtgeşmeleri aç-açan dolandyrmak.
1) Baýdaklaryň görnüşleri we olary haçan ulanmak
Release flags - täze çiçegiň tapgyrlaýyn goşulmagy (dark → canary → ramp-up → 100%).
Ops/kill-switch - garaşlylygy derrew öçürmek (üpjün ediji, kiçi ulgam, agyr hasaplamalar).
Experiment (A/B, multi-variant) - traffigi wariantlara bölmek (weights, sticky bucketing).
Permission/Entitlement - rollar/meýilnamalar/ýurisdiksiýalar boýunça aýratynlyklara girmek.
Remote Config - baýdakdan/konfigadan özüňi alyp barşyň parametrleri (bosagasy, wagt, formula).
Migration flags - shemalary/maglumat ýollaryny üýtgetmek (täze indekse/BD/endpointe geçmek).
Anti-pattern: şol bir baýdak "hemme zat hakda" - fiça, komp switch we parametrlere bölüň.
2) Baýdak maglumatlarynyň nusgasy (iň az)
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) Baha bermek we nyşana almak (evaluation)
Ключи таргетинга: `tenant_id, region/licence, currency, channel, locale, role, plan, device, user_id, cohort, kyc_tier, experiment_bucket`.
Baha bermegiň tertibi: prerequisites → deny-düzgünler → allow-düzgünler → defolt.
Sticky bucketing: Synap görmek üçin, 'hash (user_id, flag_key)' - ulanyjynyň hemişe bir warianty almagy üçin durnukly kesgitleýjini kesiň.
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 paýlanyşy we arhitekturasy
Wariantlar:- Server-side SDK (maslahat berilýär): hakykat çeşmeleri we arka tarapdaky keş; logikany birleşdirmek.
- Edge/CDN evaluation: perimetrde çalt nyşana almak (PII/syr ýok).
- Client-side SDK: UI şahsylaşdyrmak zerur bolanda, ýöne - diňe iň az kontekstde we duýgur düzgünler bolmazdan.
- Config-as-Code: baýdaklary repozitoriýada saklamak, CI-ni tassyklamak, CD arkaly rollout.
- Startup bootstrap + streaming updates (SSE/gRPC) + fallback iň soňky snapshot.
- Baýdaklaryň SLA "freshness": p95 ≤ 5 s.
5) Goýberiş strategiýalary
5. 1 Dark Launch
Surat açyldy, ýöne ulanyja görünmeýär; metrikleri we ýalňyşlyklary ýygnaýarys.
5. 2 Canary
Bir ýurisdiksiýada/tenantada traffigiň 1-5% -ini goşýarys; p95/p99, ýalňyşlyklar, öwrülişikler.
Stop conditions - metrikler boýunça awtokatofyň bosagaly triggerleri.
5. 3 Progressive Rollout
10% → 25% → 50% → 100% el bilen/awto-barlamak bilen.
5. 4 Shadow / Mirroring
Täze ýolda (görünýän täsir etmezden) haýyşlary köpeldýäris we netijeleri/gizlinligi deňeşdirýäris.
5. 5 Blue/Green + FF
Iki wersiýany açýarys; baýdak traffigi dolandyrýar we segmentlere garaşlylygy üýtgedýär.
6) Garaşlylyk we kross-hyzmat yzygiderliligi
Prerequisites we "saglyk-taýynlyk baýdaklaryny" ulanyň: indeks guruldy, migrasiýa tamamlandy.
Wakalar arkaly utgaşdyrmak: 'FlagChanged (flag_key, skope, new_state)'.
1. açyň read-way → 2) metrikleri barlaň → 3) write/side-effects.
- Hyzmat şertnamalary: defolt howpsuz bolmaly (fil-safe OFF).
7) Synlamak we SLO
Baýdak/wariant/segment üçin metrikler:- `flag_eval_p95_ms`, `errors_rate`, `config_freshness_ms`.
- Iş metrikleri: 'ctr', 'conversion', 'ARPU', 'retention', guardrails (mysal üçin, RG hadysalary).
- Awtokatof üçin awtomatiki SLO bosagalary.
Giriş/söwda: 'flag _ key', 'variant', 'decision _ source' (server/edge/client), 'context _ hash' goşuň.
Daşbordlar: bosagalar bilen "basgançak" rollout, segmentler boýunça ýalňyşlyklaryň heatmap.
8) Howpsuzlyk we gabat gelmek
kontekstde PII-minimalizasiýa.
RLS/ACL: kim haýsy baýdaklary üýtgedip biler (domenler/bazarlar boýunça).
Üýtgetmek üçin sagat penjireleri (change windows) we duýgur baýdaklar üçin "goşa tassyklama".
Üýtgemeýän audit: kim/haçan/näme/näme (ticket/incident link).
Ýurisdiksiýalar: baýdaklar kadalaşdyryjy gadaganlyklardan aýlanyp geçmeli däldir (mysal üçin, gadagan edilen ýurtda oýny öz içine almalydyr).
9) "Uzak möhletli" baýdaklary dolandyrmak
Her baýdagyň TTL/öçürilen senesi bar.
100% goşulandan soň - kod şahalaryny aýyrmak üçin task dörediň, ýogsam "baýdak-karz" öser.
Baýdaklary 'migration '/' one-time' diýip belläň, olary hemişelik 'permission/config' -den aýyryň.
10) Şertnamanyň API/SDK mysaly
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) Beýleki konturlar bilen özara gatnaşygy
Rate limits/kwotalar: baýdaklar RPS-i peseldip biler/waka wagtynda trottling goşup biler.
Circuit breaker/degradation: kill-switchy agyr ýollary öçürýär we zaýalanmagy öz içine alýar.
Katalog/şahsylaşdyrma: baýdaklar agramy/reýting düzgünlerini üýtgedýär (Remote Config arkaly).
DB göçmeleri: baýdaklar okalyşlary/ýazgylary tapgyrlaýyn täze shema geçirýärler (read-replica → dual-write → write-primary).
12) Oýun kitaplary (runbooks)
1. 25% -den soňky waka
Awtokatof işledi → hemmeler/segment üçin OFF baýdagy, on-call-daky bilet, stats ýygnamak, RCA.
Göçme baýdak arkaly könelişmegi/köne şahany wagtlaýyn açyň.
2. p95 katalogyň beýikligi
Bosagasy 'p95 _ ms> 200' - awtokatof; 'flag _ key = catalog. new_ranker`.
Ýönekeýleşdirilen reýting signallaryny açyň (payload config).
3. Ýurisdiksiýanyň laýyk gelmezligi
Permission baýdagy 'NL' - OFF '-da oýny ýalňyşlyk bilen açdy + faktdan soňky audit, "region deny" gorag düzgünini goşmak.
4. A/B dispersiýasy
Synagy duruzmak, CUPED/stratified derňewi geçirmek, täzelenen tereziler bilen gaýtadan işlemek.
13) Synag
Unit: düzgünlere/ileri tutulýan ugurlara/prerekwizitlere kesgitlenen baha bermek.
Contract: baýdaklaryň shemasy (JSON/YAML), walidatorlar, merjeniň öňündäki CI barlagy.
Property-based: "deny> allow", "most specific wins", durnukly bucketing.
Replay: Täze konfigurasiýada hakyky kontekstleri oýnamak.
E2E: kanareýa skriptleri (step-up/step-down), awtokatofy we audit-wakalary barlamak.
Chaos: akymyň döwülmegi, köne snapshot, baýdaklaryň köpçülikleýin täzelenmegi.
14) Adaty ýalňyşlyklar
Müşderi baýdaklarynda gizlin logika (syzmak/çalyşmak).
Kodda baýdaklaryň ýoklugy TTL → "gonamçylyk".
Bölümlenmezden "ähliumumy" baýdaklar → meseläni lokallaşdyryp bolmaýar.
guardrails/awtokatoflar ýok - el bilen hadysalar.
Baýdaklaryň arasyndaky gabat gelmeýän baglanyşyklar → aýlawlar/rasinhron.
Her soragdaky baýdaklara kesişsiz baha bermek → gizlinlik partlamasy.
Auditiň/üýtgeşmeleriň penjiresiniň ýoklugy - laýyklyk töwekgelçiligi.
15) Azyk önüminden öň çek-sanawy
- Baýdak görnüşi, owner, beýany, TTL we bilet talaby bilen döredildi.
- Maksat düzgünleri kesgitlenendir; 'deny' islenilmeýän sebitlere/rollara.
- Sticky bucketing kesgitlenen; Kesgitleýji yzygiderli saýlandy.
- Prerekwizitler we saglyk baýdaklary taýýar; defolt howpsuz.
- Daşbordlar we alertler p95/p99, error_rate, business-guardrails.
- Awtokatof sazlandy; rollout duralgasy we yzyna gaýtarmagyň şertleri.
- Kanar meýilnamasy: göterim/tapgyrlar/üýtgeşmeler penjiresi/jogapkär.
- Konfigiler CI-de tassyklanýar; snapshot toparlar/sebitler boýunça paýlandy.
- Goldaw/önüm üçin resminamalar; wakalaryň pleýbuklary.
- 100% -den soň kod we baýdak şahalaryny aýyrmak meýilnamasy.
16) "Migrasiýa" baýdagynyň mysaly (DB/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"
Netije
"Feature Flags" diňe bir "açyk/ýapyk" däl, eýsem üýtgemek töwekgelçiligini dolandyrmagyň düzgünidir. Baýdaklaryň aýdyň görnüşleri, kesgitlenen nyşana almak, guardrails bilen progressiw düzüliş, awtokatof, audit we aýyrmak meýilnamasy relizleri öňünden aýdyp boljak, wakalary bolsa gysga we gözegçilik edip boljak edýär. Raýatlaryň birinji synpy ýaly arhitektura baýdaklary goýuň - gymmaty ýygy-ýygydan, has ygtybarly we manyly getirip bilersiňiz.