Feature flags sem deploy

Engineering

Certos valores do seu código não têm por que estar no código.

O texto do banner da página inicial. O percentual de desconto da promoção de verão. A flag que esconde um checkout pela metade de todo mundo, menos da sua equipe. Cada um desses é uma mudança de uma linha que custa um pull request, um review, uma execução de CI e um deploy. E quem de fato quer a mudança em geral não consegue fazê-la sozinho.

A Configuração remota é um armazenamento chave-valor, e a ideia é essa

O módulo Configuração remota do Kookee guarda qualquer valor serializável em JSON sob uma chave e o devolve pelo mesmo SDK do resto do seu conteúdo:

TypeScript
const flag = await kookee.config.getByKey('feature-new-checkout');

if (flag.value === true) {
  // novo checkout
}

Os valores não se limitam a booleanos, e é aí que a coisa fica útil. Uma configuração inteira de interface cabe numa chave:

TypeScript
const banner = await kookee.config.getByKey('homepage-banner');
// { text: 'Promoção de verão!', enabled: true, color: '#ff6b00' }

Ou uma regra de negócio que o seu time financeiro quer controlar:

TypeScript
const discount = await kookee.config.getByKey('pricing-discount');
// { percentage: 20, minOrderValue: 50 }

Busque o que precisa numa chamada só

Buscar as chaves uma por uma a cada carregamento de página é o erro óbvio. list() aceita um filtro de chaves:

TypeScript
const configs = await kookee.config.list({
  keys: ['homepage-banner', 'feature-new-checkout', 'pricing-discount'],
});

Uma requisição, três valores. Busque uma vez por renderização no servidor, ou uma vez na inicialização do app no cliente, e repasse para os componentes. Cada leitura de configuração é uma chamada de API que conta na sua cota mensal de requisições. No plano gratuito são 100.000 requisições por mês, então cache aqui não é otimização prematura: é o jeito normal de usar.

O histórico de versões é a rede de segurança

Editar direto em produção só é tranquilo se errar sai barato. Cada mudança de configuração no Kookee cria um snapshot, e qualquer versão dos últimos 30 dias volta com um clique.

Isso muda o risco de entregar uma chave a quem não é engenheiro. O pior caso de um desconto digitado errado não é um incidente com deploy de hotfix. É um rollback no painel, feito pela mesma pessoa que fez a mudança, nos dez segundos depois de ela perceber.

Pelo mesmo motivo, as descrições importam mais do que parece. enable-v2 não diz nada para quem herdar a chave daqui a seis meses. Escreva a descrição quando criar a chave.

Onde a Configuração remota para

A Configuração remota é simples de propósito: uma chave, um valor e o histórico. Ela não faz rollout por porcentagem, segmentação por usuário nem divisão de testes A/B. Se você precisa mostrar um recurso para 5% dos usuários na Alemanha, o que você quer é uma plataforma de experimentação dedicada, e vale usar uma.

O que a Configuração remota cobre é o caso bem mais comum: um valor global que a sua equipe precisa mudar sem publicar código. Isso é a maioria das flags, na maior parte do tempo. E a flag fica ao lado dos seus posts de blog, artigos de ajuda e registro de alterações, com a mesma chave de API, em vez de virar um quarto fornecedor no seu stack.

Um caminho razoável é manter um valor padrão no código e deixar a Configuração remota sobrescrevê-lo:

TypeScript
let showNewCheckout = false;

try {
  const flag = await kookee.config.getByKey('feature-new-checkout');
  showNewCheckout = flag.value === true;
} catch {
  // falha de rede: mantém o padrão seguro
}

Agora a flag é remota, e se a API estiver fora do ar, o app fica com o comportamento seguro de antes, em vez de lançar uma exceção na página de checkout.