O que é um “sinalizador de recurso”?

115

Alta escalabilidade menciona sinalizadores de recursos aqui:

5 coisas tóxicas para a escalabilidade , "5. Falta de sinalizadores de recursos"

O que exatamente são sinalizadores de recursos?

GurdeepS
fonte
1
Como Maxim Vexler aponta, esta postagem do Flickr é um dos primeiros artigos canônicos sobre sinalizadores de recursos e explica seu uso e implementação em alguns detalhes code.flickr.com/blog/2009/12/02/flipping-out
Noah Sussman

Respostas:

104

Um 'sinalizador de recurso' (ou Alternância de recurso ) é a capacidade de ativar / desativar recursos (subseções) de seu aplicativo facilmente:

  • talvez por meio de uma nova implantação ou
  • alguma página interna onde páginas / recursos podem ser ativados.

Acho que o exemplo foi que é útil ter o controle para reduzir um pouco o conjunto de recursos se você precisar, digamos, reduzir as consultas de banco de dados se a carga estiver muito alta.

Existem muitos outros motivos pelos quais você gostaria de usar isso - um dos principais é habilitar a Entrega Contínua : colocar coisas em produção / ao vivo, mas com o recurso desabilitado / alternado até que seja concluído. Freqüentemente usamos o que chamamos de 'cookie de desenvolvimento' para mostrar recursos incompletos apenas para a equipe de desenvolvimento. Dessa forma, podemos testar o trabalho parcialmente concluído na produção (oh yeh! Existe uma integração melhor?) Em várias versões / implantações antes de 'desmarcá-lo' (concluí-lo) e se tornar visível para o público.

Aqui está um pacote simples que ajuda você a fazer isso no terreno da ASP.NET MVC: https://github.com/cottsak/DevCookie (divulgação completa: eu sou o autor)

Fowler também tem um artigo muito mais longo do que o link acima, com muito mais detalhes .

Esta postagem (também no site de Fowler) explica os vários tipos de estratégias de alternância . O DevCookie suporta a estratégia baseada em linha principal / tronco e é chamado de " Release Toggle " no artigo.

A resposta de Adil destaca que há muitos termos e motivos pelos quais você pode querer uma parte dessa infraestrutura. Lembre-se de que você só precisa de algumas dessas coisas. Por exemplo, posso querer apenas habilitar um fluxo de trabalho de implantação / entrega simples e ágil e, portanto, uma infraestrutura simples será suficiente. Se você decidir que deseja passar para a experimentação #leanstartup completa com A / B, testes de coorte e coisas como implementação controlada, você deve considerar uma ferramenta de análise (por exemplo, Heap ) que facilita essas metodologias de desenvolvimento baseadas em dados como uma solução distinta . Uma infraestrutura alternada que faz todos os itens acima resultará em inchaço e complexidade desnecessária.

Se você chegou até aqui, talvez queira dar uma olhada em algumas de minhas outras idéias sobre desenvolvimento de linha principal, alternância de recursos e outras ideias tolas como TEST, QA, SIT, STAND, CROUCH .

Matt Kocaj
fonte
1
Curiosamente, sempre imaginei a mesma coisa em tudo o que construo. Esse pode ser um recurso muito eficaz.
GurdeepS,
7
Freqüentemente, você encontrará coisas assim que parecem óbvias. Acontece que alguém sempre inventou um nome para isso.
Matt Kocaj
27

Feature Flag é uma técnica para desligar alguma funcionalidade de seu aplicativo, via configuração, sem implantar novo código.

Os sinalizadores de recursos desempenham um papel fundamental no esquema de CI, em que os recursos são implantados constantemente, mas não necessariamente "liberados" na produção.

Mais informações aqui:

- EDITAR:

Implementação de sinalizadores de recurso java .

Maxim Veksler
fonte
3
Isso está bem descrito em 'Implementação Contínua' e é praticamente um requisito para o desenvolvimento de 'linha principal'. Em vez de ramificar no SCM para obter recursos, os recursos são ativados ou desativados, permitindo que você libere o código com recursos que ainda não deveriam estar habilitados.
Chip McCormick
Apenas uma observação sobre "via configuração, sem implantar novo código": parece que a instrução significa alterar uma configuração e, em seguida, implantar o aplicativo novamente (mesmo que talvez nenhum código tenha sido alterado). Isso ainda pode levar de segundos a minutos, dependendo do pipeline de implantação. Um sinalizador de recurso ou alternância de recurso não pode ser persistido na configuração. Pode estar em uma loja / banco de dados em algum lugar e se comportar de maneira "ao vivo" - ou seja, navegar para alguma página de administração onde você clica em um botão para habilitar algum comportamento em todo o site instantaneamente (sem implantação, sem alteração de configuração).
Matt Kocaj
1
Eu trabalho para ConfigCat.com e da maneira que vejo "alterar uma configuração, sem implantar novo código" significa que as configurações são servidas pelo serviço de sinalizador de recurso e seu aplicativo acessa os valores puxando esse arquivo de configuração. Dessa forma, você pode ter certeza de que a alteração de um valor não exige nenhum tipo de reimplantação do aplicativo. Além disso, permite que você crie regras para servir um valor a um usuário e um valor diferente a outro. Legal é toda a avaliação do sinalizador de recurso do lado do cliente e toda essa lógica funciona sem a necessidade de enviar quaisquer dados de volta para o serviço de sinalizador de recurso.
sige
techblog.outbrain.com/tag/feature-flags - O URL não está funcionando
Sathish
19

Sinalizadores de recursos, alternadores de recursos, experimentos e implementações controladas são sinônimos para uma ideia simples, mas poderosa: implementações de código separadas de implementações de recursos. Falando francamente, é a capacidade de enviar os compromissos de seu recurso para a produção enquanto escolhe quem entre seus clientes - se houver alguém - pode ver esse recurso.

Eles foram popularizados em parte pelo Gatekeeper do Facebook . O LiX do LinkedIn é outro bom exemplo.

Abraçar esta ideia simples estabelece a base para muitas práticas recomendadas, incluindo:

Implantação / entrega contínua - vários envios de código para produção em um dia.

Desenvolvimento de tronco / linha principal - ramificações de recursos devem ser criadas apenas para solicitações pull, não para desenvolvimento de recursos de longa duração.

Não há mais trens de liberação para atolar as coisas.

Teste de QA / Perf na produção - o teste real de QA e desempenho é feito na infraestrutura de produção com tráfego de produção. Não perca tempo construindo laboratórios de desempenho extensos e ambientes de preparação.

Experimentação - saiba como um novo recurso move a agulha em seus KPIs.

Evitando hotfixes ou reversões de código quando problemas acontecem - ambos os hotfixes e reversões de código são estressantes, demoram muito e levam a mais problemas do que o necessário. Em vez disso, desative o recurso ou reduza-o.

Outros mencionaram bibliotecas de código aberto. Um bom exemplo de uma solução completa - como Gatekeeper e LiX - é Split . Eu trabalho para Split.

Adil Aijaz
fonte
Acho que é importante não confundir sinalizadores de recursos apenas para oferecer suporte aos experimentos CI versos AB / coorte / lean - os objetivos são diferentes. Por exemplo, usar um alternador de recurso para colocar algo no Prod para QA / aceitação pode ser uma ferramenta simples para auxiliar CI / CD e, nesse caso, Dividir pode ser um exagero. Então, novamente, se você quiser fazer experimentos enxutos ou testes A / B, então você possivelmente precisa de uma boa ferramenta de análise como Heap com as ferramentas adicionais e relatórios de telemetria integrados. Não gosto da ideia de combinar esses dois objetivos - parece que você poderia inchar muito facilmente.
Matt Kocaj
14

Há muitas respostas excelentes aqui, todas direcionadas à importante definição básica popularizada na postagem de Martin Fowler :

São trechos de código que "permitem que as equipes modifiquem o comportamento do sistema sem alterar o código".

Portanto, historicamente pensamos neles como representados pelo pseudocódigo:

if(app_settings["beta-mode"] == "true")
  showAwesomeNewGui();
else
  sameOldSnoozeFeset();

Essa é uma maneira totalmente precisa de pensar nisso, e Matt e Adil a expandem muito bem com uma variedade de casos de uso tático para o sinalizador de recurso.

Mas eu gostaria de oferecer uma definição revisada que reflete como a realidade evoluiu nos seis anos e mudou desde que o dotnetdev fez a pergunta original. Eu trabalho para Rollout.io , uma plataforma de bandeira de recursos, então eu tive um assento na primeira fila para esta evolução.

Simplificando, os sinalizadores de recursos não são mais apenas uma forma de ativar e desativar partes da funcionalidade em seu aplicativo. É como responder "o que é um item de linha de fatura" dizendo "é uma descrição e um valor monetário". É verdade, mas não leva ao ponto mais amplo da própria fatura.

Sinalizadores de recursos são as partes táticas de uma solução estratégica abrangente em software moderno. Eles são os meios pelos quais você adia a lógica de decisão importante em seu código até o tempo de execução, quando você tem mais informações. E, talvez o mais importante, eles não ocorrem mais isoladamente, com uma única verificação para ver se o número da versão é maior que 2.7 ou não; as organizações que os usam geralmente os incluem como parte de uma abordagem de produto abrangente e abrangente.

Como outros já mencionaram, o Facebook e o LinkedIn foram os pioneiros nisso, mas em 2018, muitas organizações estão fazendo isso. Eles estão adiando perguntas de lógica de decisão para o tempo de execução como parte da estratégia de desenvolvimento, estratégia de operações (ou estratégia DevOps, se você quiser) e estratégia de produto. Aqui estão alguns exemplos de tais questões.

  • Quem deve ver a nova tela de administrador que estamos lançando e quando?
  • Qual nível de assinatura é necessário para desbloquear este ovo de Páscoa?
  • Quando devemos mudar para o novo banco de dados?
  • Devemos colocar uma imagem de uma chita ou uma águia no botão de checkout para aumentar as conversões?

Para ter um aplicativo que adia um número significativo de tais decisões até o tempo de execução, você não pode lançar sinalizadores de recursos em seu aplicativo de forma ad-hoc ou vai se enterrar em dívidas técnicas. Você precisa, atualmente, ter uma estratégia abrangente de gerenciamento de sinalizadores de recursos, que inclui alguns componentes diferentes.

  • Os pontos de alternância são usados ​​para alternar o comportamento de novos recursos.
  • Vários pontos de alternância se unem para formar um roteador de alternância . Um roteador de alternância determina o estado de um recurso.
  • O contexto de alternância fornece ao roteador de alternância as informações contextuais necessárias (por exemplo, usuário específico).
  • A configuração de alternância fornece as informações do roteador de alternância sobre o ambiente.

Então, no final das contas, o que são sinalizadores de recursos?

Bem, eles são uma parte importante de uma estratégia mais ampla para ter um aplicativo que se adapta às necessidades técnicas e de mercado.

Erez Rosovsky
fonte
9

Um sinalizador de recurso (também conhecido como inversão de recurso ou alternância de recurso ) é uma chave para habilitar ou desabilitar um recurso potencialmente caro conforme necessário (como, digamos, quando um site está sendo atacado com tráfego inesperado). Isso vai lhe dar um pouco de tempo até aumentar a escala ou até que o pico de carga vá embora.

Aqui está um exemplo da documentação SWIG .

Michael Petrotta
fonte
6
Esse é um uso dos sinalizadores de recurso, sim, mas o grande conceito a ser entendido é que eles desacoplam o lançamento de recursos e a implantação de código, de modo que você possa liberar recursos quando quiser, em vez de quando o código for enviado. É a base da integração contínua.
Eric Elliott,
6

Na minha empresa tínhamos uma solução própria para isso. Criamos um serviço que fornece um .jsonarquivo config ( ) para download para todos os aplicativos. Nessa configuração, armazenamos os sinalizadores para os recursos. Com base nessa configuração, o aplicativo pode mostrar ou ocultar o recurso atual. (Por exemplo, mostrar ou ocultar um item de menu na barra lateral).

Também criamos uma página de administração interna onde podemos configurar os sinalizadores de recurso. Funcionou muito bem por um tempo, mas depois disso gostaríamos de fazer a segmentação do usuário e os testes A / B. Para desenvolver por conta própria Parecia muito esforço, então escolhemos uma solução de terceiros. Como já mencionado aqui, existem muitas soluções para isso.

Escolhemos o ConfigCat porque ele oferece suporte a grupos-alvo personalizados e distribuição baseada em porcentagem de uma só vez. Você pode verificar os sdks de código aberto compatíveis no github .

seg
fonte
4

Sinalizadores de recursos (ou alternadores de recursos) permitem que você habilite recursos remotamente em um aplicativo sem a necessidade de reconstruir / reimplantar o aplicativo. Isso permite que você implante o código para produção, mas não libere o recurso até que esteja pronto. Você é capaz de atingir usuários específicos, então você pode habilitar um novo recurso para seus usuários beta testarem.

Em nossa empresa, usamos anteriormente o LaunchDarkly e outras sugestões do FeatureFlags.io . Também tentamos usar a configuração remota do Firebase para tentar fazer isso funcionar, mas descobrimos que não era adequado para esse propósito.

Acabamos desenvolvendo nossa própria versão chamada Bullet Train , cujo código-fonte foi aberto. Ele combina sinalizadores / alternadores de recursos e configuração remota.

TStu
fonte
4

Sinalizadores de recurso são usados ​​para diversos fins. A ideia geral é delegar o controle sobre qual usuário vê qual recurso para algum painel remoto ou back-office de algum tipo.

Depois que um recurso é sinalizado no código, você pode usar vários métodos para determinar qual usuário o vê em seu aplicativo: 1. Ativado / Desativado - mostra o recurso para todos ou nenhum dos seus usuários. 2. Liberação gradual - mostre o recurso apenas para uma porcentagem de seus usuários e, em seguida, mostre-o gradualmente para todos os usuários. 3. Direcionamento - mostra o recurso para usuários específicos com base nas propriedades ou características desse usuário.

As ferramentas que ajudam no controle de sinalizadores de recursos (booleanos) e configurações de recursos (strings, números, etc.) são geralmente chamadas de Plataformas de gerenciamento de recursos. Há um ótimo serviço para gerenciamento de recursos chamado Configz.io

Mônadas são como ...
fonte
3

Do ponto de vista da codificação, um sinalizador de recurso pode ser tão simples quanto uma ifinstrução que envolve um novo trecho de código que você está escrevendo. Quando a ifinstrução for avaliada como verdadeira (o sinalizador de recurso está ativado), o novo código será executado.

Em um exemplo real de entrega de software, a ifdeclaração descrita acima seria avaliada de maneira diferente dependendo do ambiente em que o software está sendo executado. Por exemplo, se o aplicativo estiver sendo executado em seu servidor de QA, o sinalizador de recurso retornará verdadeiro e o novo recurso será visto. Se estiver sendo executado em seu servidor de produção, o sinalizador de recurso retornará falso e o recurso ficará oculto.

De minha experiência pessoal durante minha carreira, usei sinalizadores de recursos das seguintes maneiras:

  1. Desacoplamento das implantações de código da liberação de recursos para os clientes. Este foi meu primeiro uso inicial de sinalizadores de recursos em nosso processo de desenvolvimento. Nós o usamos para remover a dependência entre nossa equipe de marketing e produto e a equipe de engenharia que fazia o desenvolvimento e os lançamentos. Sinalizadores de recursos nos permitiram implantar nosso código semanas antes de um lançamento, ao passo que, anteriormente, estávamos implantando código na noite anterior ao lançamento!

  2. Teste em produção. Antes de usarmos sinalizadores de recurso quando lançamos nosso código, era um evento tudo ou nada, ou todos os nossos clientes tinham o recurso ou nenhum deles. Usamos sinalizadores de recursos para nos permitir lançar um novo recurso para uma pequena porcentagem dos usuários de cada vez. Isso nos permitiu coletar feedback e dados valiosos sobre um novo recurso sem arriscar quaisquer problemas potenciais para toda a base de clientes.

  3. Ativando / desativando um recurso por ambiente no ciclo de vida de desenvolvimento. Usamos isso extensivamente no desenvolvimento para permitir um processo de implantação muito mais suave - temos um pipeline de CI / CD no qual o uso de sinalizadores de recursos é vital.

  4. Criando um interruptor kill. Encapsulamos certos recursos de nosso aplicativo com um sinalizador de recurso que nos permite 'eliminar' esse recurso no caso de qualquer problema que estivermos tendo com o aplicativo no momento. Por exemplo, se nos encontrarmos sob uma carga pesada, podemos desligar alguns recursos não essenciais do site para ajudar com o problema.

Você pode ler mais sobre sinalizadores de recursos aqui.

Você pode adicionar sinalizadores de recurso ao seu código de várias maneiras.

  1. Você pode criar o seu próprio ou usar uma biblioteca de sinalizador de recurso de terceiros e adicionar seus dados de sinalizador de recurso em um arquivo de configuração que pode ser incluído em seu pacote de implantação.
  2. Você pode criar o seu próprio ou usar uma biblioteca de sinalizadores de recursos de terceiros e adicionar seus dados de sinalizadores de recursos a um arquivo de configuração que pode ser carregado em tempo de execução.
  3. Você pode usar um serviço de gerenciamento de sinalizador de recurso baseado em nuvem para gerenciar todas as suas necessidades de sinalizador de recurso para você.

Escrever sua própria biblioteca pode parecer uma boa ideia no início e geralmente pode começar dessa forma. No entanto, você logo terá problemas quando quiser implementar os casos de uso mais avançados de sinalizadores de recursos, como a distribuição para uma porcentagem de usuários ou a segmentação de grupos de usuários específicos. Outro problema com a criação de sua própria implementação de sinalizador de recurso é se você estiver usando vários idiomas, precisará implementar seu código várias vezes.

A maneira melhor e mais fácil de usar sinalizadores de recurso é usar um serviço de gerenciamento de sinalizador de recurso online, como o Floodgate . Dessa forma, você pode alavancar na plataforma todo o trabalho pesado, o que permite que você se concentre na criação do recurso para sua aplicação.

Aqui está um exemplo de como adicionar um sinalizador de recurso do Floodgate a um aplicativo usando o .NET SDK.

using FloodGate.SDK;

var floodgateClient = new FloodGateClient("API-KEY");

var flag = floodgateClient.GetValue("a-new-feature", false);

if (flag)
{
  // Execute the code for my new feature here...
}

Se você estiver trabalhando em uma equipe de desenvolvimento e não estiver usando sinalizadores de recursos e estiver tendo problemas em implantações e gerenciamento de código dentro da equipe. Usar sinalizadores de recursos pode ser uma ótima maneira de resolver esses problemas. Há também um bom efeito colateral de sinalizadores de recursos que aceleram a velocidade de desenvolvimento de suas equipes.

Martin Fowler fornece uma descrição detalhada dos sinalizadores de recursos aqui, que recomendo que você leia.

Eugene
fonte
2

Meu entendimento é que os sinalizadores de recurso ajudam a bloquear a funcionalidade ao decidir quais usuários receberão determinados recursos.

Por exemplo, digamos que você só deseja que seus usuários beta vejam um novo recurso. Você "ativaria" esse recurso para usuários beta e o restante de seus usuários não o veria.

LDUser user = new LDUser("[email protected]");

boolean showFeature = ldClient.toggle("your.feature.key", user, false);

if (showFeature) {
     // application code to show the feature 
 }
else {
     // the code to run if the feature is off
 }

Estou testando os sinalizadores de recursos do LaunchDarkly para alguns testes JS A / B de front-end - parece estar funcionando bem. Você também pode verificar este site para alternar entre recursos e bibliotecas de sinalizadores de recursos .

Hbitspark
fonte
1

Sinalizadores de recurso basicamente oferecem a capacidade de ativar e desativar um recurso sem fazer nenhuma alteração no código ou lançar uma nova versão. É uma solução importante especialmente para desenvolvedores de aplicativos móveis, uma vez que eles não têm controle sobre os usuários para atualizar seus aplicativos para uma nova versão.

Existem várias empresas que oferecem este serviço para desenvolvedores de aplicativos móveis.

OFK
fonte
Desconfie deles. Você não precisa integrar um desses serviços para criar um switch simples que pode ser usado para ocultar vários recursos da visibilidade / integração do PROD. Você também não precisa necessariamente fazer isso ao vivo - por exemplo, esperar por uma implantação não é um grande problema quando uma implantação do PROD leva apenas alguns minutos (que você deve otimizar por muitos outros motivos).
Matt Kocaj
2
Como uma adição aqui é uma comparação dos melhores serviços de bandeira característica atual: featureflagservices.io
sige
1

Na minha empresa, usamos sinalizadores de recurso para cada novo recurso que apresentamos em nosso aplicativo SaaS. Além dos benefícios de desempenho, também nos permite lançar novos recursos gradualmente - introduzindo novos recursos para usuários avançados primeiro, obtendo feedback deles e improvisando antes que possamos distribuí-los para todos os usuários.

Também nos permite personalizar a oferta para usuários individuais - usuários avançados desejam todos os recursos; usuários simples podem querer apenas o material básico e podem ficar confusos com todos os recursos complexos e poderosos. Também permite que nossa equipe de vendas faça vendas adicionais.

E, claro, como outros apontaram, se descobrirmos que um recurso está causando uma degradação do desempenho, podemos simplesmente desligar esse recurso (para todos os clientes ou para o cliente que está causando o problema).

Dharmendar Kumar 'DK'
fonte