Feature flags são uma poderosa técnica que permite controlar a disponibilidade de funcionalidades em tempo real. Vamos explorar como implementá-las de forma efetiva em seu ambiente de produção.
O que são Feature Flags?
Feature flags (ou feature toggles) são mecanismos que permitem:
- Ativar/desativar funcionalidades sem deploy
- Testar features com usuários específicos
- Fazer rollbacks rápidos em caso de problemas
- Implementar rollouts graduais
Tipos de Feature Flags
1. Por Ambiente
interface EnvironmentFlag { name: string; environments: { development: boolean; staging: boolean; production: boolean; }; default: boolean; }
2. Por Usuário
interface UserFlag { name: string; type: 'percentage' | 'specific' | 'custom'; rules: { percentage?: number; userIds?: string[]; customRule?: (user: User) => boolean; }; }
Implementação Prática
1. Estrutura Base
class FeatureFlagManager { private flags: Map<string, FeatureFlag>; constructor() { this.flags = new Map(); } isEnabled(flagName: string, context: FlagContext): boolean { const flag = this.flags.get(flagName); if (!flag) return false; return flag.evaluate(context); } async updateFlag(flagName: string, config: FlagConfig): Promise<void> { // Implementação da atualização } }
2. Integração com Backend
// Exemplo com Express app.use(async (req, res, next) => { const context = { userId: req.user?.id, environment: process.env.NODE_ENV, timestamp: Date.now() }; req.featureFlags = await featureFlagManager.getFlags(context); next(); });
Rollouts Graduais
1. Estratégias de Rollout
Um rollout gradual avança em estágios, ampliando a exposição à medida que a confiança aumenta. Uma progressão típica parte da feature pronta e segue assim:
- 5%, usuários beta, o primeiro grupo a receber a novidade.
- 25%, usuários ativos, com a feature já validada no grupo inicial.
- 50%, maioria dos usuários.
- 100%, disponibilização para toda a base.
Cada salto só acontece depois que as métricas do estágio anterior confirmam estabilidade.
2. Monitoramento
interface RolloutMetrics { flagName: string; totalUsers: number; enabledUsers: number; errorRate: number; performanceMetrics: { responseTime: number; errorCount: number; }; }
Ferramentas e Serviços
1. Self-hosted
-
🏠 Unleash
- Open source
- Controle total
- API REST
- Dashboard
-
🏢 Flagsmith
- SDKs para várias linguagens
- A/B testing
- Analytics
2. Cloud-based
-
☁️ LaunchDarkly
- Gerenciamento centralizado
- Analytics avançados
- Integrações prontas
-
🌐 Split.io
- Experimentação
- Segmentação avançada
- Monitoramento em tempo real
Boas Práticas
1. Nomenclatura
// Exemplos de nomes claros const FLAGS = { NEW_CHECKOUT_FLOW: 'new-checkout-flow-v2', DARK_MODE_BETA: 'dark-mode-beta-test', PAYMENT_GATEWAY_MIGRATION: 'payment-gateway-migration' };
2. Documentação
Cada flag merece uma ficha curta e padronizada. Para a new-checkout-flow-v2, por exemplo, a documentação cobriria:
- Descrição: implementação da nova versão do fluxo de checkout.
- Estados: Development habilitado, Staging habilitado, Production em rollout gradual (25%).
- Dependências: Payment Gateway v2 e Address Validation Service.
- Plano de rollout: 5% (beta), 25% (ativos), 50% (maioria), 100% (todos).
Esse registro evita que flags se tornem dívida técnica esquecida e dá contexto a quem precisa decidir avançar ou remover a flag.
Monitoramento e Alertas
1. Métricas Essenciais
interface FlagMetrics { name: string; enabledCount: number; totalRequests: number; errorRate: number; performanceImpact: { p50: number; p95: number; p99: number; }; }
2. Alertas
alerts: - name: high_error_rate condition: error_rate > 1% action: disable_flag - name: performance_degradation condition: p95 > 500ms action: notify_team
Casos de Uso
1. Rollout Seguro
O ciclo de um rollout seguro fecha um laço de feedback entre quatro atores. O desenvolvedor ativa a flag para uma fração inicial dos usuários (5%). A feature flag passa a alimentar o sistema de monitoramento com métricas de uso, erro e performance. O monitoramento compara esses números com os thresholds definidos e, sempre que algum limite é ultrapassado, o sistema de alertas notifica o desenvolvedor, que decide avançar o rollout ou reverter. É esse laço contínuo que torna a entrega incremental segura.
2. Rollback Rápido
async function handleError(flagName: string, error: Error) { // Desativa flag imediatamente await featureFlagManager.disable(flagName); // Notifica equipe await notifyTeam({ type: 'FLAG_ERROR', flagName, error: error.message, timestamp: new Date() }); // Registra métricas await metrics.recordRollback(flagName); }
Conclusão
Feature flags são essenciais para:
- Deploy seguro
- Testes em produção
- Rollbacks rápidos
- Experimentos controlados
- Monitoramento efetivo
Próximos Passos
- Escolha sua ferramenta
- Defina padrões de nomenclatura
- Implemente monitoramento
- Crie documentação
- Treine o time
Quer compartilhar sua experiência com feature flags? Deixe um comentário abaixo!
Leia também
- Feature Flags: Guia Completo para Releases Seguros
- Feature flags: ferramentas e o que considerar antes de adotar na empresa
- Feature flags em startups: as ferramentas que valem o investimento
- KV para rate limiting, feature flags e configuração distribuída: onde funciona e onde quebra
- Docker para Produção: Construindo Imagens Leves e Seguras
- Kubernetes em produção: o que ninguém conta antes de você migrar