Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a esta recomendação de lista de verificação da Otimização de Custos do Framework Azure Well-Architected:
| 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 de código. A otimização de código é o processo de melhorar a eficiência, o desempenho e o custo-benefício do código do aplicativo. A otimização efetiva de 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 a um 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
| Prazo | Definition |
|---|---|
| Instrumentação de código | A prática de adicionar snippets de código ou bibliotecas a códigos que coletam dados e monitoram o desempenho do código durante o runtime. |
| Concurrency | 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 ao formulário 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. |
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. Ao reduzir o consumo de recursos, você pode economizar dinheiro quando os aplicativos lidam com grandes volumes de dados ou experimentam altas cargas de tráfego.
Os aprimoramentos de código são mais eficazes quando você está seguindo outros esforços de otimização de custos em relação ao dimensionamento, à rightsizing, à 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 de confiabilidade, dimensionamento automático e sem servidor 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.
Instrumentar seu código
O código de instrumentação é a prática de adicionar snippets de código ou bibliotecas que coletam dados e monitoram o desempenho do código durante o runtime. 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 caminhos quentes de código, identificar gargalos de desempenho e otimizar o código para obter melhor eficiência e custo-efetividade.
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 antes você pega um problema de código, mais barato é 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 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.
Otimizar caminhos quentes
Ao instrumentar seu código, você pode medir o consumo de recursos de caminhos de código. Essas medidas ajudam a identificar caminhos quentes. Os caminhos quentes têm um efeito significativo no desempenho e no uso de recursos. Elas 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 frequentes, considere estas tarefas:
Analisar dados de runtime: colete e analise dados de runtime 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 executadas com frequência ou demoram muito tempo para serem concluídas.
Desempenho da medida: 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 medida ajuda a identificar gargalos e áreas para 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 fornecer valor aos usuários ou atender aos requisitos de desempenho.
Examine as recomendações de desempenho específicas para a 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 quaisquer operações desnecessárias no caminho do código que possam afetar o desempenho.
Remover chamadas de função desnecessárias: examine seu código. Identifique as funções que não são essenciais para a funcionalidade desejada e que possam 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.
Minimizar operações de log: o registro em 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 registro em log e remova todas as chamadas de log desnecessárias que não sejam críticas para análise de desempenho.
Otimizar loops e condicionais: analise loops e condicionais em seu código. Identifique as iterações ou condições desnecessárias que você pode eliminar. Simplificar e otimizar essas estruturas pode melhorar o desempenho do código.
Reduzir o processamento de dados desnecessários: examine seu código para quaisquer 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 código.
Minimizar 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.
Minimizar alocações: identifique áreas em que ocorre alocação excessiva de memória. Otimize o código reduzindo alocações desnecessárias e reutilizando recursos existentes quando possível.
Minimizando alocações, você pode melhorar a eficiência de 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.
Reduzir o tamanho da estrutura de dados: avalie o tamanho das estruturas de dados, como classes, e identifique as áreas em que a redução é possível. Examine os requisitos de dados e elimine quaisquer campos ou propriedades desnecessários. Otimize o uso de memória selecionando tipos de dados apropriados e empacotando dados com eficiência.
Avaliar implementações de corte cruzado: considere os efeitos de implementações de corte cruzado, como middleware ou verificações de token. Avalie se eles estão afetando negativamente o desempenho.
Compensação: otimizar o código e os caminhos frequentes 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 da simultaneidade envolve avaliar se o processamento assíncrono, o multithreading ou o multiprocessamento podem maximizar a utilização de recursos e reduzir as despesas. Usando processamento assíncrono, multithreading ou multiprocessamento, você pode lidar com mais tarefas com os mesmos recursos. No entanto, é crucial garantir a implementação adequada para evitar mais sobrecarga e manter o custo-benefício.
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 bloqueio. Por exemplo, você pode iniciar um processo e, em seguida, pausar para permitir que um segundo processo seja concluído.
Determine os componentes de código ou as 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íncrono que ele dá suporte, como
async/awaitno .NET ou promessas em JavaScript.Reestruture seu código para usar constructos de programação assíncronas, permitindo a execução sem bloqueio de tarefas. Desacoplar operações de execução longa ou intensiva de E/S do thread de execução principal usando métodos assíncronos ou retornos de chamada. Use APIs assíncronas ou bibliotecas que sua linguagem de programação ou estrutura fornece para lidar com fluxos de trabalho assíncronos.
Multithreading: em multithreading, você executa vários threads de um único processo simultaneamente.
Identifique seções do código que você pode executar simultaneamente e independentemente. Leia a documentação ou as diretrizes específicas para a linguagem de programação ou estrutura que você está usando para 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 impedir condições de corrida quando o código acessar recursos compartilhados. Considere usar 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 a 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. Crie 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 habilitar a coordenação e o compartilhamento de dados entre vários processos, implemente mecanismos de comunicação, como IPC (comunicação entre processos), memória compartilhada ou passagem de mensagens, dependendo da linguagem de programação ou da estrutura.
Usar os SDKs corretos
Para otimização de custo, selecione SDKs projetados para otimizar o uso de recursos e melhorar o desempenho. É importante avaliar os recursos e os recursos de cada SDK. Considere sua compatibilidade com a linguagem de programação e o ambiente de desenvolvimento.
Aqui estão as diretrizes para ajudar a escolher os melhores SDKs para sua carga de trabalho:
Realizar 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 à base de código seguindo a documentação e as diretrizes fornecidas.
Monitorar o uso de recursos e otimizar o código: monitorar o uso de recursos com o SDK implementado. Reúna insights do monitoramento e da análise para otimizar seu código.
Escolher o sistema operacional correto
A maioria das linguagens de codificação pode ser executada em vários sistemas operacionais, portanto, é importante avaliar seu sistema operacional em relação a alternativas mais baratas. Se um sistema operacional alternativo dá suporte à mesma funcionalidade ou funcionalidade semelhante a menos custo, vale a pena considerar. Ao escolher um sistema operacional mais barato, você pode potencialmente reduzir o custo das taxas de licenciamento e dos custos de infraestrutura.
O sistema operacional correto pode contribuir para a otimização de custo geral para 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 da 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 seus idiomas de codificação, estruturas e quaisquer bibliotecas ou ferramentas de terceiros que você usar. 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 dá suporte à mesma funcionalidade ou a mesma funcionalidade do sistema operacional atual. Avalie se ele fornece os recursos e os recursos 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 carga de trabalho sem comprometer a funcionalidade.
Considere o desempenho e a otimização: avalie os recursos de desempenho e otimização do sistema operacional alternativo. Procure parâmetros de comparação, estudos de caso ou comparações de desempenho para entender como ele se sai em cenários reais.
Examine 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 esteja seguro e estável no geral.
Considere o suporte do fornecedor: avalie o nível de suporte do fornecedor disponível para o sistema operacional alternativo. Verifique se há canais de suporte oficiais, documentação e uma comunidade de usuários que podem fornecer assistência se você precisar.
Otimizar o tráfego de rede
Otimizar a passagem de rede é minimizar o tráfego de rede entre componentes de carga de trabalho. A transferência de dados geralmente tem um custo associado. Minimizando o tráfego de rede, você pode reduzir a quantidade de dados que precisam ser transferidos enquanto reduz 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 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 ou estruturas de dados inteiros 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 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 minimizar a sobrecarga. Por exemplo, considere usar protocolos como HTTP/2 em 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.
Compactação de suporte: 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 está habilitada na configuração do servidor ou código do aplicativo.
Utilizar 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 da conexão e do desmonte. 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 o cache de conteúdo, o balanceamento de carga e a formatação de tráfego para otimizar ainda mais a passagem de rede.
Minimizar a sobrecarga de rede
Minimize a quantidade de tráfego de rede e transferência de dados entre componentes da 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:
Reduzir solicitações redundantes: analise o código para identificar quaisquer 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: examine 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 de rede e melhorar a eficiência geral.
Solicitações em lote: se aplicável, considere o envio em lote de 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.
Usar a serialização de dados: a serialização de dados é o processo de converter estruturas de dados complexas ou objetos 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 no final do recebimento.
Selecione um formato de serialização compacto, rápido e adequado para os requisitos da 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 mensagens. MessagePack Um formato de serialização binária para transmissão compacta pelo fio. Ele dá suporte a 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 no 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 à forma original. Você pode implementar essa lógica usando bibliotecas ou estruturas que fornecem recursos de serialização para o formato.
Otimizar o acesso a dados
Otimizar o acesso a dados refere-se à simplificação dos padrões e técnicas para recuperar e armazenar dados, para minimizar operações desnecessárias. Ao otimizar o acesso a 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 os exigem. Essa técnica reduz a necessidade de passagem de rede atendendo 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 distribuição de conteúdo. Ele ajuda a minimizar a latência e reduzir a passagem de rede armazenando conteúdo estático em cache mais próximo dos consumidores.
Ajustar parâmetros de cache: configure parâmetros de cache, como TTL (tempo de vida útil), para otimizar o benefício do cache, minimizando possíveis desvantagens. Definir um TTL apropriado garante que os dados armazenados em cache permaneçam novos e relevantes.
Usar cache na memória: além de soluções de cache externas, 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.
Otimizar o tráfego de banco de dados
Você pode aumentar a eficiência da comunicação do aplicativo com o banco de dados. Aqui estão algumas das principais considerações e técnicas para otimizar o tráfego de banco de dados:
Criar índices: a indexação é o processo de criação de estruturas de dados que melhoram a velocidade da 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 porque ela pode afetar negativamente as operações de inserção e atualização.
Otimizar consultas: crie consultas eficientes considerando os requisitos de dados específicos e minimizando a recuperação de dados desnecessária. Comece usando os tipos de junção apropriados (por exemplo, junção interna e junçã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 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 do cache, o que elimina a necessidade de operações de banco de dados caras.
Use uma estrutura orm (mapeamento relacional de objeto): Use recursos 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 Hibernar para Java.
Otimizar procedimentos armazenados: analise e otimize a lógica e o desempenho dos procedimentos armazenados. A meta é evitar cálculos desnecessários ou consultas redundantes em procedimentos armazenados. Otimize o uso de tabelas temporárias, variáveis e cursores para minimizar o consumo de recursos.
Organizar dados
Organizar 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 conjunto de dados grande 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 aprimorar a escalabilidade, reduzir a contenção e otimizar a utilização de recursos.
Fragmento: a fragmentação é uma técnica de divisão horizontal de dados entre várias instâncias de banco de dados ou servidores. 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 consomem menos espaço em disco, eles permitem uma economia nos custos de armazenamento. Os dados compactados também podem ser transferidos mais rapidamente por 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. Particionando 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.
Otimizar o design da solução
Avalie sua arquitetura de carga de trabalho para identificar oportunidades de otimização de recursos. A meta é usar os serviços certos para o trabalho certo.
Para atingir essa meta, 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, consumindo 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 de design recorrentes. Eles fornecem uma abordagem estruturada para criar código eficiente, mantenedível e escalonável.
Os padrões de design ajudam a otimizar o uso de 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 código de custo 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 trabalho repetitivo e se concentrar na implementação dos requisitos específicos de seus aplicativos.
Melhor manutenção: padrões de design promovem código modular e estruturado que é mais fácil de entender, modificar e manter. Eles podem levar à redução 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 na criação de sistemas escalonáveis e com 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 com eficiência.
Alterar configurações
Examine e atualize regularmente sua configuração de carga de trabalho para garantir que ela se alinhe aos seus requisitos atuais. Considere ajustar o dimensionamento de recursos e as configurações com base nas demandas de carga de trabalho. Ao otimizar as configurações, você pode alocar recursos efetivamente e evitar o excesso de provisionamento para economizar custos.
Arquitetura de refatoração
Avalie sua arquitetura de carga de trabalho e identifique oportunidades de refatoração ou reformulação de componentes para otimizar o consumo de recursos. Considere técnicas como adotar uma arquitetura de microsserviços, implementar o padrão de Disjuntor e usar a computação sem servidor. Ao otimizar sua arquitetura, você pode obter melhor utilização de recursos e eficiência de custo.
Modificar tamanhos de recursos
Monitore e analise continuamente a utilização de recursos da carga de trabalho. Com base nos padrões e tendências observados, ajuste o dimensionamento de recursos e as configurações de configuração para otimizar o consumo de recursos.
Considere a criação de direitos de máquinas virtuais, o ajuste da alocação de memória e a otimização da capacidade de armazenamento. Ao rightsizing resources, você pode evitar custos desnecessários associados à subutilização ou ao excesso de provisionamento.
Compensação: o retrabalho de código e arquitetura pode não se ajustar aos agendamentos atuais do projeto e pode levar ao agendamento e ao deslizamento de custos.
Facilitação do Azure
Código de instrumentação: 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 código em tempo real.
Identificar caminhos frequentes e otimizados: o Application Insights e o Application Insights Profiler ajudam a identificar e otimizar os caminhos frequentes 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 corretos: o Azure oferece SDKs em várias linguagens de programação, otimizadas 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.
Otimização da 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 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, dão 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 de 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, nos requisitos de desempenho e nas necessidades de interoperabilidade.
Otimizando o acesso a dados: o Azure fornece serviços de cache, como o Redis Gerenciado do Azure. 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: 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 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 o 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 escalabilidade e otimização de desempenho.
Compactando dados: Os serviços do Azure dão suporte a técnicas de compactação de dados, como GZIP e DEFLATE.
Otimização da arquitetura: o Azure fornece diretrizes arquitetônicas e padrões de design para criar aplicativos escalonáveis, resilientes e com desempenho. Para obter mais informações, consulte Padrões de design.
Links relacionados
- Azure Monitor
- Application Insights
- Log Analytics
- Criador de perfil do Application Insights
- Pooling de conexõ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.