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 mais baratos. |
---|
Este guia descreve as recomendações para otimizar os custos do 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 dos custos. 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 melhorado melhora a experiência do utilizador e permite que o seu sistema lide com cargas de trabalho maiores de forma eficiente.
Definições
Termo | Definição |
---|---|
Instrumentação de código | A prática de adicionar trechos 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 frequentemente executadas de um programa que exigem alto desempenho e baixa latência. |
Principais estratégias de design
Otimizar o código significa melhorar o código para obter a mesma funcionalidade com menos recursos por instância, como ciclos de CPU, memória e armazenamento. Ao reduzir o consumo de recursos, você pode economizar dinheiro quando os aplicativos lidam com grandes volumes de dados ou enfrentam 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 escalabilidade, direitos, redundância e limitação. Depois de cuidar desses elementos fundamentais, você pode considerar a otimização de código.
Talvez você não saiba se tem um código ineficiente. 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.
Instrumente o seu código
A instrumentação de 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 reúnam informações sobre métricas-chave, como consumo de recursos (uso de CPU ou memória) e tempo de execução. Ao instrumentar o código, os desenvolvedores podem obter informações sobre os caminhos quentes do código, identificar gargalos de desempenho e otimizar o código para melhor eficiência e custo-benefício.
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ê pegar um problema de código, mais barato será corrigir.
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, tenha em mente que este 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.
Otimizar caminhos quentes
Ao instrumentar seu código, você pode medir o consumo de recursos de caminhos de código. Estas medições ajudam-no a identificar caminhos quentes. Os caminhos quentes têm um efeito significativo no desempenho e no uso de recursos. Eles são seções críticas ou frequentemente executadas de um programa que exigem alto desempenho e baixa latência.
Para identificar caminhos quentes, 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 CPU, memória ou operações de E/S. Procure padrões ou seções de código que são frequentemente executados 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 dos caminhos de código. Essa medição ajuda a identificar gargalos e áreas para melhorias.
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 de negócios críticas. Determine quais caminhos de código são cruciais para fornecer valor aos usuários ou atender aos requisitos de desempenho.
Analise 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 a serem melhoradas. Remova todas as operações desnecessárias dentro do caminho de código que possam afetar o desempenho.
Remova chamadas de função desnecessárias: revise seu código. Identifique quaisquer funções que não sejam essenciais para a funcionalidade desejada e que possam afetar negativamente o desempenho. Por exemplo, se uma chamada de função executa uma validação que aconteceu anteriormente no código, você pode remover essa chamada de função desnecessária.
Minimizar as operações de registro: o registro em log pode ser útil para depuração e análise, mas o registro em log excessivo pode afetar o desempenho. Avalie a necessidade de cada operação de registro em log e remova todas as chamadas de log desnecessárias que não sejam críticas para a análise de desempenho.
Otimizar 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: revise seu código para verificar se há 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.
Minimizar solicitações de rede: Se seu 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.
Minimizar alocações: identifique áreas onde ocorre alocação excessiva de memória. Otimize o código reduzindo alocações desnecessárias e reutilizando 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 os dados de forma eficiente.
Avalie implementações transversais: considere os efeitos de implementações transversais, como verificações de middleware ou token. Avalie se eles estão afetando negativamente o desempenho.
Compensação: a otimização do código e dos caminhos ativos requer a 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. Usando processamento assíncrono, multithreading ou multiprocessamento, você pode lidar com mais tarefas com os mesmos recursos. No entanto, é crucial garantir uma implementação adequada para evitar mais despesas gerais e manter a relação custo-eficácia.
Para avaliar se o uso da simultaneidade é uma boa opção, você pode seguir estas diretrizes:
Processamento assíncrono: O processamento assíncrono permite a execução sem bloqueios. Por exemplo, você pode iniciar um processo e, em seguida, 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 suportado, como
async
/await
em .NET ou promessas em JavaScript.Reestruture seu código para usar construções de programação assíncrona, permitindo a execução sem bloqueio de tarefas. Desacople operações de longa duração 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 independentemente. 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 capacidades de cada SDK. Considere sua compatibilidade com sua linguagem de programação e ambiente de desenvolvimento.
Aqui estão orientações para ajudar a escolher os melhores SDKs para sua carga de trabalho:
Realizar testes de desempenho: compare o uso de recursos e o desempenho de SDKs por meio de testes de desempenho. Escolha o SDK que melhor atende às suas necessidades em termos de otimização de recursos e melhoria de desempenho. Integre o SDK escolhido em 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 suporta a mesma funcionalidade ou semelhante a um custo menor, vale a pena considerar. Ao escolher um sistema operacional mais barato, você pode potencialmente reduzir o custo das taxas de licenciamento e os custos de infraestrutura.
O sistema operacional certo pode contribuir para a otimização geral de custos para sua carga de trabalho. Para escolher o sistema operacional certo para sua carga de trabalho, tente estas atividades:
Avalie seus requisitos: entenda as necessidades específicas de sua carga de trabalho, incluindo as linguagens de codificação e 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 suporta a mesma funcionalidade ou funcionalidade semelhante ao seu sistema operacional atual. Avalie se ele fornece os recursos e capacidades necessários que sua carga de trabalho exige.
Comparar 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.
Rever a segurança e a estabilidade: Avalie a segurança e a estabilidade do sistema operativo alternativo. Procure atualizações de segurança, patches e suporte da comunidade para garantir que o sistema operacional seja mantido ativamente e seja 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 de suporte oficiais, documentação e uma comunidade de usuários que podem fornecer assistência se você precisar.
Otimize o tráfego de rede
Otimizar a travessia de rede é minimizar o tráfego de rede entre os componentes da carga de trabalho. A transferência de dados tem frequentemente 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 é um candidato para 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.
Otimizar protocolos de rede
Os protocolos de rede desempenham um papel crucial na eficiência da comunicação em 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 que são conhecidos por sua eficiência em termos de velocidade de transferência de dados e minimização de 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 à compressão: implemente mecanismos de compressão em seus protocolos de rede para reduzir o tamanho dos dados que estão sendo transferidos. A compressão pode reduzir significativamente a quantidade de dados transmitidos pela rede, levando a um melhor desempenho e menor uso de 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 da 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.
Implementar 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 de rede.
Minimize a sobrecarga de rede
Minimize a quantidade de tráfego de rede e transferência de dados entre os componentes da sua carga de trabalho. Ao reduzir a sobrecarga de 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.
Otimizar o tamanho dos dados: analise os dados que estão sendo transmitidos entre componentes ou sistemas e procure oportunidades para minimizar seu tamanho. Considere técnicas como a compressão dos dados antes da transmissão ou a utilização de 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 processamento em lote reduz a sobrecarga de estabelecer várias conexões e diminui a transmissão geral de dados.
Usar serialização de dados: a serialização de dados é o processo de conversão de estruturas de dados ou objetos 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 de forma eficiente na extremidade recetora.
Selecione um formato de serialização compacto, rápido e adequado aos requisitos da sua carga de trabalho.
Formato de serialização Description 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 mensagem. Pacote de mensagens Um formato de serialização binário para transmissão compacta através do fio. Ele suporta vários tipos de dados e fornece rápido desempenho de serialização e desserialização. JavaScript Object Notation (JSON) Um formato de serialização de dados amplamente utilizado que é legível por humanos e fácil de trabalhar. JSON é baseado em texto e tem amplo suporte multiplataforma. JSON binário (BSON) Um formato de serialização binário 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 no JSON. Dependendo do formato de serialização, você precisa implementar 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 cache de dados, consulta de dados eficiente e compactação de dados.
Usar mecanismos de cache
O cache envolve o armazenamento de dados acessados com frequência mais perto dos componentes que o 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:
Usar um cache externo: uma solução de cache popular é uma rede de distribuição de conteúdo. Ele ajuda a minimizar a latência e reduzir a travessia de rede, armazenando em cache o conteúdo estático 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 e, ao mesmo tempo, minimizar possíveis desvantagens. A definição de um TTL apropriado garante que os dados armazenados em cache permaneçam atualizados e relevantes.
Usar cache na memória: além de 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 melhorar 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 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 porque ela pode afetar negativamente as operações de inserção e atualização.
Otimizar consultas: projete consultas eficientes considerando os requisitos de dados específicos e minimizando a recuperação desnecessária de dados. Comece usando os tipos de junção apropriados (por exemplo, junção interna e associação esquerda), com base na relação entre tabelas. Use técnicas de otimização de consulta, como dicas de consulta, análise de plano de consulta e reconfiguração de consulta para melhorar o desempenho.
Resultados da consulta de cache: você pode armazenar os resultados de consultas executadas com freqüência na memória ou em um cache. As execuções subsequentes da mesma consulta podem ser servidas a partir do cache, o que elimina a necessidade de operações dispendiosas do banco de dados.
Use uma estrutura de mapeamento objeto-relacional (ORM): use recursos de ORM, como carregamento lento, cache e processamento em lote para otimizar a recuperação de dados e minimizar 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 de 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 a estruturação e o armazenamento de dados de uma forma que maximiza o desempenho e minimiza o consumo de recursos. Ele pode melhorar os tempos de resposta de consultas, reduzir os custos de transferência de dados e otimizar a utilização do armazenamento.
Aqui estão algumas técnicas para organizar dados de forma eficiente:
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 melhorar a escalabilidade, reduzir a contenção e otimizar a utilização de recursos.
Fragmento: o compartilhamento é 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 nesses fragmentos. O compartilhamento pode melhorar o desempenho da consulta distribuindo a carga de trabalho e reduzindo a quantidade de dados acessados por cada consulta.
Comprimir: A compressã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, isso permite economia nos custos de armazenamento. Os dados comprimidos também podem ser transferidos mais rapidamente através de redes e reduzir os custos de transferência de dados.
Por exemplo, considere um cenário em que você tenha um grande conjunto de dados de informações do cliente. Ao particionar os dados com base em regiões ou dados demográficos do cliente, você pode distribuir a carga de trabalho entre 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 projeto 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 redesenhar 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 que é eficiente, sustentável e escalável.
Os padrões de projeto ajudam a otimizar o uso dos recursos do sistema, fornecendo diretrizes para alocação e gerenciamento eficientes de recursos. Por exemplo, o padrão de disjuntor ajuda a evitar o consumo desnecessário de recursos, fornecendo um mecanismo para lidar e recuperar de falhas de forma 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 projeto fornecem soluções comprovadas para problemas de projeto comuns, o que pode economizar tempo de desenvolvimento. Ao seguir padrões estabelecidos, os desenvolvedores podem evitar o trabalho repetitivo e se concentrar na implementação dos requisitos específicos de seus aplicativos.
Melhor capacidade de manutenção: os padrões de design promovem 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 depuração e esforços de 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 no projeto 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 de forma eficaz e evitar o provisionamento excessivo para economizar custos.
Arquitetura de refatoramento
Avalie sua arquitetura de carga de trabalho e identifique oportunidades de refatoração ou redesenho de componentes para otimizar o consumo de recursos. Considere técnicas como a adoção de uma arquitetura de microsserviços, a implementação do padrão Disjuntor e o uso de computação sem servidor. Ao otimizar sua arquitetura, você pode obter uma 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 e as definições de configuração de recursos para otimizar o consumo de recursos.
Considere a possibilidade de corrigir máquinas virtuais, ajustar a alocação de memória e otimizar a capacidade de armazenamento. Ao corrigir recursos, você pode evitar custos desnecessários associados à subutilização ou ao provisionamento excessivo.
Compensação: Retrabalhar o código e a arquitetura pode não se ajustar aos cronogramas atuais do projeto e pode levar a uma redução de cronograma e custos.
Facilitação do Azure
Instrumentação de código: o Azure fornece ferramentas de monitoramento e registro em log como o Azure Monitor, o Application Insights e o Log Analytics. Você pode usar essas ferramentas para acompanhar e analisar o desempenho e o comportamento do seu código em tempo real.
Identificando caminhos ativos e otimizando: o Application Insights e o Application Insights Profiler ajudam a identificar e otimizar os caminhos ativos 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 pré-criadas que interagem com os serviços do Azure para reduzir a necessidade de implementação personalizada.
Otimizando a travessia de rede: vários serviços do Azure oferecem suporte a protocolos de rede de alta velocidade, como HTTP/2 e QUIC , para uma 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, oferecem suporte ao pool de conexões.
O Azure dá suporte ao processamento em lote 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 consultas: 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 certa e otimizar as consultas, você pode melhorar a eficiência geral da recuperação de dados.
Mapeamento objeto-relacional (ORM): 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 objeto 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 otimização de escalabilidade e desempenho.
Compressão de dados: os serviços do Azure suportam técnicas de compressão de dados como GZIP e DEFLATE.
Otimizando a arquitetura: o Azure fornece orientação arquitetônica e padrões de design para projetar aplicativos escaláveis, resilientes e de alto desempenho. Para obter mais informações, consulte Padrões de design.
Ligações relacionadas
- Azure Monitor
- Application Insights
- Log Analytics
- Perfil do Application Insights
- Conjunto de ligações
- Banco de Dados do Azure para PostgreSQL - Pool de conexões de servidor flexível
- Ajuste de índice do Banco de Dados SQL do Azure
- Políticas de indexação do Azure Cosmos DB
- Particionamento do Azure Cosmos DB
- Particionamento do Banco de Dados SQL do Azure
Lista de verificação de otimização de custos
Consulte o conjunto completo de recomendações.