Feature Flags no Ruby on Rails
Feature Flags são uma poderosa técnica para controle de funcionalidades em produção, amplamente utilizada em aplicações modernas. Neste artigo, exploramos como aplicar essa estratégia no Ruby on Rails utilizando a gem Flipper – incluindo vantagens, desafios, estratégias de uso e boas práticas. O que são Feature Flags Feature Flags funcionam como “interruptores”…
Feature Flags são uma poderosa técnica para controle de funcionalidades em produção, amplamente utilizada em aplicações modernas. Neste artigo, exploramos como aplicar essa estratégia no Ruby on Rails utilizando a gem Flipper – incluindo vantagens, desafios, estratégias de uso e boas práticas.
O que são Feature Flags
Feature Flags funcionam como “interruptores” no código, determinando se uma funcionalidade estará ativa ou não. Elas permitem que novas funcionalidades sejam disponibilizadas de forma controlada, desacoplando o processo de deploy da liberação para os usuários finais.
Quando usar (ou não) Feature Flags
✅ Quando usar
- Testes em produção com usuários reais – valide novas funcionalidades em ambiente real antes do lançamento geral.
- Lançamentos controlados – habilite recursos gradualmente por grupos ou percentuais (canary release, rollout por fases).
- Flexibilidade de comportamento – alterne entre fluxos antigos e novos sem depender de novos deploys.
- Deploy contínuo – libere código com frequência sem expor imediatamente todas as funcionalidades.
🚫 Quando evitar
- Funcionalidades triviais ou sem impacto – a complexidade adicional pode não valer a pena.
- Sem estratégia de remoção – manter flags antigas acumula dívida técnica.
- Uso excessivo – muitas flags simultâneas tornam o código difícil de manter e testar.
Benefícios e Desafios
Benefícios
- ✅ Redução de riscos – desabilite rapidamente funcionalidades problemáticas.
- ✅ Experimentação (Testes A/B) – compare versões e colete métricas reais.
- ✅ Agilidade no desenvolvimento – favorece integração contínua e deploy frequente.
- ✅ Segmentação de recursos – personalize funcionalidades por tipo de usuário ou ambiente.
Desafios
- ⚠️ Código mais complexo – exige lógica condicional adicional.
- ⚠️ Dívida técnica oculta – flags não removidas dificultam a manutenção.
- ⚠️ Carga nos testes – é necessário cobrir os diferentes estados de cada flag.
Estratégias de Lançamento
🚀 Big Bang
Liberação total do recurso de uma só vez. Simples, mas arriscada. Ideal apenas para mudanças pequenas.
🌱 Liberação incremental
Publicação gradual. Permite ajustes com base em feedback real antes da liberação completa.
⚙️ Flags dinâmicas
Permite alternar comportamentos sem novo deploy:
if Flipper.enabled?(:nova_funcionalidade)
executar_novo_fluxo
else
executar_fluxo_antigo
end
🐦 Lançamento canário
Ativa para usuários específicos:
Flipper.enable(:nova_funcionalidade, user)
Flipper.enabled?(:nova_funcionalidade, user)
📊 Por percentual de usuários
Distribui a liberação proporcionalmente:
Flipper.enable_percentage_of_actors(:nova_funcionalidade, 25)
🧑💼 Rollout por grupo (ex: admins)
Flipper.register(:admins) { |actor| actor.role == 'admin' }
Flipper.enable_group(:nova_funcionalidade, :admins)
Implementando Feature Flags com a gem Flipper
Agora que você já entendeu os conceitos e estratégias de uso, vamos ver como aplicar Feature Flags no Ruby on Rails com a gem flipper
.
1. Adicionando o Flipper ao projeto
No seu Gemfile
:
gem 'flipper'
Depois:
bundle install
2. Criando e testando flags
Você pode criar e manipular flags diretamente no console Rails:
# Ativa a flag
Flipper.enable(:search)
Flipper.enabled?(:search)
true
# Desativa a flag
Flipper.disable(:search)
Flipper.enabled?(:search)
false
Essas flags agora podem ser usadas para condicionar funcionalidades na aplicação.
3. Usando a flag na aplicação
No controller, você pode ativar lógicas diferentes com base na flag:
class DashboardController < ApplicationController
def index
if Flipper.enabled?(:new_dashboard, current_user)
render :new_dashboard
else
render :old_dashboard
end
end
end
A flag pode ser verificada com ou sem um ator (current_user
) para permitir variações por usuário/grupo.
4. Armazenando flags com ActiveRecord
Para persistir as flags no banco de dados (ao invés de mantê-las apenas em memória), use:
rails g flipper:active_record
rails db:migrate
Isso cria as tabelas flipper_features
e flipper_gates
.
5. Interface de administração
Você pode incluir a interface web e a API REST com:
gem 'flipper-ui'
gem 'flipper-api'
Em config/routes.rb
:
mount Flipper::UI.app(Flipper) => '/flipper'
mount Flipper::Api.app(Flipper) => '/flipper/api'
A UI oferece uma visualização completa de todas as flags, e a API permite integração com ferramentas externas.
6. Usando cache para performance
gem 'flipper-active_support_cache_store'
Exemplo de configuração:
Flipper.configure do |config|
config.adapter do
Flipper::Adapters::ActiveSupportCacheStore.new(
Flipper::Adapters::ActiveRecord.new,
Rails.cache,
expires_in: 5.minutes
)
end
end
7. Ambiente de testes
Evite acessar o banco durante os testes:
Flipper.configure do |config|
config.adapter do
Rails.env.test? ? Flipper::Adapters::Memory.new : Flipper::Adapters::ActiveRecord.new
end
end
Conclusão
Feature Flags são uma ferramenta estratégica para times que buscam segurança, agilidade e controle na entrega de funcionalidades. Quando bem aplicadas, promovem experimentação, mitigação de riscos e personalização da experiência do usuário.
Seguindo boas práticas – como remoção de flags obsoletas, uso de cache, auditoria e integração com CI/CD – você garante uma implementação eficiente, escalável e sustentável.