Marcas de característica
Sugerencia
Este contenido es un extracto del libro electrónico “Architecting Cloud Native .NET Applications for Azure” (Diseño de la arquitectura de aplicaciones .NET nativas en la nube para Azure), disponible en Documentos de .NET o como un PDF descargable y gratuito que se puede leer sin conexión.
En el capítulo 1 hemos afirmado que la nube nativa tiene mucho que ver con la velocidad y la agilidad. Los usuarios esperan una rápida capacidad de respuesta, características innovadoras y tiempo de inactividad cero. Feature flags
son una técnica de implementación moderna que ayuda a aumentar la agilidad de las aplicaciones nativas de nube. Le permiten implementar nuevas características en un entorno de producción, pero restringen su disponibilidad. Con el movimiento rápido de un conmutador, puede activar una nueva característica para usuarios específicos sin reiniciar la aplicación ni implementar código nuevo. Separan el lanzamiento de nuevas características de su implementación de código.
Las marcas de características se compilan en la lógica condicional que controla la visibilidad de la funcionalidad para los usuarios en tiempo de ejecución. En los sistemas nativos de nube modernos, es habitual implementar pronto nuevas características en producción, pero probarlas con un público limitado. A medida que aumenta la confianza, la característica se puede implantar de forma incremental para un público más amplio.
Otros casos de uso de las marcas de características incluyen:
- Restringir la funcionalidad Premium a grupos de clientes específicos dispuestos a pagar honorarios de suscripción más altos.
- Estabilizar un sistema desactivando rápidamente una característica de problema, evitando los riesgos de una reversión o reparación inmediata.
- Deshabilitar una característica opcional con un consumo elevado de recursos durante los períodos de uso máximo.
- Llevar a cabo
experimental feature releases
en segmentos de usuario pequeños para validar la viabilidad y popularidad.
Las marcas de características también promueven el desarrollo trunk-based
. Se trata de un modelo de bifurcación de control de código fuente en el que los desarrolladores colaboran en características en una sola rama. El enfoque minimiza el riesgo y la complejidad de combinar un gran número de ramas de características de larga duración. Las características no están disponibles hasta que se activan.
Implementación de marcas de características
En su núcleo, una marca de característica es una referencia a un simple decision object
. Devuelve un estado booleano de on
o off
. La marca normalmente encapsula un bloque de código que encapsula una funcionalidad de característica. El estado de la marca determina si ese bloque de código se ejecuta para un usuario determinado. En la figura 10-11 se muestra la implementación.
if (featureFlag) {
// Run this code block if the featureFlag value is true
} else {
// Run this code block if the featureFlag value is false
}
Figura 10-11: implementación sencilla de la marca de características.
Observe cómo este enfoque separa la lógica de decisión del código de característica.
En el capítulo 1, analizamos Twelve-Factor App
. Las instrucciones recomendadas mantienen los valores de configuración como externos desde el código ejecutable de la aplicación. Cuando sea necesario, la configuración se puede leer desde el origen externo. Los valores de configuración de la marca de características también deben ser independientes de su código base. Al externalizar la configuración de la marca en un repositorio independiente, puede cambiar el estado de la marca sin modificar ni volver a implementar la aplicación.
Azure App Configuration proporciona un repositorio centralizado para las marcas de características. Con él define diferentes tipos de marcas de características y maneja sus estados de forma rápida y segura. Agregue las bibliotecas de cliente de App Configuration a la aplicación para habilitar la funcionalidad de marca de características. Se admiten varios marcos de lenguaje de programación.
Las marcas de características se pueden implementar fácilmente en un servicio de ASP.NET Core. La instalación de las bibliotecas de Administración de características de .NET y el proveedor de App Configuration le permite agregar marcas de características al código mediante declaración. Habilitan los atributos FeatureGate
para que no tenga que escribir manualmente instrucciones if en el código base.
Una vez configurado en la clase Startup, puede agregar la funcionalidad de marca de características en el nivel de controlador, acción o middleware. En la figura 10-12 se presenta la implementación del controlador y la acción:
[FeatureGate(MyFeatureFlags.FeatureA)]
public class ProductController : Controller
{
...
}
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult UpdateProductStatus()
{
return ObjectResult(ProductDto);
}
Figura 10-12: implementación de la marca de características en un controlador y una acción.
Si una marca de característica está deshabilitada, el usuario recibirá un código de estado 404 (no encontrado) sin cuerpo de respuesta.
Las marcas de características también se pueden insertar directamente en clases de C#. En la figura 10-13 se muestra la inserción de marcas de características:
public class ProductController : Controller
{
private readonly IFeatureManager _featureManager;
public ProductController(IFeatureManager featureManager)
{
_featureManager = featureManager;
}
}
Figura 10-13: inserción de marcas de características en una clase.
Las bibliotecas de Administración de características administran el ciclo de vida de la marca de características en segundo plano. Por ejemplo, para minimizar el número elevado de llamadas al almacén de configuración, las bibliotecas almacenan en caché los estados de la marca durante una duración especificada. Pueden garantizar la inmutabilidad de los estados de marca durante una llamada de solicitud. También ofrecen un Point-in-time snapshot
. Puede reconstruir el historial de cualquier clave-valor y proporcionar su valor pasado en cualquier momento dentro de los siete días anteriores.