Lista de verificação de eficiência de desempenhoPerformance efficiency checklist

A eficiência do desempenho é a capacidade da sua carga de trabalho de dimensionar para atender às demandas colocadas por usuários de maneira eficiente e é um dos pilares da estrutura Microsoft Azure Well-Architected.Performance efficiency is the ability of your workload to scale to meet the demands placed on it by users in an efficient manner, and is one of the pillars of the Microsoft Azure Well-Architected Framework. Use esta lista de verificação para examinar a arquitetura do aplicativo de um ponto de vista de eficiência no desempenho.Use this checklist to review your application architecture from a performance efficiency standpoint.

Design do aplicativoApplication design

Particione a carga de trabalho .Partition the workload . Crie partes do processo para serem decompostas e distintas.Design parts of the process to be discrete and decomposable. Minimize o tamanho de cada parte seguindo as regras comuns para a separação de preocupações e o princípio da responsabilidade exclusiva.Minimize the size of each part, while following the usual rules for separation of concerns and the single responsibility principle. Isso permite que os componentes sejam distribuídos de maneira a maximizar o uso de cada unidade de computação (como um servidor de banco de dados ou uma função).This allows the component parts to be distributed in a way that maximizes use of each compute unit (such as a role or database server). Isso também facilita o dimensionamento do aplicativo ao adicionar instâncias de recursos específicos.It also makes it easier to scale the application by adding instances of specific resources. Para domínios complexos, considere a possibilidade de adotar uma arquitetura de microsserviços.For complex domains, consider adopting a microservices architecture.

Projete o dimensionamento .Design for scaling . O dimensionamento permite que os aplicativos reajam a uma carga variável, aumentando e diminuindo o número de instâncias de funções, de filas e de outros serviços usados.Scaling allows applications to react to variable load by increasing and decreasing the number of instances of roles, queues, and other services they use. No entanto, o aplicativo deve ser projetado com isso em mente.However, the application must be designed with this in mind. Por exemplo, o aplicativo e os serviços usados não devem possuir um estado para permitir que as solicitações sejam roteadas para qualquer instância.For example, the application and the services it uses must be stateless, to allow requests to be routed to any instance. Isso também impede que a adição ou remoção de instâncias específicas afete negativamente os usuários atuais.This also prevents the addition or removal of specific instances from adversely affecting current users. Você também deve implementar a configuração ou a detecção automática de instâncias à medida que elas são adicionadas e removidas, para que o código no aplicativo possa executar o roteamento necessário.You should also implement configuration or autodetection of instances as they are added and removed, so that code in the application can perform the necessary routing. Por exemplo, um aplicativo Web pode usar um conjunto de filas em uma abordagem de round-robin para rotear solicitações para serviços em segundo plano em execução nas funções de trabalho.For example, a web application might use a set of queues in a round-robin approach to route requests to background services running in worker roles. O aplicativo Web deve ser capaz de detectar alterações no número de filas para rotear solicitações e balancear a carga no aplicativo com êxito.The web application must be able to detect changes in the number of queues, to successfully route requests and balance the load on the application.

Dimensione como uma unidade .Scale as a unit . Planeje os recursos adicionais para acomodar o crescimento.Plan for additional resources to accommodate growth. Para cada recurso, saiba quais são os limites de dimensionamento superiores e use a fragmentação ou a decomposição para ir além desses limites.For each resource, know the upper scaling limits, and use sharding or decomposition to go beyond these limits. Determine as unidades de escala para o sistema em termos de conjuntos bem definidos de recursos.Determine the scale units for the system in terms of well-defined sets of resources. Isso torna a aplicação de operações de escalonamento horizontal mais fácil e menos propensa a um impacto negativo no aplicativo pelas limitações impostas por falta de recursos em alguma parte do sistema geral.This makes applying scale-out operations easier, and less prone to negative impact on the application through limitations imposed by lack of resources in some part of the overall system. Por exemplo, a adição de um número x de funções Web e de trabalho pode exigir um número y de filas adicionais e um número z de contas de armazenamento para lidar com a carga de trabalho extra gerada pelas funções.For example, adding x number of web and worker roles might require y number of additional queues and z number of storage accounts to handle the additional workload generated by the roles. Assim, uma unidade de escala poderia consistir em x funções web e de trabalho, y filas e z contas de armazenamento.So a scale unit could consist of x web and worker roles, y queues, and z storage accounts. Crie o aplicativo para que ele seja facilmente dimensionado com a adição de uma ou mais unidades de escala.Design the application so that it's easily scaled by adding one or more scale units.

Evite a afinidade do cliente .Avoid client affinity . Sempre que possível, verifique se o aplicativo não requer afinidade.Where possible, ensure that the application does not require affinity. As solicitações, portanto, podem ser roteadas para qualquer instância e o número de instâncias é irrelevante.Requests can thus be routed to any instance, and the number of instances is irrelevant. Isso também evita a sobrecarga de armazenamento, de recuperação e de manutenção de informações de estado para cada usuário.This also avoids the overhead of storing, retrieving, and maintaining state information for each user.

Aproveite os recursos de dimensionamento automático de plataforma .Take advantage of platform autoscaling features . Quando a plataforma de hospedagem der suporte a uma capacidade de dimensionamento automático, como o Dimensionamento Automático do Azure, dê preferência a ele em vez de a mecanismos personalizados ou de terceiros, a menos que o mecanismo interno não atenda aos seus requisitos.Where the hosting platform supports an autoscaling capability, such as Azure Autoscale, prefer it to custom or third-party mechanisms unless the built-in mechanism can't fulfill your requirements. Use regras de dimensionamento agendadas quando possível para garantir que os recursos estejam disponíveis sem um atraso de inicialização, mas adicione o dimensionamento automático reativo às regras onde for apropriado para lidar com alterações inesperadas na demanda.Use scheduled scaling rules where possible to ensure resources are available without a start-up delay, but add reactive autoscaling to the rules where appropriate to cope with unexpected changes in demand. Você pode usar as operações de dimensionamento automático no modelo de implantação clássico para ajustar o dimensionamento automático e adicionar contadores personalizados a regras.You can use the autoscaling operations in the classic deployment model to adjust autoscaling, and to add custom counters to rules. Para saber mais, confira Diretrizes de dimensionamento automático.For more information, see Auto-scaling guidance.

Descarregue tarefas com uso intensivo de CPU e de e/s como tarefas em segundo plano .Offload CPU-intensive and I/O-intensive tasks as background tasks . Se for esperado que uma solicitação para um serviço demore muito tempo para ser executada ou absorva recursos consideráveis, o descarregamento do processamento dessa solicitação será uma tarefa separada.If a request to a service is expected to take a long time to run or absorb considerable resources, offload the processing for this request to a separate task. Use funções de trabalho ou trabalhos em segundo plano (dependendo da plataforma de hospedagem) para executar essas tarefas.Use worker roles or background jobs (depending on the hosting platform) to execute these tasks. Essa estratégia permite que o serviço continue a receber outras solicitações e permaneça responsivo.This strategy enables the service to continue receiving further requests and remain responsive. Para saber mais, consulte Diretrizes de trabalhos em segundo plano.For more information, see Background jobs guidance.

Distribua a carga de trabalho para tarefas em segundo plano .Distribute the workload for background tasks . Quando houver muitas tarefas em segundo plano, ou quando as tarefas exigirem um tempo ou recursos consideráveis, distribua o trabalho em várias unidades de computação (como funções de trabalho ou trabalhos em segundo plano).Where there are many background tasks, or the tasks require considerable time or resources, spread the work across multiple compute units (such as worker roles or background jobs). Para ver uma solução possível, confira Padrão de clientes concorrentes.For one possible solution, see the Competing Consumers pattern.

Considere a possibilidade de migrar para uma arquitetura de nada compartilhado .Consider moving toward a shared-nothing architecture . Uma arquitetura de nada compartilhado usa nós independentes e autossuficientes sem um ponto único de contenção (como serviços compartilhados ou armazenamento).A shared-nothing architecture uses independent, self-sufficient nodes that have no single point of contention (such as shared services or storage). Em tese, esse sistema pode ser dimensionado quase indefinidamente.In theory, such a system can scale almost indefinitely. Embora uma abordagem completa de nada compartilhado geralmente não seja prática para a maioria dos aplicativos, ela pode fornecer oportunidades de projetar uma escalabilidade melhor.While a fully shared-nothing approach is generally not practical for most applications, it may provide opportunities to design for better scalability. Por exemplo, evitar o uso de estado de sessão do lado do servidor, afinidade de cliente e particionamento de dados são bons exemplos de migração para uma arquitetura de nada compartilhado.For example, avoiding the use of server-side session state, client affinity, and data partitioning are good examples of moving toward a shared-nothing architecture.

Gerenciamento de dadosData management

Use o particionamento de dados .Use data partitioning . Divida os dados em vários bancos de dados e servidores de banco de dados ou projete o aplicativo para usar os serviços de armazenamento de dados que podem fornecer esse particionamento de modo transparente (exemplos: Banco de dados Elástico do Banco de Dados SQL do Azure e Armazenamento de Tabelas do Azure).Divide the data across multiple databases and database servers, or design the application to use data storage services that can provide this partitioning transparently (examples include Azure SQL Database Elastic Database, and Azure Table storage). Esta abordagem pode ajudar a maximizar o desempenho e permitir o dimensionamento mais fácil.This approach can help to maximize performance and allow easier scaling. Há diferentes técnicas de particionamento, como horizontal, vertical e funcional.There are different partitioning techniques, such as horizontal, vertical, and functional. Você pode usar uma combinação delas para tirar o máximo proveito dessas técnicas com o aumento do desempenho de consultas, escalabilidade mais simples, gerenciamento mais flexível, melhor disponibilidade e para corresponder o tipo de repositório aos dados que serão armazenados.You can use a combination of these to achieve maximum benefit from increased query performance, simpler scalability, more flexible management, better availability, and to match the type of store to the data it will hold. Além disso, considere usar tipos diferentes de repositórios de dados para diferentes tipos de dados, escolhendo os tipos com base em como eles são otimizados para o tipo de dados específico.Also, consider using different types of data store for different types of data, choosing the types based on how well they are optimized for the specific type of data. Isso pode incluir usar o armazenamento de tabelas, um banco de dados do documento ou um repositório de dados familiar em coluna, em vez de ou além de um banco de dados relacional.This may include using table storage, a document database, or a column-family data store, instead of, or as well as, a relational database. Para saber mais, consulte Diretrizes de particionamento de dados.For more information, see Data partitioning guidance.

Projete para consistência eventual .Design for eventual consistency . A consistência eventual melhora a escalabilidade ao reduzir ou remover o tempo necessário para sincronizar dados relacionados particionados em vários repositórios.Eventual consistency improves scalability by reducing or removing the time needed to synchronize related data partitioned across multiple stores. O custo disso é que os dados nem sempre são consistentes quando lidos e algumas operações de gravação podem causar conflitos.The cost is that data is not always consistent when it is read, and some write operations may cause conflicts. A consistência eventual é ideal para situações em que os mesmos dados são lidos com frequência, mas gravados raramente.Eventual consistency is ideal for situations where the same data is read frequently but written infrequently. Para obter mais informações, consulte o primer de consistência de dados.For more information, see the Data Consistency Primer.

Reduza as interações verborrágicas entre componentes e serviços .Reduce chatty interactions between components and services . Evite criar interfaces verborrágicas em que um aplicativo precisa fazer várias chamadas para um serviço (cada uma delas retorna uma pequena quantidade de dados), em vez de uma única chamada que pode retornar todos os dados.Avoid designing interactions in which an application is required to make multiple calls to a service (each of which returns a small amount of data), rather than a single call that can return all of the data. Sempre que possível, combine várias operações relacionadas em uma única solicitação quando a chamada é para um serviço ou componente que tem latência perceptível.Where possible, combine several related operations into a single request when the call is to a service or component that has noticeable latency. Isso facilita o monitoramento do desempenho e otimiza operações complexas.This makes it easier to monitor performance and optimize complex operations. Por exemplo, use procedimentos armazenados em bancos de dados para encapsular a lógica complexa e reduzir o número de viagens de ida e volta e o bloqueio de recursos.For example, use stored procedures in databases to encapsulate complex logic, and reduce the number of round trips and resource locking.

Use filas para nivelar a carga de gravações de dados de alta velocidade .Use queues to level the load for high velocity data writes . Aumentos na demanda por um serviço podem sobrecarregar o serviço e causar falhas cada vez maiores.Surges in demand for a service can overwhelm that service and cause escalating failures. Para evitar isso, considere implementar o Padrão de Nivelamento de Carga Baseado em Fila.To prevent this, consider implementing the Queue-Based Load Leveling pattern. Use uma fila que age como um buffer entre uma tarefa e um serviço chamado.Use a queue that acts as a buffer between a task and a service that it invokes. Isso pode atenuar cargas pesadas intermitentes que, de outra forma, poderiam causar falha no serviço ou atingir o tempo limite da tarefa.This can smooth intermittent heavy loads that may otherwise cause the service to fail or the task to time out.

Minimize a carga no repositório de dados .Minimize the load on the data store . O armazenamento de dados é normalmente um afunilamento de processamento, um recurso dispendioso e, muitas vezes, não é fácil de escalar horizontalmente. Sempre que possível, remova a lógica (como o processamento de documentos XML ou objetos JSON) do armazenamento de dados e execute o processamento dentro do aplicativo.The data store is commonly a processing bottleneck, a costly resource, and often not easy to scale out. Where possible, remove logic (such as processing XML documents or JSON objects) from the data store, and perform processing within the application. Por exemplo, em vez de passar XML ao banco de dados (diferente de uma cadeia de caracteres opaca para armazenamento) serialize ou desserialize o XML dentro da camada de aplicativo e passe-o em um formato nativo para o repositório de dados.For example, instead of passing XML to the database (other than as an opaque string for storage), serialize or deserialize the XML within the application layer and pass it in a form that is native to the data store. Em geral, é mais fácil escalar horizontalmente o aplicativo do que o repositório de dados; portanto, você deve tentar fazer o máximo de processamento intensivo de computação dentro do aplicativo possível.It's typically much easier to scale out the application than the data store, so you should attempt to do as much of the compute-intensive processing as possible within the application.

Minimize o volume de dados recuperados .Minimize the volume of data retrieved . Recupere somente os dados de que você precisa especificando colunas e usando critérios para selecionar linhas.Retrieve only the data you require by specifying columns and using criteria to select rows. Use parâmetros de valor de tabela e o nível de isolamento apropriado.Make use of table value parameters and the appropriate isolation level. Use mecanismos, como marcas da entidade, para evitar a recuperação de dados desnecessariamente.Use mechanisms like entity tags to avoid retrieving data unnecessarily.

Use o caching de forma agressiva .Aggressively use caching . Use o caching sempre que possível para reduzir a carga sobre recursos e serviços que geram ou entregam dados.Use caching wherever possible to reduce the load on resources and services that generate or deliver data. O caching normalmente é adequado para dados relativamente estáticos ou que requerem processamento considerável para ser obtidos.Caching is typically suited to data that is relatively static, or that requires considerable processing to obtain. O caching deve ocorrer em todos os níveis, quando apropriado, em cada camada do aplicativo, incluindo acesso a dados e a geração de interface do usuário.Caching should occur at all levels where appropriate in each layer of the application, including data access and user interface generation. Para saber mais, consulte Diretrizes de caching.For more information, see the Caching Guidance.

Lide com o crescimento e a retenção de dados .Handle data growth and retention . A quantidade de dados armazenados por um aplicativo aumenta ao longo do tempo.The amount of data stored by an application grows over time. Esse crescimento aumenta os custos de armazenamento, bem como a latência ao acessar os dados, afetando a taxa de transferência e o desempenho do aplicativo.This growth increases storage costs as well as latency when accessing the data, affecting application throughput and performance. É possível arquivar periodicamente alguns dos dados antigos que não são mais acessados ou mover dados raramente acessados para o armazenamento de longo prazo, que é mais econômico até mesmo do que a latência de acesso é superior.It may be possible to periodically archive some of the old data that is no longer accessed, or move data that is rarely accessed into long-term storage that is more cost efficient, even if the access latency is higher.

Otimize DTOs (Data Transfer Objects, Objetos de Transferência de Dados) usando um formato binário eficiente .Optimize Data Transfer Objects (DTOs) using an efficient binary format . Os DTOs são passados diversas vezes entre as camadas de um aplicativo.DTOs are passed between the layers of an application many times. A minimização do tamanho reduz a carga sobre os recursos e a rede.Minimizing the size reduces the load on resources and the network. No entanto, equilibre a economia com a sobrecarga de converter os dados para o formato necessário em cada local onde ele é usado.However, balance the savings with the overhead of converting the data to the required format in each location where it is used. Adote um formato que tenha o máximo de interoperabilidade para permitir que um componente seja reutilizado facilmente.Adopt a format that has the maximum interoperability to enable easy reuse of a component.

Defina o controle de cache .Set cache control . Crie e configure o aplicativo para usar o caching de saída ou caching de fragmento sempre que possível para minimizar a carga de processamento.Design and configure the application to use output caching or fragment caching where possible, to minimize processing load.

Habilite o caching do cliente .Enable client side caching . Os aplicativos Web devem habilitar as configurações de cache no conteúdo que podem ser armazenadas em cache.Web applications should enable cache settings on the content that can be cached. Normalmente, isso está desabilitado por padrão.This is commonly disabled by default. Configure o servidor para fornecer os cabeçalhos de controle de cache apropriados para habilitar o caching de conteúdo em clientes e servidores proxy.Configure the server to deliver the appropriate cache control headers to enable caching of content on proxy servers and clients.

Use o Armazenamento de Blobs do Azure e a Rede de Distribuição de Conteúdo do Azure para reduzir a carga no aplicativo .Use Azure blob storage and the Azure Content Delivery Network to reduce the load on the application . Considere armazenar conteúdo público estático ou relativamente estático, como imagens, recursos, scripts e folhas de estilo no armazenamento de blobs.Consider storing static or relatively static public content, such as images, resources, scripts, and style sheets, in blob storage. Essa abordagem reduz a aplicação da carga causada pela geração dinâmica desse conteúdo para cada solicitação.This approach relieves the application of the load caused by dynamically generating this content for each request. Além disso, considere o uso da Rede de Distribuição de Conteúdo para armazenar em cache esse conteúdo e entregá-lo aos clientes.Additionally, consider using the Content Delivery Network to cache this content and deliver it to clients. O uso da Rede de Distribuição de Conteúdo pode melhorar o desempenho no cliente porque o conteúdo é distribuído do datacenter geograficamente mais próximo que contém um cache de Rede de Distribuição de Conteúdo.Using the Content Delivery Network can improve performance at the client because the content is delivered from the geographically closest datacenter that contains a Content Delivery Network cache. Para saber mais, confira a Diretriz da Rede de Distribuição de Conteúdo.For more information, see the Content Delivery Network Guidance.

Otimize e ajuste consultas e índices SQL .Optimize and tune SQL queries and indexes . Algumas instruções ou construções T-SQL podem ter um efeito adverso no desempenho que pode ser reduzido com a otimização do código em um procedimento armazenado.Some T-SQL statements or constructs may have an adverse effect on performance that can be reduced by optimizing the code in a stored procedure. Por exemplo, evite a conversão de tipos datetime em varchar antes de comparar com um valor literal datetime .For example, avoid converting datetime types to a varchar before comparing with a datetime literal value. Em vez disso, use funções de comparação de data/hora.Use date/time comparison functions instead. A falta de índices adequados pode tornar a execução da consulta lenta.Lack of appropriate indexes can also slow query execution. Se você usar uma estrutura de objeto/mapeamento relacional, entenda como ela funciona e como pode afetar o desempenho da camada de acesso aos dados.If you use an object/relational mapping framework, understand how it works and how it may affect performance of the data access layer. Para saber mais, consulte Ajuste de consulta.For more information, see Query Tuning.

Considere a desnormalização de dados .Consider denormalizing data . A normalização dos dados ajuda a evitar a duplicação e inconsistência.Data normalization helps to avoid duplication and inconsistency. No entanto, manter vários índices, procurar a integridade referencial, executar vários acessos a pequenos fragmentos de dados e unir tabelas para remontar os dados impõe uma sobrecarga que pode afetar o desempenho.However, maintaining multiple indexes, checking for referential integrity, performing multiple accesses to small chunks of data, and joining tables to reassemble the data imposes an overhead that can affect performance. Considere se alguns volumes de armazenamento adicionais e a duplicação são aceitáveis para reduzir a carga no repositório de dados.Consider if some additional storage volume and duplication is acceptable in order to reduce the load on the data store. Considere também se o próprio aplicativo (que geralmente é mais fácil de dimensionar) pode ser confiado para assumir tarefas como o gerenciamento da integridade referencial para reduzir a carga no armazenamento de dados.Also consider if the application itself (which is typically easier to scale) can be relied on to take over tasks such as managing referential integrity in order to reduce the load on the data store. Para saber mais, consulte Diretrizes de particionamento de dados.For more information, see Data partitioning guidance.

ImplementaçãoImplementation

Examinar os antipadrões de desempenho .Review the performance antipatterns . Consulte Antipadrão de desempenho para aplicativos de nuvem para ver práticas comuns que podem causar problemas de escalabilidade quando um aplicativo estiver sob pressão.See Performance antipatterns for cloud applications for common practices that are likely to cause scalability problems when an application is under pressure.

Use chamadas assíncronas .Use asynchronous calls . Sempre que possível, use o código assíncrono ao acessar recursos ou serviços que podem ser limitados por E/S ou largura de banda de rede, ou que tenham uma latência perceptível, para evitar o bloqueio do thread de chamada.Use asynchronous code wherever possible when accessing resources or services that may be limited by I/O or network bandwidth, or that have a noticeable latency, in order to avoid locking the calling thread.

Evite o bloqueio de recursos e use uma abordagem otimista .Avoid locking resources, and use an optimistic approach instead . Nunca bloqueie o acesso a recursos como armazenamento ou outros serviços que tenham latência perceptível, pois essa é a causa principal de mau desempenho.Never lock access to resources such as storage or other services that have noticeable latency, because this is a primary cause of poor performance. Sempre use abordagens otimistas para gerenciar operações simultâneas, como gravar no armazenamentoAlways use optimistic approaches to managing concurrent operations, such as writing to storage. Use recursos da camada de armazenamento para gerenciar conflitos.Use features of the storage layer to manage conflicts. Em aplicativos distribuídos, os dados só podem ser eventualmente consistentes.In distributed applications, data may be only eventually consistent.

Faça a compactação de dados altamente compactáveis em redes de baixa largura de banda e alta latência .Compress highly compressible data over high latency, low bandwidth networks . Na maioria dos casos, em um aplicativo Web, o maior volume de dados gerados pelo aplicativo e passado pela rede é constituído de respostas HTTP para solicitações do cliente.In the majority of cases in a web application, the largest volume of data generated by the application and passed over the network is HTTP responses to client requests. A compactação HTTP pode reduzir isso consideravelmente, em especial para conteúdo estático.HTTP compression can reduce this considerably, especially for static content. Isso pode reduzir custos e a carga na rede, embora a compactação de conteúdo dinâmico aplique uma carga ligeiramente maior ao servidor.This can reduce cost as well as reducing the load on the network, though compressing dynamic content does apply a fractionally higher load on the server. Em outros ambientes mais generalizados, a compactação de dados pode reduzir o volume de dados transmitidos para minimizar o tempo e os custos de transferência, mas adiciona uma sobrecarga aos processos de compactação e descompactação.In other, more generalized environments, data compression can reduce the volume of data transmitted and minimize transfer time and costs, but the compression and decompression processes incur overhead. Ela só deverá ser usada quando houver um ganho de desempenho demonstrável.As such, compression should only be used when there is a demonstrable gain in performance. Outros métodos de serialização, como JSON ou binário, podem reduzir o tamanho da carga ao mesmo tempo em que têm menos impacto no desempenho, enquanto o XML provavelmente vai aumentá-lo.Other serialization methods, such as JSON or binary encodings, may reduce the payload size while having less impact on performance, whereas XML is likely to increase it.

Minimize o tempo de uso de conexões e recursos .Minimize the time that connections and resources are in use . Mantenha conexões e recursos apenas pelo tempo necessário para usá-los.Maintain connections and resources only for as long as you need to use them. Por exemplo, abra conexões o mais tarde possível e permita que elas sejam retornadas ao pool de conexões assim que possível.For example, open connections as late as possible, and allow them to be returned to the connection pool as soon as possible. Adquira recursos o mais tarde possível e descarte-os assim que possível.Acquire resources as late as possible, and dispose of them as soon as possible.

Minimize o número de conexões necessárias .Minimize the number of connections required . As conexões de serviço absorvem recursos.Service connections absorb resources. Limite o número necessário e verifique se as conexões existentes são reutilizadas sempre que possível.Limit the number that are required and ensure that existing connections are reused whenever possible. Por exemplo, depois de executar a autenticação, use a representação onde for apropriado para executar o código como uma identidade específica.For example, after performing authentication, use impersonation where appropriate to run code as a specific identity. Isso pode ajudar a fazer o melhor uso do pool de conexões com sua reutilização.This can help to make best use of the connection pool by reusing connections.

Observação

APIs de alguns serviços reutilizam automaticamente as conexões, desde que as diretrizes específicas do serviço sejam seguidas.APIs for some services automatically reuse connections, provided service-specific guidelines are followed. É importante entender as condições que permitem a reutilização da conexão para cada serviço usado por seu aplicativo.It's important that you understand the conditions that enable connection reuse for each service that your application uses.

Envie solicitações em lotes para otimizar o uso da rede .Send requests in batches to optimize network use . Por exemplo, envie e leia mensagens em lotes ao acessar uma fila e execute várias leituras ou gravações em lote ao acessar um cache ou armazenamento.For example, send and read messages in batches when accessing a queue, and perform multiple reads or writes as a batch when accessing storage or a cache. Isso pode ajudar a maximizar a eficiência dos serviços e os armazenamentos de dados, reduzindo o número de chamadas na rede.This can help to maximize efficiency of the services and data stores by reducing the number of calls across the network.

Evite um requisito de armazenar o estado de sessão do servidor sempre que possível.Avoid a requirement to store server-side session state where possible. O gerenciamento de estado de sessão do servidor geralmente requer afinidade de cliente (ou seja, o roteamento de cada solicitação para a mesma instância de servidor), o que afeta a capacidade de dimensionamento do sistema.Server-side session state management typically requires client affinity (that is, routing each request to the same server instance), which affects the ability of the system to scale. Em tese, você deve criar clientes sem monitoração de estado em relação os servidores que eles usam.Ideally, you should design clients to be stateless with respect to the servers that they use. No entanto, se o aplicativo precisar manter o estado de sessão, armazene dados confidenciais ou grandes volumes de dados por cliente em um cache de servidor distribuído que todas as instâncias do aplicativo podem acessar.However, if the application must maintain session state, store sensitive data or large volumes of per-client data in a distributed server-side cache that all instances of the application can access.

Otimize esquemas de armazenamento de tabela .Optimize table storage schemas . Ao usar armazenamentos de tabela que exigem que os nomes da tabela e das colunas sejam passados e processados com cada consulta, como o armazenamento de tabelas do Azure, considere usar nomes menores para reduzir essa sobrecarga.When using table stores that require the table and column names to be passed and processed with every query, such as Azure table storage, consider using shorter names to reduce this overhead. No entanto, não sacrifique a legibilidade ou a capacidade de gerenciamento usando nomes excessivamente compactos.However, do not sacrifice readability or manageability by using overly compact names.

Crie dependências de recursos durante a implantação ou a inicialização do aplicativo .Create resource dependencies during deployment or at application startup . Evite chamadas repetidas para métodos que testam a existência de um recurso e crie o recurso se ele não existir.Avoid repeated calls to methods that test the existence of a resource and then create the resource if it does not exist. Métodos como CloudTable.CreateIfNotExists e CloudQueue.CreateIfNotExists na Biblioteca de Cliente do Armazenamento do Azure seguem esse padrão.Methods such as CloudTable.CreateIfNotExists and CloudQueue.CreateIfNotExists in the Azure Storage Client Library follow this pattern. Esses métodos podem impor uma sobrecarga considerável se forem chamados antes de cada acesso a uma tabela de armazenamento ou uma fila de armazenamento.These methods can impose considerable overhead if they are invoked before each access to a storage table or storage queue. Em vez disso:Instead:

  • Crie os recursos necessários quando o aplicativo for implantado ou quando for iniciado pela primeira vez (uma única chamada para CreateIfNotExists para cada recurso no código de inicialização para uma função web ou de trabalho é aceitável).Create the required resources when the application is deployed, or when it first starts (a single call to CreateIfNotExists for each resource in the startup code for a web or worker role is acceptable). No entanto, não se esqueça de manipular as exceções que poderão surgir se o seu código tentar acessar um recurso que não existe.However, be sure to handle exceptions that may arise if your code attempts to access a resource that doesn't exist. Nessas situações, você deve registrar a exceção e, possivelmente, alertar um operador sobre a ausência de um recurso.In these situations, you should log the exception, and possibly alert an operator that a resource is missing.
  • Em alguns casos, pode ser apropriado criar o recurso ausente como parte do código de tratamento de exceções.Under some circumstances, it may be appropriate to create the missing resource as part of the exception handling code. Mas você deve adotar essa abordagem com cuidado, já que a ausência do recurso pode ser uma indicação de um erro de programação (um nome de recurso incorreto, por exemplo) ou algum outro problema a nível da infraestrutura.But you should adopt this approach with caution as the non-existence of the resource might be indicative of a programming error (a misspelled resource name for example), or some other infrastructure-level issue.

Use estruturas leves .Use lightweight frameworks . Escolha cuidadosamente as APIs e estruturas que você utiliza para minimizar o uso de recursos, o tempo de execução e a carga geral no aplicativo.Carefully choose the APIs and frameworks you use to minimize resource usage, execution time, and overall load on the application. Por exemplo, o uso da API Web para tratar das solicitações de serviço pode reduzir a superfície do aplicativo e aumentar a velocidade de execução, mas talvez não seja adequado para cenários avançados, onde são necessários recursos adicionais da Windows Communication Foundation.For example, using Web API to handle service requests can reduce the application footprint and increase execution speed, but it may not be suitable for advanced scenarios where the additional capabilities of Windows Communication Foundation are required.

Considere minimizar o número de contas de serviço .Consider minimizing the number of service accounts . Por exemplo, usar uma conta específica para acessar recursos ou serviços que impõem um limite de conexões ou têm desempenho melhor quando menos conexões são mantidas.For example, use a specific account to access resources or services that impose a limit on connections, or perform better where fewer connections are maintained. Essa abordagem é comum para serviços como bancos de dados, mas ela pode afetar a capacidade de auditar operações com precisão devido à representação do usuário original.This approach is common for services such as databases, but it can affect the ability to accurately audit operations due to the impersonation of the original user.

Execute testes de perfil e carga de desempenho durante o desenvolvimento, como parte das rotinas de teste, e antes da liberação o final para assegurar o desempenho e o dimensionamento necessários para o aplicativo.Carry out performance profiling and load testing during development, as part of test routines, and before final release to ensure the application performs and scales as required. Esse teste deve ocorrer no mesmo tipo de hardware da plataforma de produção e com os mesmos tipos e quantidades de dados e carga de usuário que serão encontrados em produção.This testing should occur on the same type of hardware as the production platform, and with the same types and quantities of data and user load as it will encounter in production. Para saber mais, confira Testando o desempenho de um serviço de nuvem.For more information, see Testing the performance of a cloud service.