Share via


Recomendaciones para optimizar los costos de código

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

CO:11 Optimice los costos de código. Evalúe y modifique el código para cumplir los requisitos funcionales y no funcionales con menos recursos o más baratos.

En esta guía se describen las recomendaciones para optimizar los costos de código. La optimización del código es el proceso de mejorar la eficiencia, el rendimiento y la rentabilidad del código de aplicación. La optimización eficaz del código implica realizar cambios en el código para reducir el consumo de recursos, minimizar el tiempo de ejecución y mejorar el rendimiento general.

Al optimizar el código, puede identificar y eliminar las ineficiencias que podrían dar lugar a un mayor consumo de recursos y mayores costos. Puede reducir el tiempo de procesamiento, el uso de memoria y la sobrecarga de red, lo que puede provocar que las aplicaciones sean más rápidas y con mayor capacidad de respuesta. El rendimiento mejorado mejora la experiencia del usuario y permite que el sistema controle cargas de trabajo de mayor tamaño de forma eficaz.

Definiciones

Término Definición
Instrumentación de código La práctica de agregar fragmentos de código o bibliotecas a código que recopilan datos y supervisan el rendimiento del código durante el tiempo de ejecución.
Simultaneidad Ejecución de varios procesos al mismo tiempo.
Serialización de datos Proceso de conversión de objetos de datos en un formato que se puede almacenar o transmitir y, a continuación, reconstruirlos de nuevo a su forma original cuando sea necesario.
Rutas de acceso activas Secciones críticas o con frecuencia de ejecución de un programa que requieren un alto rendimiento y una latencia baja.

Estrategias de diseño principales

La optimización de costos de código significa mejorar el código para lograr la misma funcionalidad con menos recursos por instancia, como ciclos de CPU, memoria y almacenamiento. Al reducir el consumo de recursos, puede ahorrar dinero cuando las aplicaciones controlan grandes volúmenes de datos o experimentan cargas de tráfico elevadas.

Las mejoras de código son más eficaces cuando se siguen otros esfuerzos de optimización de costos en torno al escalado, la rightsización, la redundancia y la limitación. Después de ocuparse de estos elementos fundamentales, puede considerar la optimización del código.

Es posible que no sepa si tiene código ineficaz. Las características sin servidor, escalabilidad automática y confiabilidad pueden enmascarar las ineficiencias de código. Las estrategias siguientes pueden ayudarle a identificar y corregir el código de aplicación que cuesta más de lo que debería.

Instrumentación del código

La instrumentación de código es la práctica de agregar fragmentos de código o bibliotecas que recopilan datos y supervisan el rendimiento del código durante el tiempo de ejecución. Permite a los desarrolladores recopilar información sobre las métricas clave, como el consumo de recursos (uso de CPU o memoria) y el tiempo de ejecución. Mediante la instrumentación de código, los desarrolladores pueden obtener información sobre las rutas de acceso activas del código, identificar cuellos de botella de rendimiento y optimizar el código para mejorar la eficiencia y la rentabilidad.

En un entorno ideal, debe realizar análisis de código al principio del ciclo de vida de desarrollo de software. Lo anterior detecta un problema de código, lo más barato es corregirlo.

Automatice la mayor parte de este análisis de código como sea posible. Use herramientas dinámicas y estáticas para el análisis de código para reducir el esfuerzo manual. Sin embargo, tenga en cuenta que esta prueba sigue siendo una simulación de producción. La producción proporciona la comprensión más clara de la optimización del código.

Compensación: es probable que las herramientas de supervisión de código aumenten los costos.

Identificación y optimización de rutas de acceso activas

Al instrumentar el código, puede medir el consumo de recursos de las rutas de acceso de código. Estas medidas le ayudan a identificar las rutas de acceso activas. Las rutas de acceso activas tienen un efecto significativo en el rendimiento y el uso de recursos. Son secciones críticas o que se ejecutan con frecuencia de un programa que requieren un alto rendimiento y una latencia baja.

Para identificar las rutas de acceso activas, tenga en cuenta estas tareas:

  • Analizar datos en tiempo de ejecución: recopile y analice los datos en tiempo de ejecución para identificar las áreas del código que consumen recursos significativos, como las operaciones de CPU, memoria o E/S. Busque patrones o secciones de código que se ejecuten con frecuencia o tarden mucho tiempo en completarse.

  • Medir el rendimiento: use herramientas de generación de perfiles o marcos de pruebas de rendimiento para medir el tiempo de ejecución y el consumo de recursos de las rutas de acceso de código. Esta medida ayuda a identificar cuellos de botella y áreas para mejorar.

  • Considere la lógica de negocios y el efecto del usuario: evalúe la importancia de las rutas de acceso de código en función de su relevancia con la funcionalidad de la aplicación o las operaciones empresariales críticas. Determine qué rutas de acceso de código son cruciales para entregar valor a los usuarios o cumplir los requisitos de rendimiento.

    Revise las recomendaciones de rendimiento específicas del lenguaje de programación con el que está trabajando. Evalúe el código con estas recomendaciones para identificar las áreas de mejora. Quite las operaciones innecesarias dentro de la ruta de acceso del código que puedan afectar al rendimiento.

  • Quitar llamadas a funciones innecesarias: revise el código. Identifique las funciones que no son esenciales para la funcionalidad deseada y podría afectar negativamente al rendimiento. Por ejemplo, si una llamada de función realiza una validación que se produjo anteriormente en el código, puede quitar esa llamada de función innecesaria.

  • Minimizar las operaciones de registro: el registro puede ser útil para la depuración y el análisis, pero el registro excesivo puede afectar al rendimiento. Evalúe la necesidad de cada operación de registro y quite las llamadas de registro innecesarias que no sean críticas para el análisis de rendimiento.

  • Optimización de bucles y condicionales: analice bucles y condicionales en el código. Identifique las iteraciones o condiciones innecesarias que pueda eliminar. Simplificar y optimizar estas estructuras puede mejorar el rendimiento del código.

  • Reducir el procesamiento de datos innecesario: revise el código para ver si hay operaciones innecesarias de procesamiento de datos, como cálculos redundantes o transformaciones. Elimine estas operaciones innecesarias para mejorar la eficacia del código.

  • Minimizar las solicitudes de red: si el código realiza solicitudes de red, minimice el número de solicitudes y optimice su uso. Las solicitudes por lotes siempre que sea posible y eviten recorridos de ida y vuelta innecesarios para mejorar el rendimiento.

  • Minimizar asignaciones: identifique las áreas en las que se produce una asignación excesiva de memoria. Optimice el código reduciendo las asignaciones innecesarias y reutilizando los recursos existentes siempre que sea posible.

    Al minimizar las asignaciones, puede mejorar la eficiencia de la memoria y el rendimiento general. Use las estrategias adecuadas de administración de memoria y recolección de elementos no utilizados para el lenguaje de programación.

  • Reducir el tamaño de la estructura de datos: evalúe el tamaño de las estructuras de datos, como las clases, e identifique las áreas donde sea posible la reducción. Revise los requisitos de datos y elimine los campos o propiedades innecesarios. Optimice el uso de memoria seleccionando los tipos de datos adecuados y empaquetando los datos de forma eficaz.

  • Evaluar implementaciones transversales: tenga en cuenta los efectos de las implementaciones transversales, como middleware o comprobaciones de tokens. Evalúe si afectan negativamente al rendimiento.

Compensación: la optimización del código y las rutas de acceso activas requiere la experiencia del desarrollador en la identificación de las ineficiencias del código. Estos individuos altamente cualificados pueden necesitar dedicar tiempo a otras tareas.

Evaluación del uso de la simultaneidad

Evaluar el uso de simultaneidad implica evaluar si el procesamiento asincrónico, el multiprocesamiento o el multiprocesamiento pueden maximizar el uso de recursos y reducir los gastos. Mediante el procesamiento asincrónico, el multiprocesamiento o el multiprocesamiento, puede controlar más tareas con los mismos recursos. Sin embargo, es fundamental garantizar una implementación adecuada para evitar una mayor sobrecarga y mantener la rentabilidad.

Para evaluar si el uso de la simultaneidad es una buena opción, puede seguir estas instrucciones:

  • Procesamiento asincrónico: el procesamiento asincrónico permite la ejecución sin bloqueo. Por ejemplo, puede iniciar un proceso y, a continuación, pausarlo para permitir que finalice un segundo proceso.

    Determine los componentes de código o las operaciones que puede ejecutar de forma asincrónica. Identifique el lenguaje de programación o el marco de trabajo que usa y comprenda el modelo de programación asincrónico que admite, como async/await en .NET o promesas en JavaScript.

    Reestructure el código para usar construcciones de programación asincrónicas mediante la habilitación de la ejecución sin bloqueo de tareas. Desacopla las operaciones de ejecución prolongada o intensivas de E/S del subproceso de ejecución principal mediante métodos asincrónicos o devoluciones de llamada. Use las API o bibliotecas asincrónicas que proporciona el lenguaje de programación o el marco para controlar los flujos de trabajo asincrónicos.

  • Multithreading: en multithreading, se ejecutan varios subprocesos de un solo proceso simultáneamente.

    Identifique las secciones del código que puede ejecutar simultáneamente e independientemente. Lea la documentación o las instrucciones específicas del lenguaje de programación o el marco de trabajo que usa para los procedimientos recomendados de multithreading. Cree varios subprocesos o grupos de subprocesos para controlar la ejecución paralela de tareas.

    Implemente mecanismos de sincronización, como bloqueos, exclusiones mutuas o semáforos, para garantizar la seguridad de los subprocesos y evitar condiciones de carrera cuando el código accede a los recursos compartidos. Considere la posibilidad de usar abstracciones de nivel superior, como grupos de subprocesos o bibliotecas de paralelismo basadas en tareas, para simplificar la administración de varios subprocesos y simplificar el control de simultaneidad.

  • Multiprocesamiento: el multiprocesamiento puede hacer que los procesos se ejecuten en paralelo. Puede proporcionar un mejor uso de varios núcleos de CPU que multithreading.

    Determine si la carga de trabajo o las operaciones del código se prestan al procesamiento paralelo. Identifique el lenguaje de programación o el marco de trabajo que usa y explore sus funcionalidades de multiprocesamiento. Por ejemplo, considere el módulo de multiprocesamiento en Python o secuencias paralelas en Java. Diseñe el código para dividir la carga de trabajo en varias tareas independientes que se pueden procesar simultáneamente.

    Use las API o bibliotecas de multiprocesamiento para crear y administrar procesos paralelos. Distribuya la carga de trabajo entre estas API o bibliotecas. Para habilitar la coordinación y el uso compartido de datos entre varios procesos, implemente mecanismos de comunicación como la comunicación entre procesos (IPC), la memoria compartida o el paso de mensajes, en función del lenguaje de programación o del marco.

Uso de los SDK adecuados

Para la optimización de costos, seleccione SDK diseñados para optimizar el uso de recursos y mejorar el rendimiento. Es importante evaluar las características y funcionalidades de cada SDK. Tenga en cuenta su compatibilidad con el lenguaje de programación y el entorno de desarrollo.

Estas son las instrucciones para ayudar a elegir los mejores SDK para la carga de trabajo:

  • Realizar pruebas de rendimiento: compare el uso de recursos y el rendimiento de los SDK mediante pruebas de rendimiento. Elija el SDK que mejor se adapte a sus necesidades en términos de optimización de recursos y mejora del rendimiento. Integre el SDK elegido en el código base siguiendo la documentación y las directrices proporcionadas.

  • Supervisión del uso de recursos y optimización de código: supervise el uso de recursos con el SDK implementado. Recopile información de supervisión y análisis para optimizar el código.

Elegir el sistema operativo adecuado

La mayoría de los lenguajes de codificación se pueden ejecutar en varios sistemas operativos, por lo que es importante evaluar el sistema operativo frente a alternativas más baratas. Si un sistema operativo alternativo admite la misma funcionalidad o similar a un costo menor, merece la pena tener en cuenta. Al elegir un sistema operativo más barato, puede reducir el costo de las tarifas de licencia y los costos de infraestructura.

El sistema operativo adecuado puede contribuir a la optimización general de costos para la carga de trabajo. Para elegir el sistema operativo adecuado para la carga de trabajo, pruebe estas actividades:

  • Evaluar los requisitos: comprenda las necesidades específicas de la carga de trabajo, incluidos los lenguajes de codificación y los marcos que usa. Tenga en cuenta las dependencias o integraciones con otros sistemas.

  • Considere la compatibilidad: asegúrese de que el sistema operativo que elija sea compatible con los lenguajes de codificación, los marcos y las bibliotecas o herramientas de terceros que use. Compruebe la documentación y el soporte técnico de la comunidad para el sistema operativo para asegurarse de que tiene una buena compatibilidad con la pila de tecnología.

  • Evaluar funcionalidad: determine si el sistema operativo alternativo admite la misma o similar funcionalidad que el sistema operativo actual. Evalúe si proporciona las características y funcionalidades necesarias que requiere la carga de trabajo.

  • Comparar costos: compare los costos asociados a los sistemas operativos. Tenga en cuenta factores como las tarifas de licencia, los costos de soporte técnico y los requisitos de infraestructura. Busque alternativas más baratas que puedan cumplir los requisitos de la carga de trabajo sin poner en peligro la funcionalidad.

  • Considere el rendimiento y la optimización: evalúe las capacidades de rendimiento y optimización del sistema operativo alternativo. Busque pruebas comparativas, casos prácticos o comparaciones de rendimiento para comprender cómo funciona en escenarios reales.

  • Revisar la seguridad y la estabilidad: evalúe la seguridad y la estabilidad del sistema operativo alternativo. Busque actualizaciones de seguridad, revisiones y soporte técnico de la comunidad para asegurarse de que el sistema operativo se mantiene activamente y es seguro y estable en general.

  • Considere la posibilidad de admitir el proveedor: evalúe el nivel de soporte técnico del proveedor que está disponible para el sistema operativo alternativo. Compruebe si hay canales de soporte técnico oficiales, documentación y una comunidad de usuarios que pueden proporcionar asistencia si lo necesita.

Optimización del recorrido de red

Optimizar el recorrido de red consiste en minimizar el tráfico de red entre los componentes de carga de trabajo. La transferencia de datos suele tener un costo asociado. Al minimizar el tráfico de red, puede reducir la cantidad de datos que se deben transferir al reducir los costos.

Analice la carga de trabajo e identifique las transferencias de datos innecesarias entre los componentes. Evite transferir datos redundantes o duplicados y transmitir solo información esencial. Por ejemplo, si un componente solicita repetidamente los mismos datos de otro componente, es un candidato para la optimización. Puede refactorizar el código para reducir las llamadas innecesarias o las solicitudes por lotes, lo que minimiza los datos transferidos. Las aplicaciones pueden enviar objetos completos o estructuras de datos cuando solo se necesitan unos pocos campos. Al optimizar el código para enviar solo los datos necesarios, se minimiza el tamaño de cada transferencia de datos.

Optimización de protocolos de red

Los protocolos de red desempeñan un papel fundamental en la eficiencia de la comunicación de red. Al optimizar los protocolos de red, puede mejorar la eficiencia general de la transferencia de datos y reducir el consumo de recursos.

Tenga en cuenta estas sugerencias:

  • Elegir protocolos eficaces: seleccione los protocolos conocidos por su eficacia en términos de velocidad de transferencia de datos y minimización de la sobrecarga. Por ejemplo, considere la posibilidad de usar protocolos como HTTP/2 a través de HTTP/1.1. Estos protocolos están diseñados para mejorar el rendimiento al reducir la latencia y optimizar la transferencia de datos. Use bibliotecas y marcos en la aplicación para usar estos protocolos.

  • Compatibilidad con la compresión: implemente mecanismos de compresión en los protocolos de red para reducir el tamaño de los datos que se transfieren. La compresión puede reducir significativamente la cantidad de datos transmitidos a través de la red, lo que permite mejorar el rendimiento y reducir el uso del ancho de banda. La compresión del lado servidor se habilita normalmente en el código de aplicación o en la configuración del servidor.

  • Uso de la agrupación de conexiones: la agrupación de conexiones permite reutilizar las conexiones de red establecidas para reducir la sobrecarga de establecer nuevas conexiones para cada solicitud. La agrupación de conexiones puede mejorar la eficacia de la comunicación de red evitando la sobrecarga de la configuración y el desmontaje de la conexión. Elija una biblioteca o marco de agrupación de conexiones y configúrela para satisfacer las necesidades de la carga de trabajo.

  • Implementar otras optimizaciones: explore otras optimizaciones específicas de la carga de trabajo y el entorno de red. Por ejemplo, puede usar el almacenamiento en caché de contenido, el equilibrio de carga y el modelado del tráfico para optimizar aún más el recorrido de red.

Minimizar la sobrecarga de red

Minimice la cantidad de tráfico de red y la transferencia de datos entre los componentes de la carga de trabajo. Al reducir la sobrecarga de red, puede reducir los costos asociados a la salida y entrada de datos y mejorar el rendimiento general de la red.

Tenga en cuenta estas técnicas:

  • Reducir las solicitudes redundantes: analice el código para identificar las solicitudes duplicadas o innecesarias. En lugar de realizar varias solicitudes para los mismos datos, puede modificar el código para recuperar los datos una vez y reutilizarlos según sea necesario.

  • Optimizar el tamaño de los datos: revise los datos que se transmiten entre componentes o sistemas y busque oportunidades para minimizar su tamaño. Considere técnicas como comprimir los datos antes de la transmisión o usar formatos de datos más eficaces. Al reducir el tamaño de los datos, puede reducir el uso del ancho de banda de red y mejorar la eficacia general.

  • Solicitudes por lotes: si procede, considere la posibilidad de procesar por lotes varias solicitudes más pequeñas en una sola solicitud mayor. El procesamiento por lotes reduce la sobrecarga de establecer varias conexiones y reduce la transmisión general de datos.

  • Uso de la serialización de datos: la serialización de datos es el proceso de convertir estructuras de datos complejas u objetos en un formato que se pueda transmitir fácilmente a través de una red o almacenarse en un sistema de almacenamiento persistente. Esta estrategia implica representar los datos en un formato estandarizado, por lo que los datos se pueden transmitir, procesar y reconstruir de forma eficaz en el extremo receptor.

    Seleccione un formato de serialización compacto, rápido y adecuado para los requisitos de la carga de trabajo.

    Formato de serialización Descripción
    Protocol Buffers (protobuf) Un formato de serialización binaria que ofrece codificación y descodificación eficaces de datos estructurados. Usa archivos de definición con tipo para definir estructuras de mensajes.
    MessagePack Formato de serialización binaria para la transmisión compacta a través de la conexión. Admite varios tipos de datos y proporciona un rendimiento rápido de serialización y deserialización.
    Notación de objetos JavaScript (JSON) Un formato de serialización de datos ampliamente utilizado que es legible y fácil de usar. JSON se basa en texto y tiene una amplia compatibilidad multiplataforma.
    JSON binario (BSON) Un formato de serialización binaria similar a JSON, pero diseñado para una serialización y deserialización eficaces. BSON incluye tipos de datos adicionales que no están disponibles en JSON.

    En función del formato de serialización, debe implementar lógica para serializar objetos o estructuras de datos en el formato elegido y deserializarlos de nuevo en su forma original. Puede implementar esta lógica mediante bibliotecas o marcos que proporcionan funcionalidades de serialización para el formato.

Optimización del acceso a datos

Optimizar el acceso a datos hace referencia a la simplificación de los patrones y técnicas para recuperar y almacenar datos, con el fin de minimizar las operaciones innecesarias. Al optimizar el acceso a los datos, puede ahorrar costos al reducir el uso de recursos, reducir la recuperación de datos y mejorar la eficacia del procesamiento de datos. Considere técnicas como el almacenamiento en caché de datos, la consulta de datos eficaz y la compresión de datos.

Uso de mecanismos de almacenamiento en caché

El almacenamiento en caché implica almacenar datos a los que se accede con frecuencia más cerca de los componentes que lo requieren. Esta técnica reduce la necesidad de recorrer la red al atender los datos de la memoria caché en lugar de capturarlos a través de la red.

Tenga en cuenta estos mecanismos de almacenamiento en caché:

  • Usar una caché externa: una solución de almacenamiento en caché popular es una red de entrega de contenido. Ayuda a minimizar la latencia y reducir el recorrido de red mediante el almacenamiento en caché de contenido estático más cercano a los consumidores.

  • Ajuste de los parámetros de almacenamiento en caché: configure parámetros de almacenamiento en caché, como el período de vida (TTL), para optimizar la ventaja del almacenamiento en caché y minimizar posibles inconvenientes. Establecer un TTL adecuado garantiza que los datos almacenados en caché permanezcan actualizados y relevantes.

  • Uso del almacenamiento en caché en memoria: además de las soluciones de almacenamiento en caché externas, considere la posibilidad de implementar el almacenamiento en caché en memoria en la aplicación. El almacenamiento en caché en memoria puede ayudar a usar recursos de proceso inactivos y aumentar la densidad de proceso de los recursos asignados.

Optimización del tráfico de la base de datos

Puede mejorar la eficacia de la comunicación de la aplicación con la base de datos. Estas son algunas consideraciones y técnicas clave para optimizar el tráfico de base de datos:

  • Crear índices: la indexación es el proceso de creación de estructuras de datos que mejoran la velocidad de recuperación de datos. Al crear índices en columnas consultadas con frecuencia, puede reducir significativamente el tiempo necesario para ejecutar consultas. Por ejemplo, si tiene una tabla de usuarios con una columna para nombres de usuario, puede crear un índice en la columna nombre de usuario para acelerar las consultas que buscan nombres de usuario específicos.

    Identifique las columnas a las que se accede con más frecuencia y cree índices en esas columnas para acelerar la recuperación de datos. Analice y optimice periódicamente los índices existentes para asegurarse de que siguen siendo eficaces. Evite la sobreindización porque puede afectar negativamente a las operaciones de inserción y actualización.

  • Optimizar consultas: diseñe consultas eficaces teniendo en cuenta los requisitos de datos específicos y minimizando la recuperación de datos innecesaria. Empiece por usar los tipos de combinación adecuados (por ejemplo, combinación interna y combinación izquierda), en función de la relación entre tablas. Use técnicas de optimización de consultas, como sugerencias de consulta, análisis de planes de consulta y reescritura de consultas para mejorar el rendimiento.

  • Resultados de la consulta de caché: puede almacenar los resultados de las consultas que se ejecutan con frecuencia en la memoria o en una memoria caché. Las ejecuciones posteriores de la misma consulta se pueden servir desde la memoria caché, lo que elimina la necesidad de operaciones costosas de base de datos.

  • Use un marco de asignación relacional de objetos (ORM): Use características orm, como la carga diferida, el almacenamiento en caché y el procesamiento por lotes para optimizar la recuperación de datos y minimizar los recorridos de ida y vuelta de la base de datos. Use marcos ORM, como Entity Framework para C# o Hibernate para Java.

  • Optimizar procedimientos almacenados: analice y optimice la lógica y el rendimiento de los procedimientos almacenados. El objetivo es evitar cálculos innecesarios o consultas redundantes en procedimientos almacenados. Optimice el uso de tablas, variables y cursores temporales para minimizar el consumo de recursos.

Organización de datos

La organización de datos para un acceso y recuperación eficaces implica estructurar y almacenar datos de forma que maximice el rendimiento y minimice el consumo de recursos. Puede mejorar los tiempos de respuesta de las consultas, reducir los costos de transferencia de datos y optimizar el uso del almacenamiento.

Estas son algunas técnicas para organizar los datos de forma eficaz:

  • Partición: la creación de particiones implica dividir un conjunto de datos grande en subconjuntos más pequeños y administrables denominados particiones. Puede almacenar cada partición por separado para permitir el procesamiento paralelo y mejorar el rendimiento de las consultas. Por ejemplo, puede particionar los datos en función de un intervalo específico de valores o distribuir datos entre servidores. Esta técnica puede mejorar la escalabilidad, reducir la contención y optimizar el uso de recursos.

  • Partición: el particionamiento es una técnica de dividir horizontalmente los datos entre varias instancias o servidores de base de datos. Cada partición contiene un subconjunto de los datos y las consultas se pueden procesar en paralelo entre estas particiones. El particionamiento puede mejorar el rendimiento de las consultas mediante la distribución de la carga de trabajo y la reducción de la cantidad de datos a los que accede cada consulta.

  • Comprimir: la compresión de datos implica reducir el tamaño de los datos para minimizar los requisitos de almacenamiento y mejorar la eficacia de la transferencia de datos. Dado que los datos comprimidos tardan menos espacio en disco, permite ahorrar en los costos de almacenamiento. Los datos comprimidos también se pueden transferir más rápidamente a través de redes y reducir los costos de transferencia de datos.

Por ejemplo, considere un escenario en el que tiene un gran conjunto de datos de información del cliente. Al particionar los datos en función de las regiones del cliente o los datos demográficos, puede distribuir la carga de trabajo entre varios servidores y mejorar el rendimiento de las consultas. También puede comprimir los datos para reducir los costos de almacenamiento y mejorar la eficacia de la transferencia de datos.

Optimización de la arquitectura

Evalúe la arquitectura de la carga de trabajo para identificar las oportunidades de optimización de recursos. El objetivo es usar los servicios adecuados para el trabajo adecuado.

Para alcanzar este objetivo, es posible que tenga que rediseñar partes de la arquitectura para usar menos recursos. Considere los servicios sin servidor o administrados y optimice la asignación de recursos. Al optimizar la arquitectura, puede cumplir los requisitos funcionales y no funcionales al tiempo que consume menos recursos por instancia.

Uso de patrones de diseño

Los patrones de diseño son soluciones reutilizables que ayudan a los desarrolladores a resolver problemas de diseño periódicos. Proporcionan un enfoque estructurado para diseñar código eficaz, fácil de mantener y escalar.

Los patrones de diseño ayudan a optimizar el uso de recursos del sistema proporcionando directrices para la administración y la asignación de recursos eficientes. Por ejemplo, el patrón Circuit Breaker ayuda a evitar el consumo innecesario de recursos proporcionando un mecanismo para controlar y recuperarse de errores de una manera controlada.

Los patrones de diseño pueden ayudar a optimizar el costo del código de las siguientes maneras:

  • Menor tiempo de desarrollo: los patrones de diseño proporcionan soluciones probadas a problemas comunes de diseño, lo que puede ahorrar tiempo de desarrollo. Siguiendo los patrones establecidos, los desarrolladores pueden evitar el trabajo repetitivo y centrarse en implementar los requisitos específicos de sus aplicaciones.

  • Mejora del mantenimiento: los patrones de diseño promueven código modular y estructurado que es más fácil de entender, modificar y mantener. Pueden dar lugar a ahorros de costos en términos de esfuerzos reducidos de depuración y mantenimiento.

  • Escalabilidad y rendimiento: los patrones de diseño ayudan a diseñar sistemas escalables y eficaces. Los patrones como el patrón de Cache-Aside pueden mejorar el rendimiento mediante el almacenamiento en caché de datos a los que se accede con frecuencia para reducir la necesidad de cálculos costosos o llamadas externas.

Para implementar patrones de diseño, los desarrolladores deben comprender los principios y directrices de cada patrón y aplicarlos en el código. Considere la posibilidad de identificar el patrón adecuado para un problema, comprender su estructura y componentes e integrar el patrón en el diseño general.

Hay varios recursos disponibles, como documentación, tutoriales y código de ejemplo. Estos recursos pueden ayudar a los desarrolladores a aprender e implementar patrones de diseño de forma eficaz.

Cambiar configuraciones

Revise y actualice periódicamente la configuración de la carga de trabajo para asegurarse de que se alinea con los requisitos actuales. Considere la posibilidad de ajustar el tamaño de los recursos y las opciones de configuración en función de las demandas de carga de trabajo. Al optimizar las configuraciones, puede asignar recursos de forma eficaz y evitar el sobreaprovisionamiento para ahorrar costos.

Arquitectura de refactorización

Evalúe la arquitectura de la carga de trabajo e identifique las oportunidades de refactorización o rediseño de los componentes para optimizar el consumo de recursos. Considere técnicas como la adopción de una arquitectura de microservicios, la implementación del patrón Circuit Breaker y el uso de la informática sin servidor. Al optimizar la arquitectura, puede lograr un mejor uso de recursos y rentabilidad.

Modificación de tamaños de recursos

Supervise y analice continuamente el uso de recursos de la carga de trabajo. En función de los patrones y tendencias observados, ajuste el tamaño de los recursos y las opciones de configuración para optimizar el consumo de recursos.

Considere la posibilidad de asignar derechos a las máquinas virtuales, ajustar la asignación de memoria y optimizar la capacidad de almacenamiento. Al asignar derechos a los recursos, puede evitar costos innecesarios asociados con la infrautilización o el sobreaprovisionamiento.

Compensación: es posible que el código y la arquitectura de reelaboración no se ajusten a las programaciones actuales del proyecto y podrían dar lugar a la programación y la lista de deslizamiento de costos.

Facilitación de Azure

Código de instrumentación: Azure proporciona herramientas de supervisión y registro como Azure Monitor, Application Insights y Log Analytics. Puede usar estas herramientas para realizar un seguimiento y analizar el rendimiento y el comportamiento del código en tiempo real.

Identificación de rutas de acceso activas y optimizadas: Application Insights y Application Insights Profiler ayudan a identificar y optimizar las rutas de acceso activas en el código mediante el análisis de los tiempos de ejecución y el uso de recursos. Puede minimizar las asignaciones de memoria innecesarias y optimizar el uso de memoria con Profiler.

Uso de los SDK adecuados: Azure ofrece SDK en varios lenguajes de programación, optimizados para el rendimiento y facilidad de uso. Estos SDK proporcionan funciones y bibliotecas precompiladas que interactúan con los servicios de Azure para reducir la necesidad de implementación personalizada.

Optimización del recorrido de red: varios servicios de Azure admiten protocolos de red de alta velocidad como HTTP/2 y QUIC para una comunicación eficaz entre servicios y aplicaciones.

Los servicios de Azure, como Azure Database for PostgreSQL: servidor flexible, admiten la agrupación de conexiones.

Azure admite el procesamiento por lotes en varios servicios, por lo que puede agrupar varias operaciones y ejecutarlas en una sola solicitud. El procesamiento por lotes puede mejorar significativamente la eficiencia y reducir la sobrecarga de red.

Con respecto a la serialización de datos, Azure admite varios formatos de serialización, incluidos JSON y XML. Elija el formato de serialización adecuado en función del tamaño de los datos, los requisitos de rendimiento y las necesidades de interoperabilidad.

Optimización del acceso a datos: Azure proporciona servicios de almacenamiento en caché como Azure Cache for Redis. Puede usar el almacenamiento en caché para almacenar los datos a los que se accede con frecuencia más cerca de la aplicación, lo que da como resultado una recuperación más rápida y una carga de back-end reducida.

  • Indexación y optimización de consultas: Los servicios de Azure, como Azure SQL Database y Azure Cosmos DB, proporcionan funcionalidades de indexación para optimizar el rendimiento de las consultas. Al elegir la estrategia de indexación adecuada y optimizar las consultas, puede mejorar la eficacia general de la recuperación de datos.

  • Asignación relacional de objetos (ORM): Azure admite marcos ORM, como Entity Framework. Estos marcos simplifican el acceso y la asignación de datos entre el código orientado a objetos y las bases de datos relacionales o NoSQL.

  • Optimización de procedimientos almacenados: Puede usar servicios de Azure como Azure SQL Database para crear y optimizar procedimientos almacenados. Los procedimientos almacenados pueden mejorar el rendimiento al reducir los recorridos de ida y vuelta de red y precompilar instrucciones SQL.

  • Creación de particiones y particionamiento: Azure ofrece funcionalidades de partición y particionamiento en servicios como Azure Cosmos DB y Azure SQL Database. Puede usar la creación de particiones para distribuir datos entre varios nodos para optimizar la escalabilidad y el rendimiento.

  • Compresión de datos: Los servicios de Azure admiten técnicas de compresión de datos como GZIP y DEFLATE.

Optimización de la arquitectura: Azure proporciona instrucciones arquitectónicas y patrones de diseño para diseñar aplicaciones escalables, resistentes y eficaces. Para obtener más información, consulte Patrones de diseño.

Lista de comprobación de optimización de costos

Consulte el conjunto completo de recomendaciones.