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.


Referências

0 Comentário