Independientemente de la arquitectura y los componentes que use para implementarla, debe implementar y configurar los componentes de la solución. En un entorno multiinquilino, es importante tener en cuenta cómo se implementan los recursos de Azure, especialmente cuando se implementan recursos dedicados para cada inquilino o cuando se reconfiguran los recursos en función del número de inquilinos del sistema. En esta página, se proporcionan instrucciones a los arquitectos de soluciones sobre la implementación de soluciones multiinquilino y se muestran algunos enfoques que se deben tener en cuenta al planear la estrategia de implementación.
Consideraciones clave y requisitos
Es importante tener una idea clara de los requisitos antes de planear la estrategia de implementación. Entre las consideraciones específicas se incluyen las siguientes:
- Escala prevista: ¿Espera admitir un pequeño número de inquilinos (por ejemplo, cinco o menos) o aumentará hasta un gran número de inquilinos?
- Incorporación automatizada o compatible: cuando un inquilino esté listo para incorporarse, ¿podrá completar el proceso por sí mismo siguiendo un procedimiento automatizado? O bien, ¿los nuevos inquilinos inician una solicitud y se incorporan manualmente después de recibir la solicitud? ¿Hay pasos de aprobación manuales necesarios para el equipo, como evitar el abuso del servicio?
- Tiempo de aprovisionamiento: cuando un inquilino está listo para incorporarlo, ¿con qué rapidez es necesario completar el proceso de incorporación? Si no sabe la respuesta exacta, considere si debe medirse en segundos, minutos, horas o días.
- Azure Marketplace: ¿Tiene previsto usar Azure Marketplace para iniciar la implementación? Si lo hace, hay requisitos que debe cumplir para agregar nuevos inquilinos.
También debe considerar la posibilidad de incorporar y aprovisionar pasos, automatización y responsabilidad para la administración de recursos.
Pasos de incorporación y aprovisionamiento
Tenga en cuenta todo lo que necesita hacer para incorporar un inquilino y documente esta lista y el flujo de trabajo, incluso si se realiza manualmente. El flujo de trabajo de incorporación suele incluir lo siguiente:
- Aceptación de contratos comerciales
- Recopilación de la información necesaria para configurar el sistema para el nuevo inquilino
- Pasos de aprobación manuales, por ejemplo, para evitar fraudes o abusos en el servicio
- Aprovisionamiento de recursos en Azure
- Crear o configurar nombres de dominio
- Realizar tareas de configuración posteriores a la implementación, como crear la primera cuenta de usuario para el inquilino y transmitir sus credenciales de forma segura al inquilino.
- Cambios de configuración manuales, como cambios en los registros DNS
Documente claramente el flujo de trabajo necesario para incorporar un nuevo inquilino.
Además, tenga en cuenta los recursos específicos de Azure que necesita aprovisionar para un inquilino. Incluso si no aprovisiona recursos dedicados para cada inquilino, considere si a veces necesita implementar recursos cuando se incorpora un nuevo inquilino. Esto puede ocurrir cuando un inquilino requiere que sus datos se almacenen en una región específica o cuando se aproxima a los límites de un stamp o componente en la solución y necesita crear otra instancia para el siguiente lote de inquilinos.
Considere si es probable que el proceso de incorporación pueda plantear inconvenientes para otros inquilinos, especialmente para aquellos que comparten la misma infraestructura. Por ejemplo, si necesita modificar bases de datos compartidas, ¿podría este proceso provocar un impacto en el rendimiento que otros inquilinos podrían percibir? Considere si puede evitar estos efectos o mitigarlos realizando el proceso de incorporación fuera del horario comercial habitual.
Automatización
Las implementaciones automatizadas siempre son aconsejables para las soluciones hospedadas en la nube. Al trabajar con soluciones multiinquilino, la automatización de la implementación es aún más importante por los siguientes motivos:
- Escala: Los procesos de implementación manual son cada vez más complejos y lentos, a medida que aumenta la cantidad de inquilinos. Un enfoque de implementación automatizada se escala de forma más fácil a medida que aumenta el número de inquilinos.
- Repetible: en un entorno multiinquilino, use un proceso coherente para las implementaciones en todos los inquilinos. Los procesos manuales plantean la posibilidad de errores o de pasos que se realizan para algunos inquilinos y no para otros. Estos procesos manuales dejan el entorno en un estado incoherente, lo que dificulta a su equipo administrar la solución.
- Impacto de las interrupciones: las implementaciones manuales son significativamente más arriesgadas y propensas a interrupciones que las implementaciones automatizadas. En un entorno multiinquilino, el impacto de una interrupción en todo el sistema (debido a un error de implementación) puede ser alto, ya que todos los inquilinos podrían verse afectados.
Cuando la implementación se realiza en un entorno multiinquilino, debe usar canalizaciones de implementación y tecnologías de infraestructura como código (IaC), como Bicep, plantillas de ARM JSON, Terraform o los SDK de Azure.
Si tiene previsto ofrecer la solución en Azure Marketplace, debe proporcionar un proceso de incorporación totalmente automatizado para los nuevos inquilinos. Este proceso se describe en la documentación de las API de suministro de SaaS.
Capacidad máxima de recursos
Cuando implemente recursos de inquilino mediante programación en recursos compartidos, tenga en cuenta el límite de capacidad de cada recurso. Al aproximarse a ese límite, es posible que tenga que crear otra instancia del recurso para admitir una mayor escala. Tenga en cuenta los límites de cada recurso que implemente y las condiciones que le llevarán a implementar otra instancia.
Por ejemplo, suponga que la solución incluye un servidor lógico de Azure SQL y que la solución aprovisiona una base de datos dedicada en ese servidor para cada inquilino. Un único servidor lógico tiene límites, que incluyen un número máximo de bases de datos que un servidor lógico admite. A medida que se aproxima a estos límites, es posible que tenga que aprovisionar nuevos servidores para poder continuar incorporando inquilinos. Considere si automatizar este proceso o si supervisar manualmente el crecimiento.
Responsabilidad de administración de los recursos
En algunas soluciones multiinquilino, se implementan recursos de Azure dedicados para cada inquilino, como una base de datos para cada inquilino. O bien, puede decidir un número determinado de inquilinos para hospedarlos en una sola instancia de un recurso, por lo que el número de inquilinos que tiene determina el conjunto de recursos que se implementan en Azure. En otras soluciones, se implementa un único conjunto de recursos compartidos y, a continuación, se reconfiguran los recursos al incorporar nuevos inquilinos.
Cada uno de estos modelos requiere que implemente y administre los recursos de maneras diferentes, y debe tener en cuenta cómo implementará y administrará el ciclo de vida de los recursos que aprovisiona. Dos enfoques comunes son los siguientes:
- Tratar los inquilinos como configuración de los recursos que implemente y usar las canalizaciones de implementación para implementar y configurar esos recursos.
- Tratar los inquilinos como datos y disponer de un plano de control que aprovisione y configure la infraestructura para los inquilinos.
A continuación, se proporciona una explicación más detallada de estos enfoques.
Pruebas
Planee probar exhaustivamente la solución durante y después de cada implementación. Puede usar las pruebas automatizadas para comprobar el comportamiento funcional y no funcional de la solución. Asegúrese de probar el modelo de aislamiento de inquilinos y considere la posibilidad de usar herramientas como Azure Chaos Studio para introducir deliberadamente errores que simulan interrupciones del mundo real y comprobar que la solución funciona incluso cuando un componente no está disponible o no funciona correctamente.
Enfoques y patrones que se deben tener en cuenta
Varios patrones de diseño del Centro de arquitectura de Azure, y la comunidad más amplia, son importantes para la implementación y configuración de soluciones multiinquilino.
Patrón de stamps de implementación
El patrón de stamps de implementación implica la implementación de una infraestructura dedicada para un inquilino o un grupo de inquilinos. Un solo stamp puede contener varios inquilinos o puede estar dedicado a un único inquilino. Puede optar por implementar un solo stamp o puede coordinar una implementación en varios stamps. Si implementa stamps dedicados para cada inquilino, también puede considerar la posibilidad de implementar stamps completos mediante programación.
Anillos de implementación
Los anillos de implementación permiten implementar actualizaciones en diferentes grupos de infraestructuras en momentos diferentes. Este enfoque se usa normalmente con el patrón de stamps de implementación, y los grupos de stamps se pueden asignar a anillos distintos en función de las preferencias de inquilino, los tipos de carga de trabajo y otras consideraciones. Para más información, vea Anillos de implementación.
Marcas de característica
Las marcas de características permiten exponer de forma progresiva nuevas características o versiones de la solución a distintos inquilinos, mientras se mantiene un único código base. Considere la posibilidad de usar Azure App Configuration para administrar las marcas de características. Para más información, vea Marcas de característica.
A veces es necesario habilitar de forma selectiva características específicas para determinados clientes. Por ejemplo, puede tener distintos planes de tarifa que permitan acceder a determinadas funcionalidades. Las marcas de características no suelen ser la opción adecuada para estos escenarios. En su lugar, considere la posibilidad de crear un proceso para controlar y aplicar los derechos de licencia que tiene cada cliente.
Antipatrones que se deben evitar
Al implementar y configurar soluciones multiinquilino, es importante evitar situaciones que inhiban su capacidad de escalado. que incluyen la siguiente información:
- Implementación y pruebas manuales. Como se describió anteriormente, los procesos de implementación manual plantean riesgo y ralentizan la capacidad de implementación. Considere el uso de canalizaciones para implantaciones automatizadas, la creación mediante programación de recursos a partir del código de la solución o una combinación de ambas.
- Personalizaciones especializadas para inquilinos. Evite implementar características o una configuración que solo se aplique a un único inquilino. Este enfoque agrega complejidad a las implementaciones y los procesos de prueba. En su lugar, use los mismos tipos de recursos y código base para cada inquilino, y use estrategias como marcas de características para los cambios temporales o para las características que se implementan progresivamente, o use distintos planes de tarifa con derechos de licencia para habilitar de forma selectiva las características para los inquilinos que las necesiten. Use un proceso de implementación coherente y automatizada, incluso para los inquilinos que tienen recursos aislados o dedicados.
Listas de inquilinos como configuración o datos
Puede tener en cuenta los dos enfoques siguientes al implementar recursos en una solución multiinquilino:
- Use una canalización de implementación automatizada para implementar todos los recursos. A medida que se agregan nuevos inquilinos, vuelva a configurar la canalización para aprovisionar los recursos para cada inquilino.
- Use una canalización de implementación automatizada para implementar recursos compartidos que no dependen del número de inquilinos. En el caso de los recursos que se implementan para cada inquilino, créelos dentro de la aplicación.
Al considerar los dos enfoques, debe distinguir entre tratar la lista de inquilinos como una configuración o como datos. Esta distinción también es importante al pensar en cómo crear un plano de control para el sistema.
Lista de inquilinos como configuración
Al tratar la lista de inquilinos como configuración, se implementan todos los recursos a partir de la canalización de implementación centralizada. Cuando incorpore nuevos inquilinos, vuelva a configurar la canalización o sus parámetros. Normalmente, la reconfiguración se realiza mediante cambios manuales, como se muestra en el diagrama siguiente.
El proceso para incorporar un nuevo inquilino puede ser similar al siguiente:
- Actualizar la lista de inquilinos. Esto suele realizarse manualmente mediante la configuración de la propia canalización o la modificación de un archivo de parámetros que se incluye en la configuración de la canalización.
- Desencadenar la ejecución de la canalización.
- La canalización vuelve a implementar el conjunto completo de recursos de Azure, incluidos los nuevos recursos específicos del inquilino.
Este enfoque tiende a funcionar bien para un pequeño número de inquilinos y para arquitecturas donde se comparten todos los recursos. Es un enfoque sencillo porque todos los recursos de Azure se pueden implementar y configurar mediante un único proceso.
Sin embargo, cuando se aproxima a un mayor número de inquilinos, por ejemplo, de 5 a 10 o más, resulta complicado volver a configurar la canalización a medida que se agregan inquilinos. El tiempo necesario para ejecutar la canalización de implementación también suele aumentar considerablemente. Este enfoque tampoco admite fácilmente la creación de inquilinos de autoservicio, y el tiempo de ejecución antes de que se incorpore un inquilino puede ser mayor porque es necesario desencadenar la ejecución de la canalización.
Lista de inquilinos como datos
Al tratar la lista de inquilinos como datos, todavía se implementan los componentes compartidos mediante una canalización. Sin embargo, para los recursos y las opciones de configuración que deben implementarse para cada inquilino, debe implementar o configurar los recursos obligatoriamente. Por ejemplo, su plano de control puede usar los SDK de Azure para crear un recurso específico o para iniciar la implementación de una plantilla con parámetros.
El proceso para incorporar un nuevo inquilino podría ser similar al siguiente y se ejecutaría de forma asincrónica:
- Solicite la incorporación de un inquilino, por ejemplo, iniciando una solicitud de API en el plano de control del sistema.
- Un componente de flujo de trabajo recibe la solicitud de creación y orquesta los pasos restantes.
- El flujo de trabajo inicia la implementación de recursos específicos del inquilino en Azure. Esto se puede lograr mediante un modelo de programación imperativo, como usar los SDK de Azure o desencadenar de forma imperativa la implementación de una plantilla de Bicep o Terraform.
- Cuando se completa la implementación, el flujo de trabajo guarda los detalles del nuevo inquilino en el catálogo del inquilino central. Los datos almacenados para cada inquilino pueden incluir el identificador de inquilino y los identificadores de recurso de todos los recursos específicos del inquilino que creó el flujo de trabajo.
Al hacerlo, puede aprovisionar recursos para nuevos inquilinos sin volver a implementar toda la solución. Es probable que el tiempo necesario para aprovisionar nuevos recursos para cada inquilino sea más corto, ya que solo es necesario implementar esos recursos.
Sin embargo, este enfoque suele llevar mucho más tiempo en compilarse, y el esfuerzo que se invierte debe justificarse con el número de inquilinos o los períodos de tiempo de aprovisionamiento que debe cumplir.
Para obtener más información sobre este enfoque, consulte Consideraciones para los planos de control multiinquilino.
Nota
Las operaciones de implementación y configuración de Azure suelen tardar tiempo en completarse. Asegúrese de usar un proceso adecuado para iniciar y supervisar estas operaciones de larga duración. Por ejemplo, puede considerar la posibilidad de seguir el Patrón asincrónico de solicitud-respuesta. Use tecnologías diseñadas para admitir operaciones de larga duración, como Azure Logic Apps y Durable Functions.
Ejemplo
Contoso ejecuta una solución multiinquilino para sus clientes. Actualmente, tienen seis inquilinos y esperan crecer hasta 300 inquilinos en los próximos 18 meses. Contoso sigue el enfoque Aplicación multiinquilino con bases de datos dedicadas para cada inquilino. Ha implementado un único conjunto de recursos de App Service y un servidor lógico de Azure SQL que se comparten entre todos sus inquilinos e implementa una base de datos de Azure SQL dedicada para cada inquilino, como se muestra en el diagrama siguiente.
Contoso usa Bicep para implementar sus recursos de Azure.
Opción 1: Uso de canalizaciones de implementación para todo
Contoso podría considerar la posibilidad de implementar todos sus recursos mediante una canalización de implementación. Su canalización implementa un archivo Bicep que contiene todos sus recursos de Azure, incluidas las bases de datos de Azure SQL para cada inquilino. Un archivo de parámetros define la lista de inquilinos, y el archivo Bicep usa un bucle de recursos para implementar una base de datos para cada uno de los inquilinos enumerados, como se muestra en el diagrama siguiente.
Si Contoso sigue este modelo, deberá actualizar su archivo de parámetros como parte de la incorporación de un nuevo inquilino. A continuación, debe volver a ejecutar la canalización. Además, debe realizar un seguimiento manual de la proximidad a los límites, por ejemplo, si se produce un crecimiento a una velocidad inesperadamente alta y si hay alguna aproximación al número máximo de bases de datos admitidas en un único servidor lógico de Azure SQL.
Opción 2: Uso de una combinación de canalizaciones de implementación y creación de recursos imperativos
Como alternativa, Contoso podría considerar la posibilidad de separar la responsabilidad de las implementaciones de Azure.
Contoso usa un archivo Bicep que define los recursos compartidos que se deben implementar. Los recursos compartidos admiten todos sus inquilinos e incluyen una base de datos de asignación de inquilinos, como se muestra en el diagrama siguiente.
A continuación, el equipo de Contoso crea un plano de control que incluye una API de incorporación de inquilinos. Cuando su equipo de ventas ha completado la venta a un nuevo cliente, Microsoft Dynamics desencadena la API para iniciar el proceso de incorporación. Contoso también proporciona una interfaz web de autoservicio para que la usen los clientes, y eso también desencadena la API.
La API inicia de forma asincrónica un flujo de trabajo que incorpora sus nuevos inquilinos. El flujo de trabajo inicia la implementación de una nueva base de datos de Azure SQL, que puede realizarse mediante uno de los enfoques siguientes:
- Use el SDK de Azure para iniciar la implementación de un segundo archivo Bicep que defina la base de datos de Azure SQL.
- Use el SDK de Azure para crear de forma imperativa una base de datos de Azure SQL mediante la biblioteca de administración.
Una vez implementada la base de datos, el flujo de trabajo agrega el inquilino a la base de datos de la lista de inquilinos, como se muestra en el diagrama siguiente.
La capa de aplicación inicia las actualizaciones en curso del esquema de la base de datos.
Colaboradores
Microsoft mantiene este artículo. Originalmente lo escribieron los siguientes colaboradores.
Autor principal:
- John Downs | Ingeniero principal de software
Otros colaboradores:
- Bohdan Cherchyk | Ingeniero de clientes sénior, FastTrack for Azure
- Arsen Vladimirskiy | Principal Customer Engineer, FastTrack for Azure
Para ver los perfiles no públicos de LinkedIn, inicie sesión en LinkedIn.