ไอเดีย #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, nameenvironment— id, project_id, key, sdk_key_hashflag— id, project_id, key, type, description, created_by, archived_atflag_config— id, flag_id, environment_id, enabled, rules_json, rollout_pct, versionflag_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 เสร็จแล้วเอามาให้เพื่อน ๆ ลองในกระทู้ได้เลย