GoDasturchi
Project: Rolling Out a Flag

Project: Rolling Out a Flag

Loyiha: Flagni bosqichma-bosqich chiqarish

Yakuniy loyihaning so'nggi qismi. Store flaglarni yoza, qidira va o'chira oladi, lekin hech qanday metod funksiya yoqiqligini hal qilish uchun o'qimaydi, va Rollout maydoni uni Flagga qo'shganingizdan beri ishlatilmagan.

IsEnabled aynan shu uchun. Siz kamdan-kam hollarda funksiyani hamma uchun bir vaqtda yoqasiz: uni foydalanuvchilarning 5%iga chiqarasiz, kuzatasiz, keyin 25%, keyin 100%. Shuning uchun savol "bu yonikmi?" emas, "bu shu foydalanuvchi uchun yonikmi?"

example.go
if store.IsEnabled("new-checkout", user.ID) {
	renderNewCheckout(w, user)
} else {
	renderOldCheckout(w, user)
}

Har bir foydalanuvchi uchun barqaror savat

Qiziqarli qismi — rollout, va u yopishqoq bo'lishi kerak. Yangi checkout'ga tushgan foydalanuvchi yangilashda orqaga qaytarilmasligi kerak, shuning uchun tasodifiy narsa mos emas. Buning o'rniga foydalanuvchidan qat'iy son hosil qiling:

example.go
userID%100 < f.Rollout

userID % 100 — 100ga bo'lgandagi qoldiq, shuning uchun ID qanchalik katta bo'lmasin u har doim 0 dan 99gacha, va bir xil ID har doim bir xil savatni beradi.

Rollout — o'sha 100 ta savatdan nechtasi 0dan boshlab "ichkarida" hisoblanishi. 30da, 0 dan 29gacha savatlar o'tadi: foydalanuvchilarning taxminan 30%i, har chaqiruvda bir xil 30%.

Chetlarga alohida holat kerak emas. 100da har bir savat undan past, shuning uchun hamma ichkarida. 0da hech qanday savat yo'q, shuning uchun hech kim ichkarida emas.

>_ Exercise

IsEnabledni *Store ustida metod sifatida yozing. Set, Find, va Removega ega to'liq store allaqachon berilgan.

Metod

example.go
func (s *Store) IsEnabled(name string, userID int) bool

Talablar

  • name bo'yicha flagni qidiring. Agar u mavjud bo'lmasa, false qaytaring (noma'lum flaglar o'chiq)
  • Flagning Enabled tugmasi o'chiq bo'lsa, Rollout 100 bo'lsa ham false qaytaring. Tugma foizdan ustun turadi
  • Aks holda, userID % 100 flagning Rolloutidan past bo'lganda foydalanuvchini ichkariga qo'ying
  • Bir xil namegi flag uchun bir xil userID har doim bir xil javob olishi kerak

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Bir xil kirish har doim bir xil javob olishi kerak bo'lganda, qarorni tasodifdan emas, kirishning o'zidan hosil qiling; value % n istalgan kirishni chaqiruvlar orasida hech qachon o'zgarmaydigan qat'iy savatga aylantiradi.

Finish
OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Project: Rolling Out a Flag

Loyiha: Flagni bosqichma-bosqich chiqarish

Yakuniy loyihaning so'nggi qismi. Store flaglarni yoza, qidira va o'chira oladi, lekin hech qanday metod funksiya yoqiqligini hal qilish uchun o'qimaydi, va Rollout maydoni uni Flagga qo'shganingizdan beri ishlatilmagan.

IsEnabled aynan shu uchun. Siz kamdan-kam hollarda funksiyani hamma uchun bir vaqtda yoqasiz: uni foydalanuvchilarning 5%iga chiqarasiz, kuzatasiz, keyin 25%, keyin 100%. Shuning uchun savol "bu yonikmi?" emas, "bu shu foydalanuvchi uchun yonikmi?"

example.go
if store.IsEnabled("new-checkout", user.ID) {
	renderNewCheckout(w, user)
} else {
	renderOldCheckout(w, user)
}

Har bir foydalanuvchi uchun barqaror savat

Qiziqarli qismi — rollout, va u yopishqoq bo'lishi kerak. Yangi checkout'ga tushgan foydalanuvchi yangilashda orqaga qaytarilmasligi kerak, shuning uchun tasodifiy narsa mos emas. Buning o'rniga foydalanuvchidan qat'iy son hosil qiling:

example.go
userID%100 < f.Rollout

userID % 100 — 100ga bo'lgandagi qoldiq, shuning uchun ID qanchalik katta bo'lmasin u har doim 0 dan 99gacha, va bir xil ID har doim bir xil savatni beradi.

Rollout — o'sha 100 ta savatdan nechtasi 0dan boshlab "ichkarida" hisoblanishi. 30da, 0 dan 29gacha savatlar o'tadi: foydalanuvchilarning taxminan 30%i, har chaqiruvda bir xil 30%.

Chetlarga alohida holat kerak emas. 100da har bir savat undan past, shuning uchun hamma ichkarida. 0da hech qanday savat yo'q, shuning uchun hech kim ichkarida emas.

>_ Exercise

IsEnabledni *Store ustida metod sifatida yozing. Set, Find, va Removega ega to'liq store allaqachon berilgan.

Metod

example.go
func (s *Store) IsEnabled(name string, userID int) bool

Talablar

  • name bo'yicha flagni qidiring. Agar u mavjud bo'lmasa, false qaytaring (noma'lum flaglar o'chiq)
  • Flagning Enabled tugmasi o'chiq bo'lsa, Rollout 100 bo'lsa ham false qaytaring. Tugma foizdan ustun turadi
  • Aks holda, userID % 100 flagning Rolloutidan past bo'lganda foydalanuvchini ichkariga qo'ying
  • Bir xil namegi flag uchun bir xil userID har doim bir xil javob olishi kerak

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Bir xil kirish har doim bir xil javob olishi kerak bo'lganda, qarorni tasodifdan emas, kirishning o'zidan hosil qiling; value % n istalgan kirishni chaqiruvlar orasida hech qachon o'zgarmaydigan qat'iy savatga aylantiradi.