Patrón External Configuration Store

Azure App Configuration
Azure Blob Storage

Extrae la información de configuración del paquete de implementación de la aplicación y la lleva a una ubicación centralizada. Este patrón puede proporcionar oportunidades para facilitar la administración y el control de los datos de configuración y para compartir los datos de configuración entre aplicaciones e instancias de aplicación.

Contexto y problema

La mayoría de los entornos de tiempo de ejecución de aplicaciones incluyen información de configuración que está contenida en los archivos implementados con la aplicación. En algunos casos, es posible editar estos archivos para cambiar el comportamiento de la aplicación después de que se ha implementado. Sin embargo, los cambios en la configuración requieren volver a implementar la aplicación, lo que suele dar lugar a un tiempo de inactividad inaceptable y más sobrecarga administrativa.

Los archivos de configuración local también limitan la configuración a una única aplicación, pero en ocasiones sería útil compartir los valores de configuración entre varias aplicaciones. Algunos ejemplos incluyen cadenas de conexión de base de datos, información de temas de interfaz de usuario o las direcciones URL de las colas y el almacenamiento que e usan en un conjunto relacionado de aplicaciones.

Administrar los cambios en las configuraciones locales entre varias instancias en ejecución de la aplicación puede resultar difícil, en especial en escenarios hospedados en la nube. Puede dar lugar a instancias que usan distintos valores de configuración mientras se implementa la actualización.

Además, las actualizaciones de aplicaciones y componentes pueden requerir cambios en los esquemas de configuración. Muchos sistemas de configuración no admiten diferentes versiones de la información de configuración.

Solución

Almacene la información de configuración en almacenamiento externo y proporcione una interfaz que puede usarse para leer y actualizar de manera rápida y eficaz los valores de configuración. El tipo de almacén externo depende del entorno de hospedaje y de tiempo de ejecución de la aplicación. En un escenario hospedado en la nube, suele ser un servicio de almacenamiento basado en la nube o un servicio de configuración dedicado, pero podría ser una base de datos hospedada u otro sistema personalizado.

La memoria auxiliar que elija para la información de configuración debe tener una interfaz que proporcione acceso coherente y fácil de usar. Debe exponer la información en un formato estructurado y correctamente escrito. Puede que también la implementación deba autorizar el acceso de los usuarios con el fin de proteger los datos de configuración y ser lo suficientemente flexible como para permitir el almacenamiento de varias versiones de la configuración (por ejemplo, desarrollo, ensayo o producción, incluidas varias versiones de cada opción).

Muchos sistemas de configuración integrados leen los datos cuando se inicia la aplicación y los almacenan en caché en memoria para proporcionar acceso rápido y minimizar el impacto en el rendimiento de la aplicación. Según el tipo de memoria auxiliar usado y la latencia de este almacén, podría resultar útil implementar un mecanismo de almacenamiento en caché en el almacén de configuración externo. Para obtener más información, consulte Caching Guidance(Guía de almacenamiento en caché). La ilustración muestra información general sobre el patrón de almacén de configuración externo con caché local opcional.

An overview of the External Configuration Store pattern with optional local cache

Problemas y consideraciones

Tenga en cuenta los puntos siguientes al decidir cómo implementar este patrón:

Elija una memoria auxiliar que ofrezca unos niveles aceptables de rendimiento, alta disponibilidad y solidez y que se pueda copiar como parte del proceso de administración y mantenimiento de la aplicación. En una aplicación hospedada en la nube, el uso de un mecanismo de almacenamiento en la nube o un servicio de plataforma de configuración dedicado suele ser una buena elección para satisfacer estos requisitos.

Diseñe el esquema de la memoria auxiliar que permita flexibilidad en los tipos de información que puede contener. Asegúrese de que proporciona todos los requisitos de configuración, como datos con tipo, colecciones de valores de configuración, varias versiones de configuración y otras características que requieren las aplicaciones que lo usan. El esquema debe ser fácil de extender para admitir valores de configuración adicionales a medida que cambien los requisitos.

Tenga en cuenta las funcionalidades físicas de la memoria auxiliar, cómo se relaciona con la manera en que se almacena información de configuración y los efectos en el rendimiento. Por ejemplo, para almacenar un documento XML que contiene información de configuración, será necesario que la interfaz de configuración o la aplicación analicen el documento con el fin de leer los valores de configuración individuales. Como resultado, la actualización de un valor de configuración será más complicada, aunque el almacenamiento en caché de la configuración puede ayudar a compensar el rendimiento más lento de lectura.

Tenga en cuenta cómo la interfaz de configuración permitirá controlar el ámbito y la herencia de los valores de configuración. Por ejemplo, podría ser un requisito extender el ámbito de la configuración a la organización, la aplicación y el nivel de máquina. Podría ser necesario permitir la delegación del control sobre el acceso a diferentes ámbitos, e impedir o permitir que aplicaciones individuales invaliden la configuración.

Asegúrese de que la interfaz de configuración pueda exponer los datos de configuración en el formato necesario, como valores con tipo, colecciones, pares de claves-valor o contenedores de propiedades.

Considere como se comportará la interfaz del almacén de configuración cuando los valores de configuración contengan errores o no existan en la memoria auxiliar. Puede que sea adecuado devolver los valores de configuración predeterminados y registrar los errores. Tenga en cuenta también aspectos como la distinción entre mayúsculas y minúsculas de las claves o los nombres de los valores de configuración, el almacenamiento y la administración de datos binarios y las maneras en que se administran los valores nulos o vacíos.

Considere como proteger los datos de configuración para permitir el acceso solo a las aplicaciones y los usuarios adecuados. Aunque esta es probablemente una característica de la interfaz del almacén de configuración, también es necesaria para garantizar que no se puede tener acceso directo a los datos de la memoria auxiliar sin el permiso adecuado. Asegúrese de que exista una separación estricta entre los permisos necesarios para leer y escribir datos de configuración. Considere también si debe cifrar algunos o todos los valores de configuración y cómo se implementará esto en la interfaz del almacén de configuración.

Las configuraciones almacenadas centralmente, que cambian el comportamiento de la aplicación en tiempo de ejecución, son muy importantes y se deben implementar, actualizar y administrar con los mismos mecanismos que se usan para implementar el código de la aplicación. Por ejemplo, los cambios que puedan afectar a más de una aplicación deben llevarse a cabo mediante un enfoque de prueba completa e implementación de ensayo para garantizar que el cambio es adecuado para todas las aplicaciones que usan esta configuración. La modificación por un administrador de una opción para actualizar una aplicación, podría afectar negativamente a otras aplicaciones que usen la misma configuración.

Si una aplicación almacena en caché la información de configuración, será necesario alertarla si cambia la configuración. Se podría implementar una directiva de caducidad sobre los datos de configuración almacenados en caché para que esta información se actualice automáticamente de forma periódica y se recojan los cambios (y se actúe en función de ellos).

Aunque el almacenamiento en caché de los datos de configuración puede ayudar a solucionar incidencias transitorias de conectividad con el almacén de configuración externo en tiempo de ejecución de la aplicación, esto no suele resolver el problema si el almacén externo está inactivo cuando se inicia la aplicación por primera vez. Asegúrese de que la canalización de implementación de aplicaciones pueda proporcionar el último conjunto conocido de valores de configuración en un archivo de configuración como reserva si la aplicación no puede recuperar los valores activos cuando se inicia.

Cuándo usar este patrón

Este patrón es útil para:

  • Valores de configuración que se comparten entre varias aplicaciones e instancias de aplicación, o donde se deba aplicar una configuración estándar entre varias aplicaciones e instancias de aplicación.

  • Un sistema de configuración estándar que no admita todos los valores de configuración necesarios, como el almacenamiento de imágenes o tipos de datos complejos.

  • Como almacén complementario para algunos de los valores de las aplicaciones, que permita quizás que las aplicaciones reemplacen algunos o todos los valores almacenados a nivel central.

  • Como forma de simplificar la administración de varias aplicaciones y, opcionalmente, de supervisar el uso de valores de configuración mediante el registro de algunos o todos los tipos de acceso en el almacén de configuración.

Diseño de cargas de trabajo

Un arquitecto debe evaluar cómo se puede usar el patrón External Configuration Store en el diseño de sus cargas de trabajo para abordar los objetivos y principios descritos en los pilares del Marco de buena arquitectura de Azure. Por ejemplo:

Fundamento Cómo apoya este patrón los objetivos de los pilares
La excelencia operativa ayuda a ofrecer calidad de carga de trabajo a través de procesos estandarizados y cohesión de equipos. Esta separación de la configuración de la aplicación del código de la aplicación admite la configuración específica del entorno y aplica el control de versiones a los valores de configuración. Los almacenes de configuración externos también son un lugar común para gestionar las marcas de características para permitir prácticas de implementación seguras.

- OE:10 Diseño de automatización
- OE:11 Procedimientos de implementación seguros

Al igual que con cualquier decisión de diseño, hay que tener en cuenta las ventajas y desventajas con respecto a los objetivos de los otros pilares que podrían introducirse con este patrón.

Ejemplo de la memoria auxiliar personalizada

En una aplicación hospedada de Microsoft Azure, el uso de Azure Storage es una opción posible para almacenar información de configuración externamente. Esta solución es resistente, ofrece un alto rendimiento y se replica tres veces con conmutación automática por error para ofrecer alta disponibilidad. Azure Table Storage proporciona un almacén de clave-valor con la posibilidad de usar un esquema flexible para los valores. Azure Blob Storage proporciona un almacén jerárquico basado en contenedores que puede contener cualquier tipo de datos en blobs nombrados de forma individual.

Al implementar este patrón, el usuario sería el responsable de abstraer Azure Blob Storage y exponer la configuración de las aplicaciones, incluida la comprobación de actualizaciones en tiempo de ejecución y cómo responder a ellas.

En el ejemplo siguiente se muestra cómo se puede concebir un almacén de configuración simplista mediante Blob Storage para almacenar y exponer la información de configuración. Una clase BlobSettingsStore podría abstraer Blob Storage para almacenar la información de configuración e implementar una interfaz ISettingsStore sencilla.

public interface ISettingsStore
{
    Task<ETag> GetVersionAsync();
    Task<Dictionary<string, string>> FindAllAsync();
}

Esta interfaz define métodos para recuperar los valores de configuración contenidos en el almacén de configuración. Además, incluye un número de versión que puede usarse para detectar si los parámetros de configuración se han modificado recientemente. Una clase BlobSettingsStore puede usar la propiedad ETag del blob para implementar el control de versiones. La propiedad ETag se actualiza automáticamente cada vez que se escribe un blob.

De forma predeterminada, en esta ilustración simple se exponen todos los valores de configuración como valores de cadena, en lugar de valores con tipo.

Después, una clase ExternalConfigurationManager podría proporcionar un contenedor alrededor de una instancia BlobSettingsStore. Una aplicación puede usar esta clase para recuperar la información de configuración. Esta clase podría usar algo parecido a las Extensiones reactivas de Microsoft para publicar los cambios realizados en la configuración mientras se ejecuta el sistema. También sería responsable de implementar el patrón Cache-Aside para la configuración a fin de proporcionar resistencia y rendimiento añadidos.

El uso podría tener un aspecto similar al siguiente:

static void Main(string[] args)
{
    // Start monitoring configuration changes.
    ExternalConfiguration.Instance.StartMonitor();

    // Get a setting.
    var setting = ExternalConfiguration.Instance.GetAppSetting("someSettingKey");
    …
}

Uso de Azure App Configuration

Aunque puede ser necesaria la creación de un almacén de configuración personalizado en algunas situaciones, muchas aplicaciones pueden usar en su lugar Azure App Configuration. Azure App Configuration admite pares clave-valor que se pueden convertir en espacios de nombres. Las claves se escriben y tienen versiones individuales. Azure App Configuration también admite las instantáneas a un momento dado de configuración para que pueda inspeccionar los valores de configuración anteriores o incluso revertirlos fácilmente. Los valores de configuración se pueden exportar de forma que una copia de la configuración pueda enviarse con la aplicación en caso de que no se pueda acceder al servicio cuando se inicie la aplicación.

Bibliotecas de clientes

Muchas de estas características se exponen mediante las bibliotecas cliente que se integran con el tiempo de ejecución de la aplicación para facilitar la captura y el almacenamiento en caché de valores, la actualización de valores en caso de cambio e incluso el control de interrupciones transitorias de App Configuration Service.

Tiempo de ejecución Biblioteca cliente Notas Inicio rápido
.NET Microsoft.Extensions.Configuration.AzureAppConfiguration Proveedor para Microsoft.Extensions.Configuration Guía de inicio rápido
ASP.NET Microsoft.Azure.AppConfiguration.AspNetCore Proveedor para Microsoft.Extensions.Configuration Guía de inicio rápido
Azure Functions en .NET Microsoft.Extensions.Configuration.AzureAppConfiguration Se usa con extensiones de Azure Function para admitir la configuración en Startup.cs Guía de inicio rápido
.NET Framework Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration Generador de configuración para System.Configuration Guía de inicio rápido
Java Spring com.azure.spring > azure-spring-cloud-appconfiguration-config Admite el acceso a Spring Framework mediante ConfigurationProperties Guía de inicio rápido
Python azure.appconfiguration Proporciona un AzureAppConfigurationClient Guía de inicio rápido
JavaScript/Node.js @azure/app-configuration Proporciona un AppConfigurationClient Guía de inicio rápido

Además de las bibliotecas cliente, también hay una acción de GitHub de Azure App Configuration Sync y tareas de Azure DevOps de Azure App Configuration Pull y Azure App Configuration Push para integrar los pasos de configuración en el proceso de compilación.

Pasos siguientes