Bắt Đầu Nhanh: Chạy Unleash Trong 5 Phút
Lúc 2 giờ sáng, đồng đội của tôi push một tính năng thanh toán bị lỗi lên production. Hotfix sẽ mất 45 phút để test và redeploy. Chúng tôi không có feature flags. Không có kill switch. Chỉ có 3.000 người dùng đang gặp lỗi trên trang checkout và một kênh Slack đang nháo nhào.
Đêm đó, tôi tự hứa sẽ cài đặt Unleash trước cuối tuần. Đây là những gì tôi đã cấu hình — và những gì tôi ước mình đã chạy từ 6 tiếng trước.
Unleash là nền tảng feature flag mã nguồn mở. Tự host trên Docker mất chưa đến 5 phút. Bạn có đầy đủ UI, REST API và SDK cho mọi ngôn ngữ lập trình phổ biến — hoàn toàn miễn phí, chạy trên hạ tầng của riêng bạn.
Đầu tiên, cài Docker và Docker Compose, rồi tạo file docker-compose.yml với nội dung sau:
version: '3.8'
services:
unleash_db:
image: postgres:15-alpine
environment:
POSTGRES_DB: unleash
POSTGRES_USER: unleash
POSTGRES_PASSWORD: secret123
volumes:
- unleash_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U unleash"]
interval: 10s
timeout: 5s
retries: 5
unleash:
image: unleashorg/unleash-server:latest
ports:
- "4242:4242"
environment:
DATABASE_URL: postgres://unleash:secret123@unleash_db/unleash
INIT_FRONTEND_API_TOKENS: default:development.unleash-insecure-frontend-api-token
INIT_CLIENT_API_TOKENS: default:development.unleash-insecure-client-api-token
depends_on:
unleash_db:
condition: service_healthy
volumes:
unleash_data:
Khởi động:
docker compose up -d
Truy cập http://localhost:4242. Thông tin đăng nhập mặc định: admin / unleash4all. Bạn đã có một hệ thống feature flag đang chạy. Vậy là xong phần bắt đầu nhanh.
Tìm Hiểu Sâu: Unleash Thực Sự Hoạt Động Như Thế Nào
Kiến Trúc Giải Thích Đơn Giản
Hệ thống gồm ba thành phần: admin UI (giao diện bạn thấy trên trình duyệt), REST API (để ứng dụng của bạn giao tiếp) và cơ sở dữ liệu PostgreSQL (nơi lưu định nghĩa các flag). Ứng dụng của bạn không gọi đến Unleash server mỗi khi xử lý request — điều đó sẽ gây ra vấn đề latency nghiêm trọng. Thay vào đó, SDK poll API mỗi 15 giây và cache trạng thái flag tại local. Việc đánh giá flag diễn ra trong process, trong bộ nhớ. Không có network round-trip nào cho mỗi request.
Đây là chi tiết mà hầu hết các hướng dẫn bỏ qua. Khi tôi lần đầu cài đặt, tôi nghĩ mỗi lần kiểm tra flag là một lần gọi mạng. Hiểu được mô hình local cache thay đổi cách bạn nghĩ về độ tin cậy — ngay cả khi Unleash bị sập, ứng dụng vẫn tiếp tục chạy với trạng thái flag được biết lần cuối.
Tạo Feature Flag Đầu Tiên
Trong giao diện Unleash, vào Feature Toggles → New feature toggle. Đặt tên là new-checkout-flow, chọn loại Release và gán vào project default. Bật nó trong môi trường development.
Bây giờ tích hợp vào ứng dụng của bạn. Đây là ví dụ Python sử dụng SDK chính thức:
pip install UnleashClient
from UnleashClient import UnleashClient
client = UnleashClient(
url="http://localhost:4242/api",
app_name="my-app",
custom_headers={"Authorization": "default:development.unleash-insecure-client-api-token"}
)
client.initialize_client()
if client.is_enabled("new-checkout-flow"):
# hiển thị trải nghiệm checkout mới
run_new_checkout()
else:
# quay về luồng cũ
run_legacy_checkout()
Và phiên bản Node.js cho những ai dùng Express hoặc Next.js backend:
npm install unleash-client
const { initialize } = require('unleash-client');
const unleash = initialize({
url: 'http://localhost:4242/api',
appName: 'my-app',
customHeaders: {
Authorization: 'default:development.unleash-insecure-client-api-token',
},
});
unleash.on('synchronized', () => {
if (unleash.isEnabled('new-checkout-flow')) {
console.log('Checkout mới đang BẬT');
}
});
Activation Strategies: Sức Mạnh Thực Sự
Bật/tắt chỉ là điểm khởi đầu. Sức mạnh thực sự nằm ở activation strategies. Bạn có thể triển khai tính năng cho:
- Gradual rollout — bật cho X% người dùng (sticky theo userId)
- UserIDs — chỉ bật cho các tài khoản người dùng cụ thể (rất tốt cho kiểm thử nội bộ)
- IPs — chỉ bật từ các dải IP cụ thể
- Custom constraints — kết hợp bất kỳ điều kiện nào ở trên với logic AND/OR
Để gradual rollout, truyền context người dùng khi kiểm tra flag:
from UnleashClient import UnleashClient
from UnleashClient.strategies import Strategy
client = UnleashClient(
url="http://localhost:4242/api",
app_name="my-app",
custom_headers={"Authorization": "default:development.unleash-insecure-client-api-token"}
)
client.initialize_client()
# Truyền context người dùng để gradual rollout hoạt động đúng
context = {"userId": "user-12345", "sessionId": "session-abc"}
if client.is_enabled("new-checkout-flow", context):
run_new_checkout()
Nếu không có context, gradual rollout sẽ fallback về ngẫu nhiên — cùng một người dùng có thể thấy checkout mới ở request này và checkout cũ ở request tiếp theo. Luôn truyền userId.
Sử Dụng Nâng Cao: A/B Testing Không Cần Dịch Vụ Bên Thứ Ba
Chạy A/B Test Thực Tế
Tính năng Variant biến bất kỳ flag nào thành A/B test. Thay vì giá trị boolean, flag của bạn trả về tên variant và payload tùy chọn. Bạn có thể chia traffic giữa nhiều variant với trọng số tùy chỉnh.
Trong UI, chỉnh sửa flag → vào Variants → thêm variants: control (weight 500) và new-design (weight 500). Đó là tỷ lệ 50/50.
variant = client.get_variant("checkout-ab-test", context)
if variant["name"] == "new-design" and variant["enabled"]:
show_new_design()
else:
show_control()
# Ghi variant vào hệ thống analytics của bạn
analytics.track("checkout_shown", {
"userId": context["userId"],
"variant": variant["name"]
})
Tính sticky là tự động — người dùng ở “new-design” ở request 1 sẽ vẫn ở “new-design” ở request 100, miễn là bạn truyền cùng userId.
Sẵn Sàng Production: Bảo Mật và Mở Rộng Unleash
Các API token trong file compose bắt đầu nhanh được cố ý để không an toàn — ổn với localhost, nhưng không thể dùng ở nơi nào khác. Với production, hãy thay thế chúng ngay:
# Truy cập vào container Unleash
docker compose exec unleash sh
# Hoặc tạo token qua UI:
# Settings → API access → New API token
# Đặt type: CLIENT, environment: production
Cập nhật file compose cho production — xóa các biến môi trường token không an toàn và quản lý token qua UI. Cũng thêm giới hạn tài nguyên:
unleash:
image: unleashorg/unleash-server:latest
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
environment:
DATABASE_URL: postgres://unleash:${DB_PASSWORD}@unleash_db/unleash
AUTH_TYPE: open-source
restart: unless-stopped
Đặt Unleash phía sau reverse proxy (Nginx hoặc Caddy) với TLS. Các server ứng dụng của bạn nên kết nối Unleash qua HTTPS, không bao giờ dùng HTTP thường trong production.
Mẹo Thực Tế Từ Kinh Nghiệm
Đặt Tên Flag Như Thể Chúng Tồn Tại Mãi
Tệ: feature1, test-thing, johns-experiment
Tốt: checkout-new-payment-flow, homepage-hero-ab-test-2024q3
Tên flag rất khó đổi khi đã xuất hiện trong code của nhiều service. Tôi đã tiếp quản các codebase với 40 flag tên như flag_v2, flag_v2_new, flag_v2_final. Hãy dành 30 giây để đặt một cái tên mô tả rõ ràng.
Dọn Dẹp Flag Đã Hết Dùng Triệt Để
Feature flag trở thành nợ kỹ thuật ngay khi tính năng được triển khai đầy đủ. Sau khi rollout thành công, hãy xóa phần kiểm tra flag trong code, rồi archive flag trong Unleash. Đặt lời nhắc lịch 2 tuần sau một lần rollout để dọn dẹp. Tôi coi bất kỳ flag nào cũ hơn 3 tháng mà không có người phụ trách rõ ràng là ứng viên để dọn dẹp.
Sử Dụng Environments Đúng Cách
Hỗ trợ environment được tích hợp sẵn: development, staging, production. Sử dụng API token riêng cho từng environment. Flag được bật trong development không nên tự động bật trong production — giữ các trạng thái đó độc lập. Điều này nghe có vẻ hiển nhiên nhưng thường xuyên bị bỏ qua khi team đang chạy nhanh.
Sao Lưu Database
# Script backup đơn giản — thêm vào cron
docker compose exec unleash_db pg_dump -U unleash unleash > unleash_backup_$(date +%Y%m%d).sql
Định nghĩa flag là business logic. Mất chúng đồng nghĩa với việc phải vất vả tái tạo lại tính năng nào đang bật cho người dùng nào. Sao lưu hàng ngày, lưu trữ bên ngoài.
Health Check Endpoint
Unleash đi kèm endpoint /health — kết nối nó với hệ thống monitoring của bạn:
curl http://localhost:4242/health
# {"health":"GOOD"}
Kết nối nó với UptimeRobot, Grafana hoặc bất kỳ công cụ nào bạn đang dùng. Bạn muốn biết Unleash đang bị sập trước khi ứng dụng bắt đầu phục vụ flag lỗi thời.
Sự cố lúc 2 giờ sáng tôi mô tả ở đầu bài? Nếu Unleash đã chạy sẵn, đó sẽ chỉ là 10 giây tắt flag từ điện thoại — không phải 45 phút vật lộn với hotfix. Cài đặt chỉ mất vài phút. Phần khó hơn là xây dựng thói quen tạo flag trước khi push code rủi ro, không phải sau khi kênh Slack của bạn bắt đầu nháo nhào.
Bắt đầu với file Docker Compose phía trên. Thử toggle một flag trong dev tuần này. Đến khi bạn sẵn sàng cho production, quy trình này sẽ cảm thấy tự nhiên như thở.
