ข้ามไปยังเนื้อหาหลัก
ProgrammerThailand

ไอเดีย (Idea) idea devops feature-flag

ไอเดีย #70: เครื่องมือจัดการ feature flag

ฟีเจอร์ใหม่เสร็จแล้ว แต่ยังไม่มั่นใจว่าจะพังไหมถ้าเปิดให้ผู้ใช้ทุกคนพร้อมกัน หลายทีมแก้ด้วยการแยก branch ค้างไว้นาน ๆ หรือใส่ if ที่อ่านค่าจากไฟล์ config แล้วต้อง deploy ใหม่ทุกครั้งที่อยากเปิดปิด ระบบ feature flag ช่วยให้เรา merge โค้ดเข้า main ได้เร็ว แล้วค่อยเปิดฟีเจอร์ให้ผู้ใช้กลุ่มเล็ก ๆ ก่อน ถ้ามีปัญหาก็ปิดได้ทันทีโดยไม่ต้อง deploy

ใครจะใช้

  • นักพัฒนา — สร้าง flag เรียกใช้ผ่าน SDK ในโค้ด
  • Product owner/QA — เปิดปิด flag ปรับเปอร์เซ็นต์ เลือกกลุ่มผู้ใช้
  • หัวหน้าทีม — ดู audit ว่าใครเปลี่ยนอะไรเมื่อไร และทำความสะอาด flag เก่า

ฟีเจอร์ขั้นต่ำ (MVP)

  • จัดการ flag แยกตาม project และ environment (dev/staging/production)
  • flag แบบ boolean และแบบ variant (เช่น A/B)
  • กฎ targeting: เปิดให้ user id ที่ระบุ, กลุ่มตาม attribute (เช่น role, จังหวัด), และเปิดตามเปอร์เซ็นต์
  • การแบ่งเปอร์เซ็นต์แบบคงที่ต่อผู้ใช้ (hash ของ user id + flag key) ให้คนเดิมได้ผลเดิมทุกครั้ง
  • API สำหรับ SDK ดึง config ทั้งชุด แล้วประเมินผลฝั่งแอป พร้อม cache
  • Kill switch ปิดทันทีจากหน้าเว็บ
  • Audit log ทุกการเปลี่ยนแปลง พร้อมค่าก่อน-หลัง

ต่อยอดได้อีก

  • ส่งการเปลี่ยนแปลงแบบ push ผ่าน SSE แทนการ poll
  • ขั้นตอนอนุมัติก่อนเปลี่ยน flag ใน production
  • เตือน flag ที่เปิด 100% มานานแล้ว ให้ลบออกจากโค้ด
  • เก็บสถิติว่าแต่ละ variant ถูกเรียกกี่ครั้ง

โครงข้อมูลตั้งต้น

  • project — id, name
  • environment — id, project_id, key, sdk_key_hash
  • flag — id, project_id, key, type, description, created_by, archived_at
  • flag_config — id, flag_id, environment_id, enabled, rules_json, rollout_pct, version
  • flag_audit — id, flag_config_id, user_id, before_json, after_json, created_at

ระดับความยาก และสิ่งที่จะได้เรียนรู้

ปานกลาง

  • เขียนฟังก์ชัน bucketing ด้วย hash ให้กระจายสม่ำเสมอ
  • ออกแบบ SDK เล็ก ๆ (PHP/JS) ที่ทำงานได้แม้ server flag ล่ม (ใช้ค่า default/ค่า cache ล่าสุด)
  • ทำ rule evaluation ที่ทดสอบได้ด้วย unit test
  • versioning ของ config เพื่อกันเขียนทับกัน

ข้อควรระวัง

  • อย่าใช้ flag แทนการกำหนดสิทธิ์ (authorization) เพราะ config ฝั่ง client อาจถูกอ่านหรือแก้ได้
  • SDK key ฝั่ง frontend ต้องเป็นแบบอ่านอย่างเดียว และไม่ส่งกฎที่มีข้อมูลภายในออกไป
  • flag ที่ไม่ลบจะกลายเป็นหนี้ทางเทคนิค ต้องมีกระบวนการเก็บกวาด

ทีมไหนใช้ feature flag อยู่บ้าง ทำเองหรือใช้บริการสำเร็จรูป? และคุณประเมิน flag ฝั่ง server หรือฝั่ง client มากกว่ากัน เพราะอะไร แชร์กันหน่อยครับ ใครทำ SDK เสร็จแล้วเอามาให้เพื่อน ๆ ลองในกระทู้ได้เลย

0 คะแนน

0 คำตอบ

ยังไม่มีคำตอบ

รู้คำตอบ? ช่วยแบ่งปันได้เลย

ตอบคำถามนี้

เข้าสู่ระบบเพื่อตอบคำถามและโหวต

เข้าสู่ระบบ สมัครสมาชิก