
Flags que conversam: evitando conflitos em cadeias de microserviços com dependências recursivas
Como a nova engine de dependência entre flags do Useflagly resolve o caos das migrações complexas direto na camada de avaliação, eliminando o acoplamento de condicionais no seu código.
Imagine o cenário: seu time está liderando uma migração de banco de dados crítica. Para reduzir o risco, vocês criaram uma flag novo-banco-de-dados. Paralelamente, outra equipe desenvolveu a feature de busca-inteligente, que só funciona se os dados já estiverem sendo gravados e consumidos na nova infraestrutura. Se a busca-inteligente for ativada sem o novo-banco-de-dados, a aplicação quebra e o sistema entra em colapso. No modelo tradicional, você precisaria injetar múltiplos blocos condicionais aninhados no seu código ou orquestrar requisições sequenciais lentas via rede. Esse acoplamento temporal gera o temido 'nested if hell' e joga a manutenibilidade da sua arquitetura de microserviços no lixo.
A anatomia de uma decisão encadeada: do scenario ao validation rule
No Useflagly, estruturamos os domínios usando a hierarquia Scenario > Flow > FlowPart > Flag. Toda a inteligência de tomada de decisão e validação de regras é isolada de forma rígida nas Flags. Com o recurso de Flag Dependency, uma regra de validação (Validation Rule) pode referenciar dinamicamente outra flag existente como pré-requisito obrigatório. Para liberar a flag busca-inteligente, a engine do Useflagly verifica se a flag novo-banco-de-dados avalia como verdadeira para aquele contexto de usuário específico. Se a dependência falhar, a engine interrompe a árvore de decisão imediatamente e retorna o valor de fallback seguro. Tudo isso ocorre recursivamente e de forma transparente.

import { UseflaglyClient } from '@useflagly/sdk-javascript';
// Inicialização leve do SDK da Useflagly
const flagly = new UseflaglyClient({
apiKey: process.env.USEFLAGLY_API_KEY!,
environment: 'production'
});
async function handleSearchRequest(userId: string, tenantId: string) {
// O dev avalia apenas a flag de interesse final.
// A dependência complexa com a flag 'novo-banco-de-dados'
// é resolvida automaticamente de forma recursiva pela engine da Useflagly.
const isSmartSearchEnabled = await flagly.evaluate('busca-inteligente', {
identifier: userId,
attributes: {
tenant: tenantId,
tier: 'enterprise'
}
});
if (isSmartSearchEnabled) {
// Lógica segura: garantido que o novo banco de dados está ativo
// E a busca inteligente está liberada para este tenant.
return executeSmartSearchQuery();
}
// Fallback seguro usando o banco de dados estável antigo
return executeLegacySearch();
}
Consolidando árvores de decisão sem roundtrips adicionais
Chamar sequencialmente múltiplos endpoints para avaliar se cada micro-serviço e sua respectiva flag estão de pé é um suicídio de latência. Da mesma forma, enviar todas as regras brutas de decisão para o cliente interpretar localmente expõe segredos comerciais e vulnerabiliza a aplicação. A engine de avaliação do Useflagly compila essas dependências em um Grafo Acíclico Direcionado (DAG) otimizado. Quando uma avaliação é disparada, o grafo é resolvido em uma única rodada lógica na nossa borda de alto desempenho. O resultado final é entregue de forma consolidada e instantânea para a sua aplicação, preservando a largura de banda e garantindo tempos de resposta sub-milissegundo para o usuário final.

⚠️ Atenção: Dependências circulares (Flag A depende de B, que por sua vez depende de A) são interceptadas e bloqueadas diretamente no painel de controle do Useflagly em tempo de configuração. Isso impede loops infinitos em produção e garante a previsibilidade matemática de toda a sua árvore de regras de negócio.
🚩 useflagly.com.br

