Recomendações para otimizar os custos de código

Aplica-se a esta recomendação de lista de verificação de Otimização de Custos do Azure Well-Architected Framework:

CO: 11 Otimize os custos de código. Avalie e modifique o código para atender aos requisitos funcionais e não funcionais com menos recursos ou recursos mais baratos.

Este guia descreve as recomendações para otimizar os custos de código. A otimização de código é o processo de melhorar a eficiência, o desempenho e a relação custo-benefício do código do aplicativo. A otimização eficaz do código envolve fazer alterações no código para reduzir o consumo de recursos, minimizar o tempo de execução e melhorar o desempenho geral.

Ao otimizar o código, você pode identificar e eliminar ineficiências que podem levar ao aumento do consumo de recursos e custos mais altos. Você pode reduzir o tempo de processamento, o uso de memória e a sobrecarga de rede, o que pode levar a aplicativos mais rápidos e responsivos. O desempenho aprimorado aprimora a experiência do usuário e permite que seu sistema lide com cargas de trabalho maiores com eficiência.

Definições

Termo Definição
Instrumentação de código A prática de adicionar snippets de código ou bibliotecas ao código que coletam dados e monitoram o desempenho do código durante o tempo de execução.
Simultaneidade A execução de vários processos ao mesmo tempo.
Serialização de dados O processo de converter objetos de dados em um formato que pode ser armazenado ou transmitido e, em seguida, reconstruí-los de volta à sua forma original quando necessário.
Caminhos quentes Seções críticas ou executadas com frequência de um programa que exigem alto desempenho e baixa latência.

Principais estratégias de design

O código de otimização de custos significa melhorar o código para obter a mesma funcionalidade com menos recursos por instância, como ciclos de CPU, memória e armazenamento. Reduzindo o consumo de recursos, é possível economizar dinheiro quando os aplicativos lidam com grandes volumes de dados ou experimentam altas cargas de tráfego.

As melhorias de código são mais eficazes quando você está seguindo outros esforços de otimização de custos em torno de dimensionamento, dimensionamento correto, redundância e limitação. Depois de cuidar desses elementos fundamentais, você pode considerar a otimização do código.

Talvez você não saiba se tem um código ineficiente. Os recursos sem servidor, dimensionamento automático e confiabilidade podem mascarar ineficiências de código. As estratégias a seguir podem ajudá-lo a identificar e corrigir o código do aplicativo que custa mais do que deveria.

Instrumentalize seu código

Instrumentar código é a prática de adicionar trechos de código ou bibliotecas que coletam dados e monitoram o desempenho do código durante o tempo de execução. Ele permite que os desenvolvedores coletem informações sobre as principais métricas, como consumo de recursos (uso de CPU ou memória) e tempo de execução. Ao instrumentar o código, os desenvolvedores podem obter insights sobre os caminhos de acessos de código, identificar gargalos de desempenho e otimizar o código para melhor eficiência e economia.

Em um ambiente ideal, você deve fazer a análise de código no início do ciclo de vida de desenvolvimento de software. Quanto mais cedo você detectar um problema de código, mais barato será corrigi-lo.

Automatize o máximo possível dessa análise de código. Use ferramentas dinâmicas e estáticas para análise de código para reduzir o esforço manual. No entanto, lembre-se de que esse teste ainda é uma simulação de produção. A produção fornece a compreensão mais clara da otimização de código.

Compensação: As ferramentas de monitoramento de código provavelmente aumentarão os custos.

Otimize os caminhos de acesso

Ao instrumentar seu código, você pode medir o consumo de recursos de caminhos de código. Essas medidas ajudam a identificar caminhos ativos. Os caminhos ativos têm um efeito significativo no desempenho e no uso de recursos. Eles são seções críticas ou executadas com frequência de um programa que exigem alto desempenho e baixa latência.

Para identificar caminhos de acesso, considere estas tarefas:

  • Analisar dados de tempo de execução: colete e analise dados de tempo de execução para identificar áreas do código que consomem recursos significativos, como operações de CPU, memória ou E/S. Procure padrões ou seções de código que são executados com frequência ou levam muito tempo para serem concluídos.

  • Medir o desempenho: use ferramentas de criação de perfil ou estruturas de teste de desempenho para medir o tempo de execução e o consumo de recursos de caminhos de código. Essa medição ajuda a identificar gargalos e áreas de melhoria.

  • Considere a lógica de negócios e o efeito do usuário: avalie a importância dos caminhos de código com base em sua relevância para a funcionalidade do aplicativo ou operações comerciais críticas. Determine quais caminhos de código são cruciais para agregar valor aos usuários ou atender aos requisitos de desempenho.

    Revise as recomendações de desempenho específicas da linguagem de programação com a qual você está trabalhando. Avalie seu código em relação a essas recomendações para identificar áreas de melhoria. Remova todas as operações desnecessárias no caminho do código que possam afetar o desempenho.

  • Remover chamadas de função desnecessárias: revise seu código. Identifique todas as funções que não são essenciais para a funcionalidade desejada e podem afetar negativamente o desempenho. Por exemplo, se uma chamada de função executar uma validação que aconteceu anteriormente no código, você poderá remover essa chamada de função desnecessária.

  • Minimize as operações de log: o log pode ser útil para depuração e análise, mas o log excessivo pode afetar o desempenho. Avalie a necessidade de cada operação de log e remova todas as chamadas de log desnecessárias que não sejam críticas para a análise de desempenho.

  • Otimize loops e condicionais: analise loops e condicionais em seu código. Identifique quaisquer iterações ou condições desnecessárias que você possa eliminar. Simplificar e otimizar essas estruturas pode melhorar o desempenho do seu código.

  • Reduza o processamento de dados desnecessário: examine seu código em busca de operações desnecessárias de processamento de dados, como cálculos ou transformações redundantes. Elimine essas operações desnecessárias para melhorar a eficiência do seu código.

  • Minimize as solicitações de rede: se o código fizer solicitações de rede, minimize o número de solicitações e otimize seu uso. Solicitações em lote quando possível e evite viagens de ida e volta desnecessárias para melhorar o desempenho.

  • Minimize as alocações: identifique as áreas em que ocorre alocação excessiva de memória. Otimize o código reduzindo alocações desnecessárias e reutilizando os recursos existentes quando possível.

    Ao minimizar as alocações, você pode melhorar a eficiência da memória e o desempenho geral. Use as estratégias apropriadas de gerenciamento de memória e coleta de lixo para sua linguagem de programação.

  • Reduza o tamanho da estrutura de dados: avalie o tamanho de suas estruturas de dados, como classes, e identifique áreas onde a redução é possível. Revise os requisitos de dados e elimine quaisquer campos ou propriedades desnecessários. Otimize o uso da memória selecionando os tipos de dados apropriados e empacotando dados com eficiência.

  • Avalie implementações transversais: considere os efeitos de implementações transversais, como middleware ou verificações de token. Avalie se eles estão afetando negativamente o desempenho.

Compensação: a otimização de código e caminhos ativos requer experiência do desenvolvedor na identificação de ineficiências de código. Esses indivíduos altamente qualificados podem precisar gastar tempo em outras tarefas.

Avaliar o uso da simultaneidade

Avaliar o uso de simultaneidade envolve avaliar se o processamento assíncrono, multithreading ou multiprocessamento pode maximizar a utilização de recursos e reduzir despesas. Ao usar processamento assíncrono, multithreading ou multiprocessamento, é possível lidar com mais tarefas com os mesmos recursos. No entanto, é crucial garantir a implementação adequada para evitar mais sobrecarga e manter a relação custo-benefício.

Para avaliar se o uso da simultaneidade é uma boa opção, siga estas diretrizes:

  • Processamento assíncrono: o processamento assíncrono permite a execução sem bloqueio. Por exemplo, você pode iniciar um processo e pausá-lo para permitir que um segundo processo seja concluído.

    Determine os componentes de código ou operações que você pode executar de forma assíncrona. Identifique a linguagem de programação ou a estrutura que você está usando e entenda o modelo de programação assíncrona ao qual ele dá suporte, como async/await no .NET ou promessas em JavaScript.

    Reestruture seu código para usar construções de programação assíncrona habilitando a execução de tarefas sem bloqueio. Desacople operações de execução longa ou com uso intensivo de E/S do thread de execução principal usando métodos assíncronos ou retornos de chamada. Use APIs ou bibliotecas assíncronas que sua linguagem de programação ou estrutura fornece para lidar com fluxos de trabalho assíncronos.

  • Multithreading: No multithreading, você executa vários threads de um único processo simultaneamente.

    Identifique seções do seu código que você pode executar simultaneamente e de forma independente. Leia a documentação ou as diretrizes específicas da linguagem de programação ou da estrutura que você está usando para as práticas recomendadas de multithreading. Crie vários threads ou pools de threads para lidar com a execução paralela de tarefas.

    Implemente mecanismos de sincronização, como bloqueios, mutexes ou semáforos, para garantir a segurança do thread e evitar condições de corrida quando o código acessa recursos compartilhados. Considere o uso de abstrações de nível superior, como pools de threads ou bibliotecas de paralelismo baseadas em tarefas, para simplificar o gerenciamento de vários threads e simplificar o controle de simultaneidade.

  • Multiprocessamento: O multiprocessamento pode ter processos executados em paralelo. Ele pode fornecer melhor utilização de vários núcleos de CPU do que multithreading.

    Determine se a carga de trabalho ou as operações em seu código se prestam ao processamento paralelo. Identifique a linguagem de programação ou estrutura que você está usando e explore seus recursos de multiprocessamento. Por exemplo, considere o módulo de multiprocessamento em Python ou fluxos paralelos em Java. Projete seu código para dividir a carga de trabalho em várias tarefas independentes que podem ser processadas simultaneamente.

    Use APIs ou bibliotecas de multiprocessamento para criar e gerenciar processos paralelos. Distribua a carga de trabalho entre essas APIs ou bibliotecas. Para permitir a coordenação e o compartilhamento de dados entre vários processos, implemente mecanismos de comunicação como comunicação entre processos (IPC), memória compartilhada ou passagem de mensagens, dependendo da sua linguagem de programação ou estrutura.

Use os SDKs certos

Para otimização de custos, selecione SDKs projetados para otimizar o uso de recursos e melhorar o desempenho. É importante avaliar os recursos e as funcionalidades de cada SDK. Considere sua compatibilidade com sua linguagem de programação e ambiente de desenvolvimento.

Veja as diretrizes para ajudar a escolher os melhores SDKs para sua carga de trabalho:

  • Realize testes de desempenho: compare o uso de recursos e o desempenho dos SDKs por meio de testes de desempenho. Escolha o SDK que melhor atenda às suas necessidades em termos de otimização de recursos e melhoria de desempenho. Integre o SDK escolhido à sua base de código seguindo a documentação e as diretrizes fornecidas.

  • Monitorar o uso de recursos e otimizar o código: monitore o uso de recursos com o SDK implementado. Reúna insights de monitoramento e análise para otimizar seu código.

Escolha o sistema operacional certo

A maioria das linguagens de codificação pode ser executada em vários sistemas operacionais, por isso é importante avaliar seu sistema operacional em relação a alternativas mais baratas. Se um sistema operacional alternativo oferecer suporte à mesma funcionalidade ou a um custo menor, vale a pena considerar. Ao escolher um sistema operacional mais barato, você pode reduzir potencialmente o custo das taxas de licenciamento e os custos de infraestrutura.

O sistema operacional certo pode contribuir para a otimização geral de custos da sua carga de trabalho. Para escolher o sistema operacional certo para sua carga de trabalho, experimente estas atividades:

  • Avalie seus requisitos: entenda as necessidades específicas de sua carga de trabalho, incluindo as linguagens de codificação e as estruturas que você está usando. Considere quaisquer dependências ou integrações com outros sistemas.

  • Considere a compatibilidade: verifique se o sistema operacional escolhido é compatível com suas linguagens de codificação, estruturas e quaisquer bibliotecas ou ferramentas de terceiros que você usa. Verifique a documentação e o suporte da comunidade para o sistema operacional para garantir que ele tenha boa compatibilidade com sua pilha de tecnologia.

  • Avaliar a funcionalidade: determine se o sistema operacional alternativo oferece suporte à mesma funcionalidade ou funcionalidade semelhante ao seu sistema operacional atual. Avalie se ele fornece os recursos e as funcionalidades necessários que sua carga de trabalho exige.

  • Compare custos: compare os custos associados aos sistemas operacionais. Considere fatores como taxas de licenciamento, custos de suporte e requisitos de infraestrutura. Procure alternativas mais baratas que possam atender aos requisitos da sua carga de trabalho sem comprometer a funcionalidade.

  • Considere o desempenho e a otimização: avalie o desempenho e os recursos de otimização do sistema operacional alternativo. Procure benchmarks, estudos de caso ou comparações de desempenho para entender como ele se comporta em cenários do mundo real.

  • Revise a segurança e a estabilidade: avalie a segurança e a estabilidade do sistema operacional alternativo. Procure atualizações de segurança, patches e suporte da comunidade para garantir que o sistema operacional seja mantido ativamente e seguro e estável em geral.

  • Considere o suporte do fornecedor: avalie o nível de suporte do fornecedor disponível para o sistema operacional alternativo. Verifique se existem canais oficiais de suporte, documentação e uma comunidade de usuários que podem fornecer assistência se você precisar.

Otimize o tráfego de rede

Otimizar a passagem de rede é minimizar o tráfego de rede entre os componentes da carga de trabalho. A transferência de dados geralmente tem um custo associado. Ao minimizar o tráfego de rede, você pode reduzir a quantidade de dados que precisam ser transferidos e, ao mesmo tempo, reduzir os custos.

Analise sua carga de trabalho e identifique quaisquer transferências de dados desnecessárias entre componentes. Evite transferir dados redundantes ou duplicados e transmita apenas informações essenciais. Por exemplo, se um componente solicitar repetidamente os mesmos dados de outro componente, ele será um candidato à otimização. Você pode refatorar seu código para reduzir chamadas desnecessárias ou solicitações em lote, minimizando os dados transferidos. Os aplicativos podem enviar objetos inteiros ou estruturas de dados quando apenas alguns campos são necessários. Ao otimizar o código para enviar apenas os dados necessários, você minimiza o tamanho de cada transferência de dados.

Otimize os protocolos de rede

Os protocolos de rede desempenham um papel crucial na eficiência da comunicação de rede. Ao otimizar os protocolos de rede, você pode melhorar a eficiência geral da transferência de dados e reduzir o consumo de recursos.

Considere estas sugestões:

  • Escolha protocolos eficientes: selecione protocolos conhecidos por sua eficiência em termos de velocidade de transferência de dados e minimização da sobrecarga. Por exemplo, considere o uso de protocolos como HTTP/2 sobre HTTP/1.1. Esses protocolos são projetados para melhorar o desempenho, reduzindo a latência e otimizando a transferência de dados. Use bibliotecas e estruturas em seu aplicativo para usar esses protocolos.

  • Suporte à compactação: implemente mecanismos de compactação em seus protocolos de rede para reduzir o tamanho dos dados que estão sendo transferidos. A compactação pode reduzir significativamente a quantidade de dados transmitidos pela rede, levando a um melhor desempenho e redução do uso da largura de banda. A compactação do lado do servidor normalmente é habilitada no código do aplicativo ou na configuração do servidor.

  • Utilize o pool de conexões: o pool de conexões permite a reutilização de conexões de rede estabelecidas para reduzir a sobrecarga de estabelecer novas conexões para cada solicitação. O pool de conexões pode melhorar a eficiência da comunicação de rede, evitando a sobrecarga de configuração e desmontagem da conexão. Escolha uma biblioteca ou estrutura de pool de conexões e configure para atender às necessidades de carga de trabalho.

  • Implemente outras otimizações: explore outras otimizações específicas para sua carga de trabalho e ambiente de rede. Por exemplo, você pode usar cache de conteúdo, balanceamento de carga e modelagem de tráfego para otimizar ainda mais a travessia da rede.

Minimize a sobrecarga da rede

Minimize a quantidade de tráfego de rede e transferência de dados entre os componentes da carga de trabalho. Ao reduzir a sobrecarga da rede, você pode reduzir os custos associados à saída e entrada de dados e melhorar o desempenho geral da rede.

Considere estas técnicas:

  • Reduza solicitações redundantes: analise o código para identificar solicitações duplicadas ou desnecessárias. Em vez de fazer várias solicitações para os mesmos dados, você pode modificar o código para recuperar os dados uma vez e reutilizá-los conforme necessário.

  • Otimize o tamanho dos dados: revise os dados que estão sendo transmitidos entre componentes ou sistemas e procure oportunidades para minimizar seu tamanho. Considere técnicas como compactar os dados antes da transmissão ou usar formatos de dados mais eficientes. Ao reduzir o tamanho dos dados, você pode diminuir o uso da largura de banda da rede e melhorar a eficiência geral.

  • Solicitações em lote: se aplicável, considere agrupar várias solicitações menores em uma única solicitação maior. O envio em lote reduz a sobrecarga de estabelecer várias conexões e diminui a transmissão geral de dados.

  • Use serialização de dados: A serialização de dados é o processo de conversão de estruturas ou objetos de dados complexos em um formato que pode ser facilmente transmitido por uma rede ou armazenado em um sistema de armazenamento persistente. Essa estratégia envolve representar os dados em um formato padronizado, para que os dados possam ser transmitidos, processados e reconstruídos com eficiência na extremidade receptora.

    Selecione um formato de serialização compacto, rápido e adequado aos requisitos da sua carga de trabalho.

    Formato de serialização Descrição
    Buffers de protocolo (protobuf) Um formato de serialização binária que oferece codificação e decodificação eficientes de dados estruturados. Ele usa arquivos de definição tipados para definir estruturas de mensagens.
    MessagePack Um formato de serialização binária para transmissão compacta pelo fio. Ele suporta vários tipos de dados e fornece desempenho rápido de serialização e desserialização.
    JSON (JavaScript Object Notation) Um formato de serialização de dados amplamente usado que é legível por humanos e fácil de trabalhar. O JSON é baseado em texto e tem amplo suporte multiplataforma.
    JSON binário (BSON) Um formato de serialização binária semelhante ao JSON, mas projetado para serialização e desserialização eficientes. O BSON inclui tipos de dados extras que não estão disponíveis em JSON.

    Dependendo do formato de serialização, você precisa implementar a lógica para serializar objetos ou estruturas de dados no formato escolhido e desserializá-los de volta à sua forma original. Você pode implementar essa lógica usando bibliotecas ou estruturas que fornecem recursos de serialização para o formato.

Otimize o acesso aos dados

A otimização do acesso aos dados refere-se à simplificação dos padrões e técnicas de recuperação e armazenamento de dados, para minimizar operações desnecessárias. Ao otimizar o acesso aos dados, você pode economizar custos reduzindo o uso de recursos, reduzindo a recuperação de dados e melhorando a eficiência do processamento de dados. Considere técnicas como o cache de dados, a consulta eficiente de dados e a compactação de dados.

Usar mecanismos de cache

O armazenamento em cache envolve o armazenamento de dados acessados com frequência mais próximos dos componentes que os exigem. Essa técnica reduz a necessidade de travessia de rede servindo os dados do cache em vez de buscá-los pela rede.

Considere estes mecanismos de cache:

  • Use um cache externo: uma solução de cache popular é uma rede de entrega de conteúdo. Ele ajuda a minimizar a latência e reduzir a travessia da rede, armazenando em cache o conteúdo estático para mais perto dos consumidores.

  • Ajustar parâmetros de cache: configure parâmetros de cache, como tempo de vida (TTL), para otimizar o benefício do cache, minimizando possíveis desvantagens. Definir um TTL apropriado garante que os dados armazenados em cache permaneçam atualizados e relevantes.

  • Use o cache na memória: além das soluções de cache externo, considere implementar o cache na memória em seu aplicativo. O cache na memória pode ajudar a utilizar recursos de computação ociosos e aumentar a densidade de computação dos recursos alocados.

Otimize o tráfego do banco de dados

Você pode aumentar a eficiência da comunicação do aplicativo com o banco de dados. Aqui estão algumas considerações e técnicas importantes para otimizar o tráfego do banco de dados:

  • Criar índices: a indexação é o processo de criação de estruturas de dados que melhoram a velocidade de recuperação de dados. Ao criar índices em colunas consultadas com frequência, você pode reduzir significativamente o tempo necessário para executar consultas. Por exemplo, se você tiver uma tabela de usuários com uma coluna para nomes de usuário, poderá criar um índice na coluna de nome de usuário para acelerar as consultas que pesquisam nomes de usuário específicos.

    Identifique as colunas acessadas com mais frequência e crie índices nessas colunas para acelerar a recuperação de dados. Analise e otimize regularmente os índices existentes para garantir que eles ainda sejam eficazes. Evite a indexação excessiva, pois ela pode afetar negativamente as operações de inserção e atualização.

  • Otimize consultas: crie consultas eficientes considerando os requisitos de dados específicos e minimizando a recuperação desnecessária de dados. Comece usando tipos de junção apropriados (por exemplo, junção interna e junção esquerda), com base na relação entre as tabelas. Use técnicas de otimização de consulta, como dicas de consulta, análise de plano de consulta e reescrita de consulta para melhorar o desempenho.

  • Resultados da consulta de cache: você pode armazenar os resultados de consultas executadas com frequência na memória ou em um cache. As execuções subsequentes da mesma consulta podem ser atendidas a partir do cache, o que elimina a necessidade de operações caras de banco de dados.

  • Use uma estrutura de mapeamento relacional de objeto (ORM): use recursos de ORM, como carregamento lento, cache e processamento em lote, para otimizar a recuperação de dados e minimizar as viagens de ida e volta do banco de dados. Use estruturas ORM, como Entity Framework para C# ou Hibernate para Java.

  • Otimizar procedimentos armazenados: analise e otimize a lógica e o desempenho dos procedimentos armazenados. O objetivo é evitar cálculos desnecessários ou consultas redundantes em procedimentos armazenados. Otimize o uso de tabelas, variáveis e cursores temporários para minimizar o consumo de recursos.

Organizar dados

A organização de dados para acesso e recuperação eficientes envolve estruturar e armazenar dados de forma a maximizar o desempenho e minimizar o consumo de recursos. Ele pode melhorar os tempos de resposta da consulta, reduzir os custos de transferência de dados e otimizar a utilização do armazenamento.

Aqui estão algumas técnicas para organizar dados com eficiência:

  • Partição: o particionamento envolve a divisão de um grande conjunto de dados em subconjuntos menores e mais gerenciáveis, chamados partições. Você pode armazenar cada partição separadamente para permitir o processamento paralelo e melhorar o desempenho da consulta. Por exemplo, você pode particionar dados com base em um intervalo específico de valores ou distribuindo dados entre servidores. Essa técnica pode aumentar a escalabilidade, reduzir a contenção e otimizar a utilização de recursos.

  • Fragmento: Fragmentação é uma técnica de divisão horizontal de dados em várias instâncias ou servidores de banco de dados. Cada fragmento contém um subconjunto dos dados e as consultas podem ser processadas em paralelo entre esses fragmentos. A fragmentação pode melhorar o desempenho da consulta distribuindo a carga de trabalho e reduzindo a quantidade de dados que cada consulta acessa.

  • Compactação: a compactação de dados envolve a redução do tamanho dos dados para minimizar os requisitos de armazenamento e melhorar a eficiência da transferência de dados. Como os dados compactados ocupam menos espaço em disco, eles permitem economia nos custos de armazenamento. Os dados compactados também podem ser transferidos mais rapidamente pelas redes e reduzir os custos de transferência de dados.

Por exemplo, considere um cenário em que você tem um grande conjunto de dados de informações do cliente. Ao particionar os dados com base nas regiões ou dados demográficos do cliente, você pode distribuir a carga de trabalho em vários servidores e melhorar o desempenho da consulta. Você também pode compactar os dados para reduzir os custos de armazenamento e melhorar a eficiência da transferência de dados.

Otimize o design da solução

Avalie sua arquitetura de carga de trabalho para identificar oportunidades de otimização de recursos. O objetivo é usar os serviços certos para o trabalho certo.

Para atingir esse objetivo, talvez seja necessário reprojetar partes da arquitetura para usar menos recursos. Considere serviços gerenciados ou sem servidor e otimize a alocação de recursos. Ao otimizar sua arquitetura, você pode atender aos requisitos funcionais e não funcionais enquanto consome menos recursos por instância.

Usar padrões de design

Os padrões de design são soluções reutilizáveis que ajudam os desenvolvedores a resolver problemas recorrentes de design. Eles fornecem uma abordagem estruturada para projetar código eficiente, sustentável e escalonável.

Os padrões de design ajudam a otimizar o uso dos recursos do sistema, fornecendo diretrizes para alocação e gerenciamento eficientes de recursos. Por exemplo, o padrão Disjuntor ajuda a evitar o consumo desnecessário de recursos, fornecendo um mecanismo para lidar e se recuperar de falhas de maneira controlada.

Os padrões de design podem ajudar a otimizar o custo do código das seguintes maneiras:

  • Tempo de desenvolvimento reduzido: os padrões de design fornecem soluções comprovadas para problemas comuns de design, o que pode economizar tempo de desenvolvimento. Seguindo padrões estabelecidos, os desenvolvedores podem evitar o trabalho repetitivo e se concentrar na implementação dos requisitos específicos de seus aplicativos.

  • Manutenção aprimorada: os padrões de design promovem um código modular e estruturado que é mais fácil de entender, modificar e manter. Eles podem levar a economias de custos em termos de redução de esforços de depuração e manutenção.

  • Escalabilidade e desempenho: os padrões de design ajudam a projetar sistemas escaláveis e de alto desempenho. Padrões como o padrão Cache-Aside podem melhorar o desempenho armazenando em cache dados acessados com frequência para reduzir a necessidade de cálculos caros ou chamadas externas.

Para implementar padrões de design, os desenvolvedores precisam entender os princípios e diretrizes de cada padrão e aplicá-los no código. Considere identificar o padrão apropriado para um problema, entender sua estrutura e componentes e integrar o padrão ao design geral.

Vários recursos estão disponíveis, como documentação, tutoriais e código de exemplo. Esses recursos podem ajudar os desenvolvedores a aprender e implementar padrões de design de forma eficaz.

Alterar configurações

Revise e atualize regularmente sua configuração de carga de trabalho para garantir que ela esteja alinhada com seus requisitos atuais. Considere ajustar o dimensionamento de recursos e as definições de configuração com base nas demandas de carga de trabalho. Ao otimizar as configurações, você pode alocar recursos com eficiência e evitar o provisionamento excessivo para economizar custos.

Arquitetura de refatoração

Avalie sua arquitetura de carga de trabalho e identifique oportunidades de refatoração ou redesign de componentes para otimizar o consumo de recursos. Considere técnicas como adotar uma arquitetura de microsserviços, implementar o padrão Circuit Breaker e usar computação sem servidor. Ao otimizar sua arquitetura, você pode obter melhor utilização de recursos e eficiência de custos.

Modificar tamanhos de recursos

Monitore e analise continuamente a utilização de recursos de sua carga de trabalho. Com base nos padrões e tendências observados, ajuste o dimensionamento de recursos e as definições de configuração para otimizar o consumo de recursos.

Considere o dimensionamento correto de máquinas virtuais, ajuste a alocação de memória e otimização da capacidade de armazenamento. Ao redimensionar os recursos, você pode evitar custos desnecessários associados à subutilização ou ao superprovisionamento.

Compensação: o retrabalho do código e da arquitetura pode não se adequar aos cronogramas atuais do projeto e pode levar a atrasos no cronograma e no custo.

Facilitação do Azure

Código de instrumentação: o Azure fornece ferramentas de monitoramento e registro em log, como Azure Monitor, Application Insights e Log Analytics. Você pode usar essas ferramentas para rastrear e analisar o desempenho e o comportamento do seu código em tempo real.

Identificando caminhos quentes e otimizados: o Application Insights e o Application Insights Profiler ajudam a identificar e otimizar os caminhos quentes em seu código analisando os tempos de execução e o uso de recursos. Você pode minimizar alocações de memória desnecessárias e otimizar o uso de memória com o Profiler.

Usando os SDKs certos: o Azure oferece SDKs em várias linguagens de programação, otimizados para desempenho e facilidade de uso. Esses SDKs fornecem funções e bibliotecas predefinidas que interagem com os serviços do Azure para reduzir a necessidade de implementação personalizada.

Otimizando a passagem de rede: vários serviços do Azure dão suporte a protocolos de rede de alta velocidade, como HTTP/2 e QUIC , para comunicação eficiente entre serviços e aplicativos.

Os serviços do Azure, como o Banco de Dados do Azure para PostgreSQL – Servidor Flexível, dão suporte ao pool de conexões.

O Azure dá suporte ao processamento em lotes em vários serviços, para que você possa agrupar várias operações e executá-las em uma única solicitação. O processamento em lote pode melhorar significativamente a eficiência e reduzir a sobrecarga da rede.

Em relação à serialização de dados, o Azure dá suporte a vários formatos de serialização, incluindo JSON e XML. Escolha o formato de serialização apropriado com base no tamanho dos dados, requisitos de desempenho e necessidades de interoperabilidade.

Otimizando o acesso a dados: o Azure fornece serviços de cache, como o Cache do Azure para Redis. Você pode usar o cache para armazenar dados acessados com frequência mais perto do aplicativo, o que resulta em recuperação mais rápida e carga de back-end reduzida.

  • Indexação e otimização de consulta: os serviços do Azure, como o Banco de Dados SQL do Azure e o Azure Cosmos DB , fornecem recursos de indexação para otimizar o desempenho da consulta. Ao escolher a estratégia de indexação correta e otimizar as consultas, você pode melhorar a eficiência geral da recuperação de dados.

  • ORM (mapeamento relacional de objeto): o Azure dá suporte a estruturas ORM como o Entity Framework. Essas estruturas simplificam o acesso a dados e o mapeamento entre código orientado a objetos e bancos de dados relacionais ou NoSQL.

  • Otimizando procedimentos armazenados: você pode usar serviços do Azure, como o Banco de Dados SQL do Azure, para criar e otimizar procedimentos armazenados. Os procedimentos armazenados podem melhorar o desempenho reduzindo as viagens de ida e volta da rede e pré-compilando instruções SQL.

  • Particionamento e fragmentação: o Azure oferece recursos de particionamento e fragmentação em serviços como o Azure Cosmos DB e o Banco de Dados SQL do Azure. Você pode usar o particionamento para distribuir dados entre vários nós para escalabilidade e otimização de desempenho.

  • Compactação de dados: os serviços do Azure dão suporte a técnicas de compactação de dados, como GZIP e DEFLATE.

Otimizando a arquitetura: o Azure fornece diretrizes arquitetônicas e padrões de design para criar aplicativos escalonáveis, resilientes e de alto desempenho. Para obter mais informações, consulte Padrões de design.

Lista de verificação de otimização de custos

Consulte o conjunto completo de recomendações.