İçeriğe geç

Özellik Bayrakları — Deploy Ettim Ama Kimse Görmedi

Orta 8 dk Sık karşılaşılır

Önce şunu oku: Yayın Stratejileri — Hatalı Sürüm Kaç Kişiye Dokunur?

30 saniyede özet

Özellik bayrağı, kodu yayına almak ile özelliği açmayı birbirinden ayırır. Kod bayrağın arkasında kapalı bekler; önce çalışanlara, sonra küçük bir dilime açılır. Hata çıkarsa kapatmak bir deploy değil, saniyelik bir dokunuştur.

Bir elektrikçi salona yeni bir lamba takıyor. Lamba bir anahtara bağlıysa takıldığı an sönük durur; ne zaman yanacağına sen karar verirsin. Anahtar yoksa takıldığı an yanar, söndürmek için ustanın geri gelmesi gerekir.

  1. Bayt: Anında havale özelliği bitti! Deploy edince herkes görecek.

  2. Sen: Hatalı çıkarsa nasıl kapatacağız?

  3. Bayt: Geri deploy... o da on dakika sürüyor. On dakika boyunca herkes etkilenir.

  4. Bayt: Kodu yayına almak ile özelliği açmak aynı an olmak zorunda değil. Bir anahtar takalım.

Deploy ayrı, yayın ayrı

Bir feature flagKodun içinde, çalışırken değiştirilebilen bir ayara bakan 'açık mı?' kontrolü. Deploy'u release'ten ayırır; kapatmak bir deploy değil, bir ayardır.Sözlükte gör →, kodun içindeki bir “açık mı?” sorusudur. Cevap koddan değil, çalışırken değiştirilebilen bir ayardan gelir.

Kodu bayrak kapalıyken yayına almaya dark launchKodu bayrak kapalıyken yayına almak: kod sunucudadır ama hiçbir kullanıcı o yola girmez. Açmak ayrı bir karar olarak bekler.Sözlükte gör → denir. Deploy olur ama kimse özelliği görmez; açmak ayrı bir karar olarak bekler.

Kafam karıştı, daha basit anlat

Bayrak, özelliği açıp kapatan bir anahtardır. Kod yayında olabilir, anahtar kapalıyken kimse görmez.

Hızlı kontrolBaşlangıç

Deploy ile release arasındaki fark nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Dark launch ne demektir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Adım adım açmak

Yeni özellik bayrakla müşterilerin yüzde 10'una açıldı. Bayrak her istekte yeniden zar atıyor. Dilimdeki bir müşteri beş kez sayfayı yeniledi. Ne görür? Cevabı göster

Özelliği bir görür, bir göremez. Karar her istekte yeniden verildiği için aynı müşteri bazen dilimin içinde, bazen dışında kalır. Düğme gelip gider.

Lamba takılır, ama ne zaman yanacağını anahtar seçer.
Adım adım oku
  1. Anahtarsız lamba takıldığı an yanar.
  2. Söndürmek için ustanın geri gelmesi gerekir: dakikalar.
  3. Anahtarlı lamba takılır ama sönük durur.
  4. Yakmak da söndürmek de bir dokunuş: saniyeler.

Güvenli sıra: önce çalışanlar, sonra küçük bir müşteri dilimi, sonra herkes. Her adımda metriklere bakılır; tıpkı canary releaseYeni sürümü önce trafiğin küçük bir dilimine açıp hata oranını eski sürümle karşılaştırmak. Hatalı sürüm yalnızca o dilime dokunur.Sözlükte gör → gibi, ama sunucu yerine kullanıcı üzerinden.

Yüzde dilimi müşteri numarasının hash’ine bağlanır. Böylece bir müşteri dilimin içindeyse hep içinde kalır.

Kafam karıştı, daha basit anlat

Önce çalışanlar, sonra birkaç müşteri, sonra herkes. Yüzde kararını müşteriye yapıştır ki düğme gelip gitmesin.

Hızlı kontrolOrta

Hatalı özellik bayrakla müşterilerin yüzde 10'una açık. En hızlı müdahale hangisi?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Yüzde 10'luk bayrak her istekte Math.random() ile karar veriyor. Sonuç?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Anında havale yayına çıkıyor

Tohum 213282

Müşteri 42'nin beş isteği:

  1. …
  2. …
  3. …
  4. …
  5. …

Oynat ya da adımla.

Hız
Adım 0

Şu an ne oldu?

Deploy ile doğrudan açık

Kodu yayına almak (deploy) ile özelliği müşteriye açmak (release) aynı şey olmak zorunda değil.

Görevler0/3

  • Hatalı özelliği bütün müşterilere açaçık

    İpucu

    Varsayılan ayarlar yeter.

  • Kodu yayına al ama hiçbir müşteri görmesinaçık

    İpucu

    Deploy ile yayını ayır.

  • Aynı müşteriye düğmeyi bir gösterip bir saklaaçık

    İpucu

    Yüzde dilimine bak.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. Hatalı özellik deploy ile herkese açıldı; kapatmak geri deploy.
  2. “Bayrak arkasında, kapalı” seç. Kod yayında, kimse görmüyor.
  3. “Yalnızca çalışanlar” seç. Hatayı çalışanlar buldu, bayrak saniyeler içinde kapandı.
  4. Yüzde 10’a geç ve yapışıklığı kapat. Müşteri 42’nin düğmesi bir geliyor bir gidiyor.
Hızlı kontrolOrta

Bir özelliği açmak için en güvenli sıra hangisi?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Bayrak arkasındaki özellik hatalı ve bayrak kapalı. Kaç müşteri etkilenir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Unutulan bayraklar. Herkese açılmış ve aylarca dokunulmamış bayraklar kodu iki yola böler ve testleri ikiye katlar. Her bayrağın bir sahibi ve bir silinme tarihi olsun.

Bayrağın çözmediği şey. Veritabanı şeması bayrakla açılıp kapanmaz. Yeni bir kolon, bayrak kapalıyken de eski kodla uyumlu olmalı.

Bayrak servisine bağımlılık. Bayrak ayarı okunamazsa ne olacağı baştan belli olmalı. Güvenli varsayılan çoğu zaman “kapalı”dır.

Kafam karıştı, daha basit anlat

Bayrağı işi bitince sil, şemayı ayrıca düşün, ayar okunamazsa kapalı say.

Hızlı kontrolOrta

Yeni özellik bir kolon ekliyor. Bayrak kapalıyken eski kod da çalışıyor. Şema için doğru yaklaşım hangisi?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aşağıdaki örnek bir bankanın anında havale özelliğinden: bayrak müşteri numarasıyla yapışık, ayar okunamazsa kapalı, kod iki yolu temiz ayırıyor.

Derinleş · Anında havale: bayrak arkasında, müşteriye yapışık 4 dosya · ~61 satır · ilk okumada atlayabilirsin
Proje dosyaları

src/main/java/com/bank/flags/ InstantTransferFlag.java Bayrak kararı: önce çalışanlar, sonra müşteri numarasının hash'iyle yüzde dilimi.

src/main/java/com/bank/flags/InstantTransferFlag.java
@Component
class InstantTransferFlag {
private final FlagSettings settings;
InstantTransferFlag(FlagSettings settings) {
this.settings = settings;
}
// Owner: payments-team. Remove after 2026-12-31 once fully rolled out.
boolean isOnFor(Customer customer) {
FlagSettings.Rollout rollout = settings.instantTransfer();
if (customer.isStaff()) return rollout.staff();
// Sticky: the same customer always lands in the same bucket.
int bucket = Math.floorMod(Long.hashCode(customer.id()), 100);
return bucket < rollout.percent();
}
}

src/main/java/com/bank/flags/ FlagSettings.java Bayrak ayarı okunamazsa güvenli varsayılan: kapalı.

src/main/java/com/bank/flags/FlagSettings.java
// Read from the config service at runtime. If it cannot be read, every flag
// is off: a missing setting must never switch a new feature on.
@ConfigurationProperties("flags")
record FlagSettings(Rollout instantTransfer) {
FlagSettings {
if (instantTransfer == null) instantTransfer = new Rollout(false, 0);
}
record Rollout(boolean staff, int percent) {
}
}

src/main/java/com/bank/transfer/ TransferService.java Servis: iki yol tek bir noktada ayrılıyor; bayrak silinince tek satır değişecek.

src/main/java/com/bank/transfer/TransferService.java
@Service
class TransferService {
private final InstantTransferFlag instant;
private final InstantRail instantRail;
private final BatchRail batchRail;
TransferService(InstantTransferFlag instant, InstantRail instantRail, BatchRail batchRail) {
this.instant = instant;
this.instantRail = instantRail;
this.batchRail = batchRail;
}
TransferResult send(Customer customer, TransferRequest request) {
// The single branch point: deleting the flag later changes this one line.
return instant.isOnFor(customer) ? instantRail.send(request) : batchRail.send(request);
}
}

src/test/java/com/bank/flags/ InstantTransferFlagTest.java Test: aynı müşteri her çağrıda aynı kararı alıyor.

src/test/java/com/bank/flags/InstantTransferFlagTest.java
class InstantTransferFlagTest {
@Test
void aCustomerGetsTheSameAnswerEveryTime() {
var flag = new InstantTransferFlag(new FlagSettings(new FlagSettings.Rollout(false, 10)));
var customer = Customer.retail(42L);
boolean first = flag.isOnFor(customer);
for (int i = 0; i < 100; i++) {
assertThat(flag.isOnFor(customer)).isEqualTo(first);
}
}
}

Kendini sına

Şimşek turu1/4

Bayrak arkasındaki bir özelliğin kodu yayında olabilir ama hiçbir kullanıcı onu görmeyebilir.

Soru 1/3İleri

Bayrak servisi çöktü ve ayar okunamıyor. Yeni özellik için güvenli varsayılan nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Deploy kodu sunucuya koyar, release özelliği kullanıcıya açar. Bayrak bu ikisini ayırır: kod yayında olur ama kapalı bekler.
  2. 2 Bayrakla açılan bir özellik, hata çıkınca saniyeler içinde kapatılır. Bayrağı olmayan bir özelliği kapatmak yeni bir deploy ister.
  3. 3 Yüzde dilimi müşteri numarasının hash'ine bağlanır. Her istekte yeniden karar veren bir bayrak, aynı kişiye özelliği bir gösterir bir saklar.
Sonraki kapı Bir satır değiştirdin ve yeşil ışığı yirmi dakika bekliyorsun. Bu yirmi dakikanın ne kadarı gerçekten gerekli? CI Pipeline — Geri Bildirim Neden Bu Kadar Geç Geliyor? · 9 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı