0

[Mỗi ngày 1 open-source] #1 - Featurevisor: Quản lý Feature Flags theo phong cách GitOps

Chào mọi người, mình bắt đầu series "Mỗi ngày 1 open-source" nhằm giới thiệu các dự án mã nguồn mở thú vị, hữu ích và có kiến trúc kỹ thuật đáng học hỏi. Phát súng đầu tiên sẽ là Featurevisor - một giải pháp Feature Management cực kỳ hiện đại dành riêng cho lập trình viên.

Giới thiệu chung

Featurevisor cho phép bạn quản lý Feature Flags (bật/tắt tính năng), A/B Testing và Remote Config thông qua quy trình GitOps. Thay vì sử dụng dashboard UI và lưu dữ liệu vào Database như các dịch vụ SaaS (LaunchDarkly, Split), Featurevisor đưa mọi thứ về tệp tin cấu hình (YAML/JSON) nằm ngay trong Repo của bạn.

Github: https://github.com/featurevisor/featurevisor

Ngôn ngữ chủ đạo: TypeScript (98%)

Kiến trúc: Monorepo (Lerna, NPM Workspaces)

🏗 Những điểm sáng về kiến trúc

1. Triết lý GitOps & Declarative Configuration

Lập trình viên định nghĩa các tính năng dưới dạng tệp YAML. Mọi thay đổi đều phải qua quy trình: Tạo nhánh -> PR -> Review -> Merge. Điều này giúp minh bạch hóa lịch sử thay đổi và kiểm soát phiên bản tuyệt đối.

2. Kiến trúc Static Datafile (Cloud-Native)

Đây là kỹ thuật đặc sắc nhất. CLI của Featurevisor sẽ quét các tệp YAML và "biên dịch" chúng thành các tệp JSON tĩnh (datafiles). Các tệp này được đẩy lên các CDN (như S3, Cloudflare Pages). Ứng dụng chỉ tải file này về, việc kiểm tra flag diễn ra hoàn toàn ở Client-side.

3. Consistent Bucketing (Phân đoạn nhất quán)

Dự án sử dụng thuật toán băm MurmurHash dựa trên userId cộng với khóa của tính năng. Kết quả cho ra một con số từ 0-100. Kỹ thuật này đảm bảo tính nhất quán: Cùng một người dùng luôn nhận được cùng một trải nghiệm trên mọi thiết bị mà không cần lưu trạng thái trên server.

🔄 Luồng hoạt động (Sequence Diagram) Để dễ hình dung, mời các bạn xem sơ đồ luồng hoạt động từ lúc Code đến lúc thực thi trong ứng dụng:

Phân tích sơ đồ: Tách biệt Quản lý và Thực thi: Mọi logic nặng nề (lint, test, build) đều nằm ở giai đoạn CI/CD. 0ms Latency: SDK trong ứng dụng không phải gọi API "hỏi" server mỗi khi cần check flag. Nó tự tính toán ngay tại local dựa trên Datafile đã tải sẵn, giúp trải nghiệm người dùng mượt mà tuyệt đối.

Ví dụ thực tế Bước A: Định nghĩa tính năng (features/new_button.yml)

description: Hiển thị nút bấm mới cho người dùng thử nghiệm
bucketBy: userId
variations:
  - value: control
    weight: 50 # 50% user thấy nút cũ
  - value: treatment
    weight: 50 # 50% user thấy nút mới
environments:
  production:
    rules:
      - segment: vi_users # Chỉ áp dụng cho phân đoạn user Việt Nam
        force: treatment

Bước B: Sử dụng trong code React (Client SDK)

import { useFeature } from '@featurevisor/react';

function Header() {
  const { isEnabled, variation } = useFeature('new_button');

  return (
    <div>
      {isEnabled && variation === 'treatment' ? (
        <button className="btn-new">Nút mới xịn xò</button>
      ) : (
        <button className="btn-old">Nút cũ</button>
      )}
    </div>
  );
}

⚖️ So sánh với các giải pháp khác

Đặc điểm Featurevisor LaunchDarkly / Split Unleash (Self-hosted)
Quản lý File YAML (Git) Dashboard (SaaS) Dashboard + DB
Data Transfer File JSON tĩnh (CDN) Real-time API Real-time API
Chi phí Gần như $0 Rất đắt (theo số lượng user) Phí server & bảo trì
Tính bảo mật Tuyệt vời (User ID không rời App) Trung bình (Gửi ID lên Cloud) Tốt

✅ Kết luận: Tại sao nên chọn Featurevisor? Hiệu suất: Không tốn request mạng để kiểm tra flag.

Bảo mật: Dữ liệu người dùng hoàn toàn nằm trong hạ tầng của bạn.

Chi phí: Tận dụng CDN sẵn có, không tốn tiền thuê server quản lý flag hàng tháng.

Developer Experience: Thân thiện với những ai yêu thích việc quản lý mọi thứ qua mã nguồn (Code-first).

Hy vọng bài viết đầu tiên này mang lại cho bạn một công cụ hữu ích để áp dụng vào dự án. Đừng quên Upvote và Follow mình để đón xem Open-source thú vị tiếp theo vào ngày mai nhé!

Hình ảnh và mã nguồn thuộc bản quyền của đội ngũ Featurevisor


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí