Padrão de Consolidação de Recursos de ComputaçãoCompute Resource Consolidation pattern

Consolidar várias tarefas ou operações numa única unidade computacional.Consolidate multiple tasks or operations into a single computational unit. Este procedimento pode aumentar a utilização dos recursos de computação e reduzir os custos e os custos de gestão associados à realização do processamento de computação nas aplicações alojadas na cloud.This can increase compute resource utilization, and reduce the costs and management overhead associated with performing compute processing in cloud-hosted applications.

Contexto e problemaContext and problem

Muitas vezes, uma aplicação na cloud implementa uma variedade de operações.A cloud application often implements a variety of operations. Em algumas soluções, faz sentido seguir inicialmente o princípio de conceção da separação das preocupações e dividir estas operações em unidades computacionais separadas, que são alojadas e implementadas individualmente (por exemplo, como aplicações Web do Serviço de Aplicações separadas, Máquinas Virtuais separadas ou funções do Serviço Cloud separadas).In some solutions it makes sense to follow the design principle of separation of concerns initially, and divide these operations into separate computational units that are hosted and deployed individually (for example, as separate App Service web apps, separate Virtual Machines, or separate Cloud Service roles). No entanto, apesar desta estratégia poder ajudar a simplificar a estrutura lógica da solução, a implementação de um grande número de unidades computacionais como parte da mesma aplicação pode aumentar os custos de alojamento de tempo de execução e tornar a gestão do sistema mais complexa.However, although this strategy can help simplify the logical design of the solution, deploying a large number of computational units as part of the same application can increase runtime hosting costs and make management of the system more complex.

Por exemplo, a figura mostra a estrutura simplificada de uma solução alojada na cloud implementada com mais do que uma unidade computacional.As an example, the figure shows the simplified structure of a cloud-hosted solution that is implemented using more than one computational unit. Cada unidade computacional executa o ambiente virtual dela.Each computational unit runs in its own virtual environment. Cada função foi implementada como uma tarefa separada (identificada como Tarefa A à Tarefa E) em execução na própria unidade computacional.Each function has been implemented as a separate task (labeled Task A through Task E) running in its own computational unit.

Executar tarefas num ambiente na cloud com um conjunto de unidades computacionais dedicadas

Cada unidade computacional consome recursos faturáveis, mesmo quando está inativa ou é pouco usada.Each computational unit consumes chargeable resources, even when it's idle or lightly used. Por conseguinte, nem sempre é a solução mais económica.Therefore, this isn't always the most cost-effective solution.

No Azure, esta preocupação aplica-se às funções no Serviço Cloud, nos Serviços de Aplicação e nas Máquinas Virtuais.In Azure, this concern applies to roles in a Cloud Service, App Services, and Virtual Machines. Estes itens executam o seu próprio ambiente virtual.These items run in their own virtual environment. A execução de uma coleção de funções, sites ou máquinas virtuais separados concebidos para executar um conjunto de operações bem definidas, mas que precisam de comunicar e cooperar como parte de uma única solução, pode constituir uma utilização ineficaz dos recursos.Running a collection of separate roles, websites, or virtual machines that are designed to perform a set of well-defined operations, but that need to communicate and cooperate as part of a single solution, can be an inefficient use of resources.

SoluçãoSolution

Para ajudar a reduzir os custos, aumentar a utilização, melhorar a velocidade de comunicação e reduzir a gestão, é possível consolidar várias tarefas ou operações numa única unidade computacional.To help reduce costs, increase utilization, improve communication speed, and reduce management it's possible to consolidate multiple tasks or operations into a single computational unit.

As tarefas podem ser agrupadas de acordo com os critérios com base nas funcionalidades fornecidas pelo ambiente e nos custos associados a estas funcionalidades.Tasks can be grouped according to criteria based on the features provided by the environment and the costs associated with these features. Uma abordagem comum consiste em procurar tarefas com um perfil semelhante em matéria de requisitos de escalabilidade, de duração e de processamento.A common approach is to look for tasks that have a similar profile concerning their scalability, lifetime, and processing requirements. O agrupamento destes elementos permite-lhes realizar um dimensionamento como uma unidade.Grouping these together allows them to scale as a unit. A elasticidade fornecida por muitos ambientes na cloud permite que instâncias adicionais de uma unidade computacional sejam iniciadas e paradas, de acordo com a carga de trabalho.The elasticity provided by many cloud environments enables additional instances of a computational unit to be started and stopped according to the workload. Por exemplo, o Azure fornece um dimensionamento automático que pode aplicar às funções num Serviço Cloud, nos Serviços de Aplicação e nas Máquinas virtuais.For example, Azure provides autoscaling that you can apply to roles in a Cloud Service, App Services, and Virtual Machines. Para obter mais informações, veja Orientações de Dimensionamento Automático.For more information, see Autoscaling Guidance.

Como contra-exemplo para mostrar como a escalabilidade pode ser utilizada para determinar quais as operações que não devem ser agrupadas em conjunto, considere as duas tarefas seguintes:As a counter example to show how scalability can be used to determine which operations shouldn't be grouped together, consider the following two tasks:

  • A Tarefa 1 consulta as mensagens pouco frequentes e não sensíveis ao tempo enviadas para uma fila.Task 1 polls for infrequent, time-insensitive messages sent to a queue.
  • A Tarefa 2 processa os pico do tráfego de redes de volume elevado.Task 2 handles high-volume bursts of network traffic.

A segunda tarefa requer elasticidade que pode envolver iniciar e parar um grande número de instâncias da unidade computacional.The second task requires elasticity that can involve starting and stopping a large number of instances of the computational unit. A aplicação do mesmo dimensionamento à primeira tarefa simplesmente resultaria na atribuição de mais tarefas à escuta de mensagens pouco frequentes na mesma fila, o que se traduz numa perda de recursos.Applying the same scaling to the first task would simply result in more tasks listening for infrequent messages on the same queue, and is a waste of resources.

Em muitos ambientes na cloud, é possível especificar os recursos disponíveis numa unidade computacional em termos de número de núcleos da CPU, de memória, de espaço em disco, entre outros.In many cloud environments it's possible to specify the resources available to a computational unit in terms of the number of CPU cores, memory, disk space, and so on. Geralmente, quanto mais recursos forem especificados, maior será o custo.Generally, the more resources specified, the greater the cost. Para poupar dinheiro, é importante maximizar o trabalho realizado por uma unidade computacional dispendiosa e não permitir que esta fique inativa durante um período prolongado.To save money, it's important to maximize the work an expensive computational unit performs, and not let it become inactive for an extended period.

Se existirem tarefas que exijam bastante poder da CPU em curtos picos, considere consolidá-las numa única unidade computacional que fornece a potência necessária.If there are tasks that require a great deal of CPU power in short bursts, consider consolidating these into a single computational unit that provides the necessary power. No entanto, é importante equilibrar esta necessidade para manter os recursos dispendiosos ocupados em relação à contenção que poderia ocorrer caso estes sejam submetidos a esforços excessivos.However, it's important to balance this need to keep expensive resources busy against the contention that could occur if they are over stressed. As tarefas de longa execução e intensivas em termos computação não devem partilhar a mesma unidade computacional, por exemplo.Long-running, compute-intensive tasks shouldn't share the same computational unit, for example.

Problemas e consideraçõesIssues and considerations

Ao implementar este padrão, considere os seguintes pontos:Consider the following points when implementing this pattern:

Escalabilidade e elasticidade.Scalability and elasticity. Muitas soluções na cloud implementam a escalabilidade e elasticidade ao nível da unidade computacional ao iniciar e parar instâncias de unidades.Many cloud solutions implement scalability and elasticity at the level of the computational unit by starting and stopping instances of units. Evite agrupar tarefas com requisitos de escalabilidade em conflito na mesma unidade computacional.Avoid grouping tasks that have conflicting scalability requirements in the same computational unit.

Duração.Lifetime. A infraestrutura na cloud recicla periodicamente o ambiente virtual que aloja uma unidade computacional.The cloud infrastructure periodically recycles the virtual environment that hosts a computational unit. Quando existem muitas tarefas de longa execução numa unidade computacional, pode ser necessário configurar a unidade para impedir que esta seja reciclada até que estas tarefas sejam concluídas.When there are many long-running tasks inside a computational unit, it might be necessary to configure the unit to prevent it from being recycled until these tasks have finished. Em alternativa, crie as tarefas com uma abordagem de pontos de verificação, a qual vai permitir parar corretamente e continuar a partir do ponto em que foram interrompidas quando a unidade computacional é reiniciada.Alternatively, design the tasks by using a check-pointing approach that enables them to stop cleanly, and continue at the point they were interrupted when the computational unit is restarted.

Cadência de lançamento.Release cadence. Se a implementação ou configuração de uma tarefa sofrer alterações frequentes, poderá ser necessário parar a unidade computacional que aloja o código atualizado, reconfigurar e reimplementar a unidade e, em seguida, reiniciá-la.If the implementation or configuration of a task changes frequently, it might be necessary to stop the computational unit hosting the updated code, reconfigure and redeploy the unit, and then restart it. Este processo também precisa que todas as outras tarefas na mesma unidade computacional sejam paradas, reimplementadas e reiniciadas.This process will also require that all other tasks within the same computational unit are stopped, redeployed, and restarted.

Segurança.Security. As tarefas na mesma unidade computacional podem partilhar o mesmo contexto de segurança e ter a capacidade para aceder aos mesmos recursos.Tasks in the same computational unit might share the same security context and be able to access the same resources. Tem de haver um elevado grau de confiança entre as tarefas, assim como convicção que uma tarefa não vai danificar nem afetar negativamente outra.There must be a high degree of trust between the tasks, and confidence that one task isn't going to corrupt or adversely affect another. Além disso, o aumento do número de tarefas em execução numa unidade computacional aumenta a superfície de ataque da unidade.Additionally, increasing the number of tasks running in a computational unit increases the attack surface of the unit. Cada tarefa está tão segura quanto aquela com as maiores vulnerabilidades.Each task is only as secure as the one with the most vulnerabilities.

Tolerância a falhas.Fault tolerance. Se uma tarefa numa unidade computacional falhar ou se se comportar de forma anormal, esta poderá afetar as outras tarefas em execução na mesma unidade.If one task in a computational unit fails or behaves abnormally, it can affect the other tasks running within the same unit. Por exemplo, se uma tarefa não iniciar corretamente, esta poderá fazer com que toda a lógica de arranque da unidade computacional falhe e impeça que outras tarefas na unidade sejam executadas.For example, if one task fails to start correctly it can cause the entire startup logic for the computational unit to fail, and prevent other tasks in the same unit from running.

Contenção.Contention. Evite a introdução de contenção entre tarefas a competir por recursos na mesma unidade computacional.Avoid introducing contention between tasks that compete for resources in the same computational unit. Idealmente, as tarefas que partilham a mesma unidade computacional devem apresentar características de utilização de recursos diferentes.Ideally, tasks that share the same computational unit should exhibit different resource utilization characteristics. Por exemplo, duas tarefas intensas em termos de computação provavelmente não devem residir na mesma unidade computacional, assim como duas tarefas que consumam grandes quantidades de memória.For example, two compute-intensive tasks should probably not reside in the same computational unit, and neither should two tasks that consume large amounts of memory. No entanto, a mistura de uma tarefa intensiva em termos de computação com uma tarefa que precisa de uma grande quantidade de memória é uma combinação exequível.However, mixing a compute intensive task with a task that requires a large amount of memory is a workable combination.

Nota

Considere consolidar os recursos de computação apenas para um sistema que tenha estado em produção durante um período de tempo para que os operadores e os programadores possam monitorizar o sistema e criar um mapa térmico que identifique a forma como cada tarefa utiliza os diferentes recursos.Consider consolidating compute resources only for a system that's been in production for a period of time so that operators and developers can monitor the system and create a heat map that identifies how each task utilizes differing resources. Este mapa pode ser utilizado para determinar quais as tarefas que são boas candidatas para a partilha de recursos de computação.This map can be used to determine which tasks are good candidates for sharing compute resources.

Complexidade.Complexity. A combinação de várias tarefas numa única unidade computacional adiciona complexidade ao código na unidade, tornando-a possivelmente mais difícil de testar, depurar e manter.Combining multiple tasks into a single computational unit adds complexity to the code in the unit, possibly making it more difficult to test, debug, and maintain.

Arquitetura lógica estável.Stable logical architecture. Crie e implemente o código em cada tarefa, para que este não precise de ser alterado, mesmo que o ambiente físico onde a tarefa é executada seja alterado.Design and implement the code in each task so that it shouldn't need to change, even if the physical environment the task runs in does change.

Outras estratégias.Other strategies. A consolidação de recursos de computação é apenas uma forma de ajudar a reduzir os custos associados à execução simultânea de várias tarefas.Consolidating compute resources is only one way to help reduce costs associated with running multiple tasks concurrently. Esta operação requer um planeamento e uma monitorização cuidadosos para garantir que permanece uma abordagem eficaz.It requires careful planning and monitoring to ensure that it remains an effective approach. Outras estratégias podem ser mais adequadas, dependendo da natureza do trabalho e da localização dos utilizadores a executar estas tarefas.Other strategies might be more appropriate, depending on the nature of the work and where the users these tasks are running are located. Por exemplo, a decomposição funcional da carga de trabalho, conforme descrita nas Orientações sobre a Criação de Partições de Dados Computacionais, pode ser uma opção melhor.For example, functional decomposition of the workload (as described by the Compute Partitioning Guidance) might be a better option.

Quando utilizar este padrãoWhen to use this pattern

Utilize este padrão para tarefas pouco rentáveis se forem executadas nas suas próprias unidades computacionais.Use this pattern for tasks that are not cost effective if they run in their own computational units. Se uma tarefa permanecer grande parte do seu tempo inativa, a execução desta tarefa numa unidade dedicada poderá ser dispendiosa.If a task spends much of its time idle, running this task in a dedicated unit can be expensive.

Este padrão pode não ser adequado para tarefas que executam operações críticas com tolerância a falhas ou tarefas que processam dados altamente confidenciais ou privados e requerem o seu próprio contexto de segurança.This pattern might not be suitable for tasks that perform critical fault-tolerant operations, or tasks that process highly sensitive or private data and require their own security context. Estas tarefas devem ser executadas no seu próprio ambiente isolado, numa unidade computacional separada.These tasks should run in their own isolated environment, in a separate computational unit.

ExemploExample

Ao criar um serviço cloud no Azure, é possível consolidar o processamento realizado por várias tarefas numa única função.When building a cloud service on Azure, it’s possible to consolidate the processing performed by multiple tasks into a single role. Normalmente, trata-se de uma função de trabalho que executa tarefas de processamento em segundo plano ou de forma assíncrona.Typically this is a worker role that performs background or asynchronous processing tasks.

Em alguns casos, é possível incluir tarefas de processamento em segundo plano ou de forma assíncrona na função da Web.In some cases it's possible to include background or asynchronous processing tasks in the web role. Esta técnica ajuda a reduzir os custos e simplifica a implementação, embora possa afetar a escalabilidade e a capacidade de resposta da interface destinada ao público fornecida pela função da Web.This technique helps to reduce costs and simplify deployment, although it can impact the scalability and responsiveness of the public-facing interface provided by the web role.

A função é responsável por iniciar e parar as tarefas.The role is responsible for starting and stopping the tasks. Quando o controlador de recursos de infraestrutura do Microsoft Azure carrega uma função, este gera o evento Start para a função.When the Azure fabric controller loads a role, it raises the Start event for the role. Pode substituir o método OnStart da classe WebRole ou WorkerRole para processar este evento, por exemplo, para inicializar os dados e outros recursos dos quais as tarefas neste método dependem.You can override the OnStart method of the WebRole or WorkerRole class to handle this event, perhaps to initialize the data and other resources the tasks in this method depend on.

Quando o OnStart método for concluído, a função pode começar a responder a pedidos.When the OnStart method completes, the role can start responding to requests. Pode encontrar mais informações e orientações sobre como utilizar os métodos OnStart e Run numa função na secção Application Startup Processes (Processos de Arranque da Aplicação) no guia de padrões e práticas Moving Applications to the Cloud (Mover Aplicações para a Cloud).You can find more information and guidance about using the OnStart and Run methods in a role in the Application Startup Processes section in the patterns & practices guide Moving Applications to the Cloud.

Mantenha o código no método OnStart o mais conciso possível.Keep the code in the OnStart method as concise as possible. O Azure não impõe qualquer limite de tempo decorrido para a conclusão deste método, mas a função não vai ter a capacidade para responder a pedidos de rede recebidos até que este método seja concluído.Azure doesn't impose any limit on the time taken for this method to complete, but the role won't be able to start responding to network requests sent to it until this method completes.

Quando o método OnStart for concluído, a função executa o método Run.When the OnStart method has finished, the role executes the Run method. Neste momento, o controlador de recursos de infraestrutura pode começar a enviar pedidos para a função.At this point, the fabric controller can start sending requests to the role.

Coloque o código que cria realmente as tarefas no método Run.Place the code that actually creates the tasks in the Run method. Tenha em atenção que o método Run define a duração da instância de função.Note that the Run method defines the lifetime of the role instance. Quando este método é concluído, o controlador de recursos de infraestrutura assume a responsabilidade pelo encerramento da função.When this method completes, the fabric controller will arrange for the role to be shut down.

Quando uma função é encerrada ou reciclada, o controlador de recursos de infraestrutura impede a receção de mais pedidos enviados para o balanceador de carga e gera o evento Stop.When a role shuts down or is recycled, the fabric controller prevents any more incoming requests being received from the load balancer and raises the Stop event. Pode capturar este evento ao substituir o método OnStop da função e ao realizar qualquer retificação necessária antes de a função terminar.You can capture this event by overriding the OnStop method of the role and perform any tidying up required before the role terminates.

Todas as ações realizadas no método OnStop têm de ser concluídas em cinco minutos (ou 30 segundos, se estiver a utilizar o emulador do Azure num computador local).Any actions performed in the OnStop method must be completed within five minutes (or 30 seconds if you are using the Azure emulator on a local computer). Caso contrário, o controlador de recursos de infraestrutura do Microsoft Azure assume que a função parou e forçará a sua paragem.Otherwise the Azure fabric controller assumes that the role has stalled and will force it to stop.

As tarefas são iniciadas pelo método Run que aguarda a conclusão das tarefas.The tasks are started by the Run method that waits for the tasks to complete. As tarefas implementam a lógica de negócio do serviço cloud e podem responder a mensagens publicadas na função através do balanceador de carga do Azure.The tasks implement the business logic of the cloud service, and can respond to messages posted to the role through the Azure load balancer. A figura mostra o ciclo de vida das tarefas e dos recursos numa função de um serviço cloud do Azure.The figure shows the lifecycle of tasks and resources in a role in an Azure cloud service.

Ciclo de vida das tarefas e dos recursos numa função de um serviço cloud do Azure

O ficheiro WorkerRole.cs no projeto ComputeResourceConsolidation.Worker mostra um exemplo de como pode implementar este padrão num serviço cloud do Azure.The WorkerRole.cs file in the ComputeResourceConsolidation.Worker project shows an example of how you might implement this pattern in an Azure cloud service.

O projeto ComputeResourceConsolidation.Worker faz parte da solução ComputeResourceConsolidation disponível para transferência no GitHub.The ComputeResourceConsolidation.Worker project is part of the ComputeResourceConsolidation solution available for download from GitHub.

Os métodos MyWorkerTask1 e MyWorkerTask2 ilustram como realizar tarefas diferentes na mesma função de trabalho.The MyWorkerTask1 and the MyWorkerTask2 methods illustrate how to perform different tasks within the same worker role. O código seguinte mostra MyWorkerTask1.The following code shows MyWorkerTask1. Esta é uma tarefa simples que permanece suspensa durante 30 segundos e, em seguida, envia uma mensagem de rastreio.This is a simple task that sleeps for 30 seconds and then outputs a trace message. Este procedimento repete o processo até que a tarefa seja cancelada.It repeats this process until the task is canceled. O código em MyWorkerTask2 é semelhante.The code in MyWorkerTask2 is similar.

// A sample worker role task.
private static async Task MyWorkerTask1(CancellationToken ct)
{
  // Fixed interval to wake up and check for work and/or do work.
  var interval = TimeSpan.FromSeconds(30);

  try
  {
    while (!ct.IsCancellationRequested)
    {
      // Wake up and do some background processing if not canceled.
      // TASK PROCESSING CODE HERE
      Trace.TraceInformation("Doing Worker Task 1 Work");

      // Go back to sleep for a period of time unless asked to cancel.
      // Task.Delay will throw an OperationCanceledException when canceled.
      await Task.Delay(interval, ct);
    }
  }
  catch (OperationCanceledException)
  {
    // Expect this exception to be thrown in normal circumstances or check
    // the cancellation token. If the role instances are shutting down, a
    // cancellation request will be signaled.
    Trace.TraceInformation("Stopping service, cancellation requested");

    // Rethrow the exception.
    throw;
  }
}

O código de exemplo mostra uma implementação comum de um processo em segundo plano.The sample code shows a common implementation of a background process. Numa aplicação do mundo real, pode seguir esta mesma estrutura, só que deve colocar a sua própria lógica de processamento no corpo do ciclo a aguardar o pedido de cancelamento.In a real world application you can follow this same structure, except that you should place your own processing logic in the body of the loop that waits for the cancellation request.

Depois de a função de trabalho ter inicializado os recursos que utiliza, o método Run inicia as duas tarefas em simultâneo, conforme mostrado aqui.After the worker role has initialized the resources it uses, the Run method starts the two tasks concurrently, as shown here.

/// <summary>
/// The cancellation token source use to cooperatively cancel running tasks
/// </summary>
private readonly CancellationTokenSource cts = new CancellationTokenSource();

/// <summary>
/// List of running tasks on the role instance
/// </summary>
private readonly List<Task> tasks = new List<Task>();

// RoleEntry Run() is called after OnStart().
// Returning from Run() will cause a role instance to recycle.
public override void Run()
{
  // Start worker tasks and add to the task list
  tasks.Add(MyWorkerTask1(cts.Token));
  tasks.Add(MyWorkerTask2(cts.Token));

  foreach (var worker in this.workerTasks)
  {
      this.tasks.Add(worker);
  }

  Trace.TraceInformation("Worker host tasks started");
  // The assumption is that all tasks should remain running and not return,
  // similar to role entry Run() behavior.
  try
  {
    Task.WaitAll(tasks.ToArray());
  }
  catch (AggregateException ex)
  {
    Trace.TraceError(ex.Message);

    // If any of the inner exceptions in the aggregate exception
    // are not cancellation exceptions then re-throw the exception.
    ex.Handle(innerEx => (innerEx is OperationCanceledException));
  }

  // If there wasn't a cancellation request, stop all tasks and return from Run()
  // An alternative to canceling and returning when a task exits would be to
  // restart the task.
  if (!cts.IsCancellationRequested)
  {
    Trace.TraceInformation("Task returned without cancellation request");
    Stop(TimeSpan.FromMinutes(5));
  }
}
...

Neste exemplo, o método Run aguarda a conclusão das tarefas.In this example, the Run method waits for tasks to be completed. Se uma tarefa for cancelada, o método Run assumirá que a função está a ser encerrada e aguardará que as tarefas restantes sejam canceladas antes de concluir (aguarda um máximo de cinco minutos antes de terminar).If a task is canceled, the Run method assumes that the role is being shut down and waits for the remaining tasks to be canceled before finishing (it waits for a maximum of five minutes before terminating). Se uma tarefa falhar devido a uma exceção esperada, o método Run cancelará a tarefa.If a task fails due to an expected exception, the Run method cancels the task.

Pode implementar estratégias de monitorização e processamento de exceções mais abrangentes no método Run, tal como reiniciar as tarefas que falharam ou incluir o código que permite à função parar e iniciar tarefas individuais.You could implement more comprehensive monitoring and exception handling strategies in the Run method such as restarting tasks that have failed, or including code that enables the role to stop and start individual tasks.

O método Stop mostrado no código seguinte é chamado quando o controlador de recursos de infraestrutura encerra a instância de função (invocado no método OnStop).The Stop method shown in the following code is called when the fabric controller shuts down the role instance (it's invoked from the OnStop method). O código para cada uma das tarefas de uma forma simples cancelando-as.The code stops each task gracefully by canceling it. Se alguma das tarefas demorar mais de cinco minutos a ser concluída, o processamento de cancelamento no método Stop deixará de esperar e a função será terminada.If any task takes more than five minutes to complete, the cancellation processing in the Stop method ceases waiting and the role is terminated.

// Stop running tasks and wait for tasks to complete before returning
// unless the timeout expires.
private void Stop(TimeSpan timeout)
{
  Trace.TraceInformation("Stop called. Canceling tasks.");
  // Cancel running tasks.
  cts.Cancel();

  Trace.TraceInformation("Waiting for canceled tasks to finish and return");

  // Wait for all the tasks to complete before returning. Note that the
  // emulator currently allows 30 seconds and Azure allows five
  // minutes for processing to complete.
  try
  {
    Task.WaitAll(tasks.ToArray(), timeout);
  }
  catch (AggregateException ex)
  {
    Trace.TraceError(ex.Message);

    // If any of the inner exceptions in the aggregate exception
    // are not cancellation exceptions then rethrow the exception.
    ex.Handle(innerEx => (innerEx is OperationCanceledException));
  }
}

Os padrões e orientações que se seguem também podem ser relevantes ao implementar este padrão:The following patterns and guidance might also be relevant when implementing this pattern:

  • Orientações de Dimensionamento Automático.Autoscaling Guidance. O dimensionamento automático pode ser utilizado para iniciar e parar instâncias do serviço a alojar recursos computacionais, consoante a necessidade prevista de processamento.Autoscaling can be used to start and stop instances of service hosting computational resources, depending on the anticipated demand for processing.

  • Orientações sobre a Criação de Partições de Dados Computacionais.Compute Partitioning Guidance. Descreve como alocar serviços e componentes na cloud de uma forma que ajuda a minimizar os custos de execução enquanto mantém a escalabilidade, o desempenho, a disponibilidade e a segurança do serviço.Describes how to allocate the services and components in a cloud service in a way that helps to minimize running costs while maintaining the scalability, performance, availability, and security of the service.

  • Este padrão inclui uma aplicação de exemplo transferível.This pattern includes a downloadable sample application.