Recomendaciones para optimizar los costos de escalado

Se aplica a esta recomendación de lista de comprobación de optimización de costos de Azure Well-Architected Framework:

CO:12 Optimice los costos de escalado. Evalúe el escalado alternativo dentro de las unidades de escalado. Considere las configuraciones de escalado alternativas y alinee con el modelo de costos. Las consideraciones deben incluir el uso con respecto a los límites heredados de cada instancia, recurso y límite de unidad de escalado. Use estrategias para controlar la demanda y el suministro.

En esta guía se proporcionan recomendaciones para optimizar los costos de escalado. El escalado de optimización de costos es el proceso de eliminación de ineficiencias en el escalado de cargas de trabajo. El objetivo es reducir los costos de escalado a la vez que se cumplen todos los requisitos no funcionales. Gastar menos para obtener el mismo resultado. La optimización del escalado permite evitar gastos innecesarios, sobreaprovisionamiento y desperdicios. También ayuda a evitar picos inesperados en los costos al controlar la demanda y limitar el suministro. Las prácticas de escalado ineficaz pueden provocar un aumento de la carga de trabajo y los costos operativos y afectar negativamente al estado financiero general de la carga de trabajo.

Definiciones

Término Definición
Escalado automático Un enfoque de escalado que agrega o quita automáticamente los recursos cuando se cumple un conjunto de condiciones.
Métricas de costo Datos numéricos relacionados con el costo de la carga de trabajo.
Reducción vertical Una estrategia de escalado vertical que cambia a una SKU inferior para proporcionar menos recursos a la carga de trabajo.
Reducción horizontal Una estrategia de escalado horizontal que quita instancias para proporcionar menos recursos a la carga de trabajo.
Escalado horizontal Una estrategia de escalado horizontal que agrega instancias para proporcionar más recursos a la carga de trabajo.
Unidad de escalado Un grupo de recursos que se escalan proporcionalmente juntos.
Escalado vertical Una estrategia de escalado vertical que cambia a una SKU superior para proporcionar más recursos a la carga de trabajo.
Referencia de almacén (SKU) Un nivel de servicio para un servicio de Azure.
Datos de uso Los datos de uso son información directa (real) o información indirecta/representativa (proxy) sobre cuánto se usa una tarea, un servicio o una aplicación.

Estrategias de diseño principales

El objetivo del escalado de optimización de costos es escalar y reducir verticalmente en el último momento responsable y reducir verticalmente y en tan pronto como sea práctico. Para optimizar el escalado de la carga de trabajo, puede evaluar opciones de escalado alternativas dentro de las unidades de escalado y alinearlas con el modelo de costos. Una unidad de escalado representa una agrupación específica de recursos que se pueden escalar de forma independiente o conjunta. Debe diseñar unidades de escalado para controlar una cantidad específica de carga y pueden incluir varias instancias, servidores u otros recursos. Debe evaluar la rentabilidad de las unidades de escalado de carga de trabajo y las alternativas del modelo.

Si no usa el escalado, consulte las instrucciones sobre el escalado de la carga de trabajo. Debe averiguar si la aplicación puede escalar. Las aplicaciones sin estado son más fáciles de escalar porque pueden controlar varias solicitudes al mismo tiempo. Además, evalúe si la aplicación se compila mediante principios de sistemas distribuidos. Los sistemas distribuidos pueden controlar una mayor carga mediante la distribución de la carga de trabajo entre varios nodos. Sin embargo, una aplicación singleton está diseñada para que solo se ejecute una instancia en un momento dado. Por lo tanto, es posible que el escalado no sea adecuado para todas las cargas de trabajo.

Evaluación del escalado horizontal frente al escalado vertical

La evaluación del escalado horizontal frente al escalado vertical implica determinar el enfoque más rentable entre aumentar los recursos de un sistema existente (escalar verticalmente) o agregar más instancias de ese sistema (escalado horizontal) en función de varios factores, como precios, requisitos de carga de trabajo y tiempo de inactividad aceptable. La elección del enfoque de escalado adecuado puede dar lugar a ahorros significativos, lo que garantiza que solo paga por lo que necesita y sigue cumpliendo los estándares de rendimiento y confiabilidad.

El objetivo es determinar la opción más rentable en función de los precios del plan de servicio, los rasgos de carga de trabajo, el tiempo de inactividad aceptable y el modelo de costos. Para algunos, podría ser más económico optar por instancias más costosas en menos números. Por el contrario, para otros, un nivel más barato con más instancias podría ser mejor. Para tomar una decisión informada, debe analizar los datos reales o representativos de la configuración y evaluar los méritos de costos relativos de cada estrategia. Para evaluar el enfoque más rentable, tenga en cuenta estas recomendaciones:

  • Recopilar datos de uso: recopile datos de producción reales o datos de proxy que representen los patrones de uso de la carga de trabajo y el uso de recursos. Estos datos deben incluir métricas como el uso de CPU, el uso de memoria, el tráfico de red y cualquier otra métrica relevante que afecte al costo del escalado.

  • Definir métricas de costos: identifique las métricas de costo que son relevantes para la carga de trabajo, como el costo por hora, el costo por transacción o el costo por unidad de uso de recursos. Estas métricas le ayudan a comparar la rentabilidad de las diferentes opciones de escalado.

  • Recopilar datos de uso: recopile datos de producción reales o datos de proxy que representen los patrones de uso de la carga de trabajo y el uso de recursos. Estos datos deben incluir métricas como el uso de CPU, el uso de memoria, el tráfico de red y cualquier otra métrica pertinente que afecte al costo del escalado.

  • Definir métricas de costos: identifique las métricas de costo que son relevantes para la carga de trabajo, como el costo por hora, el costo por transacción o el costo por unidad de uso de recursos. Estas métricas le ayudan a comparar la rentabilidad de las diferentes opciones de escalado.

  • Consulte los requisitos: al decidir entre las estrategias de escalado horizontal y escalado vertical, tenga en cuenta los requisitos de confiabilidad, rendimiento y escalado de la carga de trabajo. El escalado horizontal puede mejorar la confiabilidad mediante redundancia. El escalado vertical aumenta la capacidad de un recurso, pero puede haber límites para escalar verticalmente.

  • Considere los límites de recursos: al evaluar las opciones de escalado, es importante tener en cuenta los límites inherentes de cada instancia, recurso y límite de unidad de escalado. Tenga en cuenta los límites de escalado superior para cada recurso y planee en consecuencia. Además, tenga en cuenta los límites de la suscripción y otros recursos.

  • Escalado de pruebas: cree pruebas para diferentes escenarios de escalado, incluidas las opciones de escalado horizontal y escalado vertical. La aplicación de los datos de uso simula el comportamiento de la carga de trabajo en distintas configuraciones de escalado. Realice pruebas reales mediante los escenarios de escalado modelado.

  • Calcular costos: use los datos recopilados y las métricas de costos para calcular los costos asociados a cada configuración de escalado. Tenga en cuenta factores como los precios de instancia, el uso de recursos y los costos adicionales relacionados con el escalado.

Optimización del escalado automático

La optimización de la directiva de escalado automático implica refinar el escalado automático para reaccionar a los cambios de carga en función de los requisitos no funcionales de la carga de trabajo. Puede limitar las actividades de escalado excesivo ajustando los umbrales y usando el período de enfriamiento correcto. Para optimizar el escalado automático, tenga en cuenta las siguientes recomendaciones:

  • Analizar la directiva de escalado automático actual: comprenda la directiva existente y su comportamiento en respuesta a los distintos niveles de carga.

  • Consulte los requisitos no funcionales: identifique los requisitos no funcionales específicos que debe tener en cuenta, como el tiempo de respuesta, el uso de recursos o el costo.

  • Ajuste de los umbrales de escalado: ajuste los umbrales de escala en función de las características de la carga de trabajo y los requisitos no funcionales. Establezca umbrales para escalar o reducir verticalmente en función de factores como el uso de cpu a lo largo del tiempo, el tráfico de red o la longitud de la cola.

  • Ajustar un período de enfriamiento: ajuste el período de reescalado para evitar actividades de escalado excesivas desencadenadas por picos de carga temporales. Un período de enfriamiento introduce un retraso entre los eventos de escalado, lo que permite al sistema estabilizarse antes de realizar más acciones de escalado.

  • Supervisión y ajuste: supervise continuamente el comportamiento y el rendimiento del sistema. Analice las actividades de escalado y ajuste la directiva según sea necesario para optimizar el costo y cumplir los requisitos no funcionales deseados.

Equilibrio: reducir el número de eventos de escalado genera las posibilidades de encontrar problemas relacionados con el escalado. Esto significa que elimina el cojín o búfer adicional que podría ayudar a administrar posibles problemas o retrasos del escalado.

Consideración del escalado basado en eventos

El escalado automático controlado por eventos permite a la aplicación ajustar dinámicamente los recursos en función de eventos o desencadenadores específicos en lugar de métricas tradicionales, como el uso de CPU o memoria. Por ejemplo, el escalado automático controlado por eventos (KEDA) de Kubernetes puede escalar aplicaciones basadas en escaladores, como la longitud de un tema de Kafka. La precisión ayuda a evitar fluctuaciones innecesarias de escalado y desperdicio de recursos. En última instancia, un alto nivel de precisión optimiza los costos. Para usar el escalado basado en eventos, siga estos pasos:

  • Elija un origen de eventos: determine el origen del evento que desencadena el escalado de la unidad de escalado. Un origen puede ser una cola de mensajes, una plataforma de streaming o cualquier otro sistema controlado por eventos.

  • Configurar la ingesta de eventos: configure la aplicación para que consuma eventos del origen de eventos elegido. Normalmente implica establecer una conexión, suscribirse a los temas o colas pertinentes y procesar los eventos entrantes.

  • Implementar lógica de escalado: escriba la lógica que determina cuándo y cómo se debe escalar la unidad de escalado en función de los eventos entrantes. Esta lógica debe tener en cuenta factores como el número de eventos, la tasa de eventos entrantes o cualquier otra métrica pertinente.

  • Integración con mecanismos de escalado: en función del entorno en tiempo de ejecución de la aplicación, puede usar diferentes mecanismos de escalado para ajustar los recursos asignados a la aplicación.

  • Configurar reglas de escalado: defina las reglas de escalado que especifican cómo la unidad de escalado debe escalar en respuesta a eventos. Estas reglas se pueden basar en umbrales, patrones o cualquier otro criterio que se alinee con los requisitos de la aplicación. Los umbrales de escalado deben estar relacionados con las métricas empresariales. Por ejemplo, si agrega dos instancias más, puede admitir 50 usuarios más en el procesamiento del carro de la compra.

  • Prueba y supervisión: valide el comportamiento de la implementación de escalado basada en eventos mediante su prueba con diferentes escenarios de eventos. Supervise las acciones de escalado y asegúrese de que las acciones se alineen con sus expectativas.

Compensación La configuración y la optimización del escalado automático basado en eventos pueden ser complejas y una configuración incorrecta puede provocar un aprovisionamiento excesivo o un aprovisionamiento bajo de recursos.

Optimización de la demanda y el suministro

Controle la demanda contra el suministro. En las cargas de trabajo en las que el uso determina el escalado, el costo se correlaciona con el escalado. Para optimizar los costos de escalado, puede minimizar el gasto de escalado. Puede descargar la demanda mediante la distribución de la demanda a otros recursos, o puede reducir la demanda implementando colas de prioridad, descarga de puerta de enlace, almacenamiento en búfer y limitación de velocidad. Ambas estrategias pueden evitar costos no deseados debido al escalado y al consumo de recursos. También puede controlar el suministro limitando los límites de escalado. Para optimizar la demanda y el suministro de cargas de trabajo, tenga en cuenta las siguientes recomendaciones.

Descarga de la demanda

La descarga de la demanda se refiere a la práctica de distribuir o transferir la demanda de recursos a otros recursos o servicios. Puede usar varias tecnologías o estrategias:

  • Almacenamiento en caché: use el almacenamiento en caché para almacenar contenido o datos a los que se accede con frecuencia, lo que reduce la carga en la infraestructura de back-end. Por ejemplo, use redes de entrega de contenido (CDN) para almacenar en caché y servir contenido estático, lo que reduce la necesidad de escalar el back-end. Sin embargo, no todas las cargas de trabajo pueden almacenar en caché los datos. Las cargas de trabajo que requieren datos actualizados y en tiempo real, como las cargas de trabajo de trading o juegos, no deben usar una memoria caché. Los datos almacenados en caché serían antiguos e irrelevantes para el usuario.

    Compensación. El almacenamiento en caché puede presentar desafíos en términos de invalidación de caché, coherencia y administración de la expiración de la caché. Es importante diseñar e implementar cuidadosamente estrategias de almacenamiento en caché para evitar posibles inconvenientes.

  • Descarga de contenido: descargue contenido en servicios o plataformas externos para reducir la carga de trabajo en la infraestructura. Por ejemplo, en lugar de almacenar archivos de vídeo en el servidor principal, puede hospedar estos archivos en un servicio de almacenamiento independiente independiente del servidor principal. Puede cargar estos archivos grandes directamente desde el servicio de almacenamiento. Este enfoque libera recursos en los servidores, lo que le permite usar un servidor más pequeño. Puede ser más barato almacenar archivos grandes en un almacén de datos independiente. Puede usar una red CDN para mejorar el rendimiento.

  • Equilibrio de carga: distribuya las solicitudes entrantes entre varios servidores mediante el equilibrio de carga. El equilibrio de carga distribuye uniformemente la carga de trabajo e impide que cualquier servidor único se sobrepase. Los equilibradores de carga optimizan el uso de recursos y mejoran la eficacia de la infraestructura.

  • Descarga de base de datos: reduzca la carga en el servidor de aplicaciones principal descargando las operaciones de base de datos en un servidor de bases de datos independiente o en un servicio especializado. Por ejemplo, use una red CDN para el almacenamiento en caché de contenido estático y una caché de Redis para el almacenamiento en caché de contenido dinámico (datos de la base de datos). Técnicas como el particionamiento de bases de datos, las réplicas de lectura o el uso de servicios de base de datos administrados también pueden reducir la carga.

    Compensación: La descarga de tareas específicas en recursos alternativos ayuda a reducir o evitar el escalado adicional y los costos asociados al escalado. Sin embargo, es importante tener en cuenta los desafíos operativos y de mantenimiento que pueden surgir de la descarga. La realización de un análisis completo de los beneficios de costos es fundamental al seleccionar las técnicas de descarga más adecuadas para la carga de trabajo. Este análisis garantiza que el método elegido sea eficaz y factible en relación con los ahorros previstos y las complejidades operativas.

Reducción de la demanda

Reducir la demanda de recursos significa implementar estrategias que ayuden a minimizar el uso de recursos en una carga de trabajo. La descarga de la demanda cambia la demanda a otros recursos. La reducción de la demanda reduce la demanda en la carga de trabajo. Reducir la demanda permite evitar el sobreaprovisionamiento de recursos y pagar por capacidad no utilizada o infrautilizada. Debe usar patrones de diseño de nivel de código para reducir la demanda de recursos de carga de trabajo. Para reducir la demanda mediante patrones de diseño, siga estos pasos:

  • Comprender los patrones de diseño: familiarícese con varios patrones de diseño que promueven la optimización de recursos.

  • Análisis de los requisitos de carga de trabajo: evalúe los requisitos específicos de la carga de trabajo, incluidos sus patrones de demanda esperados, las cargas máximas y las necesidades de recursos.

  • Seleccione los patrones de diseño adecuados: elija los patrones de diseño que se alinean con los requisitos y objetivos de la carga de trabajo. Por ejemplo, si la carga de trabajo experimenta una fluctuación de la demanda, el escalado controlado por eventos y los patrones de limitación pueden ayudar a administrar la carga de trabajo mediante la asignación dinámica de recursos. Aplique los patrones de diseño seleccionados a la arquitectura de la carga de trabajo. Es posible que tenga que separar componentes de carga de trabajo, incluir aplicaciones en contenedores, optimizar el uso del almacenamiento, etc.

  • Supervisar y optimizar continuamente: evalúe regularmente la eficacia de los patrones de diseño implementados y ajuste según sea necesario. Supervise el uso de recursos, las métricas de rendimiento y las oportunidades de optimización de costos.

Si sigue estos pasos y usa patrones de diseño adecuados, puede reducir la demanda de recursos, optimizar los costos y garantizar el funcionamiento eficaz de sus cargas de trabajo.

Use estos patrones de diseño para reducir la demanda:

  • Reserva de caché: el patrón comprueba la memoria caché para ver si los datos ya están almacenados en la memoria. Si los datos se encuentran en la memoria caché, la aplicación puede recuperar y devolver rápidamente los datos, lo que reduce la necesidad de consultar el almacén de datos persistente.

  • Comprobación de notificaciones: al separar los datos del flujo de mensajería, este patrón reduce el tamaño de los mensajes y admite una solución de mensajería más rentable.

  • Consumidores competidores: este patrón controla eficazmente los elementos de una cola aplicando el procesamiento distribuido y simultáneo. Este patrón de diseño optimiza los costos mediante el escalado que se basa en la profundidad de la cola y establece límites en el máximo de instancias de consumidor simultáneas.

  • Consolidación de recursos de proceso: este patrón aumenta la densidad y consolida los recursos de proceso mediante la combinación de varias aplicaciones o componentes en la infraestructura compartida. Maximiza el uso de recursos, evitando la capacidad aprovisionada sin usar y reduciendo los costos.

  • Stamps de implementación: el uso de stamps de implementación proporciona varias ventajas, como grupos de distribución geográfica de dispositivos, implementación de nuevas características en stamps específicos y observación del costo por dispositivo. Las marcas de implementación permiten una mejor escalabilidad, tolerancia a errores y un uso eficaz de los recursos.

  • Descarga de puerta de enlace: este patrón descarga el procesamiento de solicitudes en un dispositivo de puerta de enlace, redirigiendo los costos de los recursos por nodo a la implementación de la puerta de enlace. El uso de este patrón de diseño puede dar lugar a un menor costo de propiedad en un modelo de procesamiento centralizado.

  • Publicador o suscriptor: este patrón desacopla los componentes de una arquitectura, reemplazando la comunicación directa por un agente de mensajes intermedio o un bus de eventos. Permite un enfoque controlado por eventos y una facturación basada en el consumo, lo que evita el sobreaprovisionamiento.

  • Redistribuir la carga basada en cola: el patrón almacena en búfer las solicitudes entrantes o las tareas de una cola. El almacenamiento en búfer suaviza la carga de trabajo y reduce la necesidad de sobreaprovisionar recursos para controlar la carga máxima. Las solicitudes entrantes se procesan de forma asincrónica para reducir los costos.

  • Particionamiento: este patrón dirige solicitudes específicas a un destino lógico, lo que permite optimizaciones con coubicación de datos. El particionamiento puede dar lugar a un ahorro de costos mediante el uso de varias instancias de recursos de almacenamiento o proceso de especificación inferior.

  • Hospedaje de contenido estático: este patrón ofrece contenido estático de forma eficaz mediante el uso de una plataforma de hospedaje diseñada para este fin. Evita el uso de hosts de aplicaciones dinámicos más caros, lo que optimiza el uso de recursos.

  • Limitación: este patrón coloca límites en la velocidad (limitación de velocidad) o el rendimiento de las solicitudes entrantes a un recurso o componente. Ayuda a informar al modelado de costos y se puede asociar directamente al modelo de negocio de la aplicación.

  • Clave valet: este patrón concede acceso seguro y exclusivo a un recurso sin necesidad de más componentes, lo que reduce la necesidad de recursos intermedios y mejora la eficiencia.

Suministro de control

Definir un límite superior en la cantidad que está dispuesto a gastar en un recurso o servicio determinado es una manera de controlar el suministro. Es una estrategia importante para controlar los costos y garantizar que los gastos no superen un determinado nivel. Establezca un presupuesto y supervise el gasto para asegurarse de que permanece dentro del importe definido. Puede usar plataformas de administración de costos, alertas presupuestarias o realizar un seguimiento de los patrones de uso y gasto. Algunos servicios le permiten limitar las tarifas de suministro y límite, y debe usar esas características cuando resulte útil.

Controlar el suministro hace referencia a la definición de un límite superior en la cantidad que está dispuesto a gastar en un recurso o servicio determinado. Es una estrategia importante porque ayuda a controlar los costos y garantiza que los gastos no superen un determinado nivel. Establezca un presupuesto y supervise el gasto para asegurarse de que permanece dentro del umbral definido. Puede usar plataformas de administración de costos, alertas presupuestarias o realizar un seguimiento de los patrones de uso y gasto. Algunos servicios le permiten limitar las tarifas de suministro y límite, y debe usar esas características cuando resulte útil.

Compensación: los límites más estrictos pueden dar lugar a oportunidades perdidas de escala cuando aumenta la demanda, lo que puede afectar a la experiencia del usuario. Podría provocar apagados o no poder responder a la carga. Es importante alcanzar un equilibrio entre la optimización de costos y asegurarse de que dispone de recursos suficientes para satisfacer sus necesidades empresariales.

Facilitación de Azure

Evaluación del escalado horizontal frente al escalado vertical: Azure proporciona un entorno de prueba donde puede implementar y probar diferentes configuraciones de escalado. Mediante el uso de datos reales de carga de trabajo o datos de proxy, puede simular escenarios reales y medir los efectos en los costos. Azure ofrece herramientas y servicios para pruebas de rendimiento, pruebas de carga y supervisión, lo que puede ayudarle a evaluar la rentabilidad del escalado horizontal frente a las opciones de escalado vertical.

Azure proporciona recomendaciones de administración de costos a través de diversas herramientas y servicios, como Azure Advisor. Estas recomendaciones analizan los patrones de uso, el uso de recursos y las configuraciones de escalado para proporcionar información y sugerencias para optimizar los costos.

Azure Load Testing es un servicio de pruebas de carga totalmente administrado que genera una carga a gran escala. El servicio simula el tráfico de las aplicaciones, independientemente del lugar en que se hospeden. Los desarrolladores, evaluadores y ingenieros de control de calidad (QA) pueden usar pruebas de carga para optimizar el rendimiento, la escalabilidad o la capacidad de las aplicaciones.

Optimización del escalado automático: muchos servicios de proceso de Azure admiten la implementación de varias instancias idénticas y el ajuste rápido de los umbrales y directivas de escalado. Azure proporciona funcionalidades de escalado automático que permiten ajustar automáticamente el número de instancias o recursos en función de la demanda de cargas de trabajo. Puede definir reglas y umbrales de escalado para desencadenar acciones de escalado horizontal o escalado horizontal. Mediante el escalado automático, puede optimizar la asignación de recursos y la rentabilidad mediante el escalado dinámico de recursos en función de la demanda real.

Azure mantiene una lista de límites de suscripción y servicio. Hay un límite general para el número de instancias de un recurso que puede implementar en cada grupo de recursos con algunas excepciones. Para más información, consulte Límites de instancia de recursos por grupo de recursos.

Optimización de la demanda y el suministro: Azure Monitor proporciona información sobre el rendimiento y el estado de las aplicaciones y la infraestructura. Puede usar Azure Monitor para supervisar la carga en los recursos y analizar tendencias a lo largo del tiempo. Mediante el uso de métricas y registros recopilados por Azure Monitor, puede identificar áreas en las que es posible que se necesiten ajustes de escalado. Esta información puede guiar el refinamiento de la directiva de escalado automático para asegurarse de que se alinea con los requisitos no funcionales y los objetivos de optimización de costos.

  • Suministro de descarga: Azure tiene una red de entrega de contenido (CDN) moderna en la nube denominada Azure Front Door y servicios de almacenamiento en caché (Azure Cache for Redis y Azure HPC Cache). La red CDN almacena en caché el contenido más cerca de los usuarios finales, lo que reduce la latencia de red y mejora los tiempos de respuesta. El almacenamiento en caché almacena una copia de los datos delante del almacén de datos principal, lo que reduce la necesidad de solicitudes repetidas al back-end. Mediante el uso de servicios de cdn y almacenamiento en caché, puede optimizar el rendimiento y reducir la carga en los servidores para ahorrar costos potenciales.

  • Control de la fuente: Azure también permite establecer límites de recursos para la carga de trabajo en la nube. Al definir límites de recursos, puede asegurarse de que la carga de trabajo permanece dentro de los recursos asignados y evitar costos innecesarios. Azure proporciona varios mecanismos para establecer límites de recursos, como cuotas, directivas y alertas presupuestarias. Estos mecanismos le ayudan a supervisar y controlar el uso de recursos.

    API Management puede limitar y limitar las solicitudes. La posibilidad de limitar las solicitudes entrantes es un rol clave de Azure API Management. Ya sea mediante el control de la velocidad de solicitudes o de las solicitudes y los datos totales transferidos, Administración de API permite a los proveedores de API proteger sus API de uso indebido y crear valor para los diferentes niveles de productos de API.

Lista de comprobación de optimización de costos

Consulte el conjunto completo de recomendaciones.