İşlem Kaynağı Birleştirme düzeniCompute Resource Consolidation pattern

Birden çok görevi veya işlemi tek bir hesaplama biriminde birleştirin.Consolidate multiple tasks or operations into a single computational unit. Bu, işlem kaynağı kullanımını artırabilir ve bulutta barındırılan uygulamalarda işlem gerçekleştirme ile ilişkili maliyetleri ve yönetim yükünü azaltır.This can increase compute resource utilization, and reduce the costs and management overhead associated with performing compute processing in cloud-hosted applications.

Bağlam ve sorunContext and problem

Bir bulut uygulama genelde çeşitli işlemler uygular.A cloud application often implements a variety of operations. Bazı çözümlerde, başlangıçta sorunların ayrılması tasarım ilkesini izlemek ve işlemleri her biri kendi başına barındırılan ve dağıtılan ayrı hesaplama birimlerine ayırmak mantıklıdır (örneğin, ayrı App Service web uygulamaları, ayrı Sanal Makineler veya ayrı Bulut Hizmeti rolleri).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). Ancak, bu strateji çözümün mantıksal tasarımını kolaylaştırmaya yardımcı olsa da aynı uygulamanın bir parçası olarak çok sayıda hesaplama birimi dağıtılması çalışma zamanı barındırma maliyetlerini artırır ve yönetim sistemini daha karmaşık hale getirebilir.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.

Örnek olarak, şekilde birden fazla hesaplama birimi kullanılarak uygulanan bulut tarafından barındırılan bir çözümün basitleştirilmiş yapısı gösterilmektedir.As an example, the figure shows the simplified structure of a cloud-hosted solution that is implemented using more than one computational unit. Her hesaplama birimi kendi sanal ortamında çalışır.Each computational unit runs in its own virtual environment. Her işlev (Görev A - Görev E arası etiketler) ayrı bir görev olarak uygulanmıştır ve kendi hesaplama biriminde çalışır.Each function has been implemented as a separate task (labeled Task A through Task E) running in its own computational unit.

Görevleri ayrılmış hesaplama birimleri kümesi kullanarak bulut ortamında çalıştırma

Boşta veya az kullanılan hesaplama birimleri bile ücrete tabi kaynaklar kullanır.Each computational unit consumes chargeable resources, even when it's idle or lightly used. Bu nedenle, bu her zaman en uygun maliyetli çözüm değildir.Therefore, this isn't always the most cost-effective solution.

Azure'da, bu sorun Bulut Hizmeti, Uygulama Hizmetleri ve Sanal Makineler rolleri için geçerlidir.In Azure, this concern applies to roles in a Cloud Service, App Services, and Virtual Machines. Bu öğeler, kendi sanal ortamlarında çalıştırılır.These items run in their own virtual environment. Bir dizi iyi tanımlanmış işlemleri gerçekleştirmek için tasarlanmış, ancak tek bir çözümün bir parçası olarak iletişim kurması ve birlikte çalışması gereken ayrı rolleri, web sitelerini veya sanal makineleri grup halinde çalıştırmak kaynakların verimsiz kullanılmasına neden olabilir.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.

ÇözümSolution

Maliyetleri azaltmak, kullanımını artırmak, iletişim hızını artırmak ve yönetim işlemlerini azaltmaya yardımcı olmak için birden çok görevi veya işlemi tek bir hesaplama biriminde birleştirmek mümkündür.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.

Görevler ortam tarafından sağlanan özellikler ve bu özelliklerle ilişkili maliyetlere ilişkin ölçütlere göre gruplanabilir.Tasks can be grouped according to criteria based on the features provided by the environment and the costs associated with these features. Ölçeklenebilirlik, yaşam süresi ve işlem gereksinimleri açısından benzer bir profile sahip görevleri bulmak sık kullanılan bir yaklaşımdır.A common approach is to look for tasks that have a similar profile concerning their scalability, lifetime, and processing requirements. Bunların bir araya gruplandırılması bir birim olarak ölçeklendirilmelerini sağlar.Grouping these together allows them to scale as a unit. Pek çok bulut ortamı tarafından sağlanan esneklik, hesaplama biriminin ek örneklerinin iş yüküne göre durdurulmasına ve başlatılmasına olanak sağlar.The elasticity provided by many cloud environments enables additional instances of a computational unit to be started and stopped according to the workload. Örneğin Azure, Bulut Hizmeti, Uygulama Hizmetleri ve Sanal Makineler rollerinde uygulayabileceğiniz otomatik ölçeklendirme özellikleri sağlar.For example, Azure provides autoscaling that you can apply to roles in a Cloud Service, App Services, and Virtual Machines. Daha fazla bilgi için bkz. Otomatik Ölçeklendirme Kılavuzu.For more information, see Autoscaling Guidance.

Ölçeklenebilirliğin hangi işlemlerin gruplanmaması gerektiğini belirlemek için nasıl kullanılabileceğini göstermek için bir örnek olarak, aşağıdaki iki görevi göz önünde bulundurun: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:

  • Görev 1, arada sırada kuyruğa gönderilen, zaman duyarsız iletileri yoklar.Task 1 polls for infrequent, time-insensitive messages sent to a queue.
  • Görev 2 ağ trafiğinde yüksek hacimli artışları işler.Task 2 handles high-volume bursts of network traffic.

İkinci görev, işlem biriminin çok sayıda örneğinin başlatılmasını ve durdurulmasını içerebilen bir esneklik düzeyi gerektirir.The second task requires elasticity that can involve starting and stopping a large number of instances of the computational unit. İlk göreve aynı ölçeklendirmenin uygulanması yalnızca daha fazla görevin aynı kuyruğa arada sırada gönderilen iletileri dinlemesine ve kaynakların boşa harcanmasına neden olur.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.

Pek çok bulut ortamında CPU çekirdekleri, bellek, disk alanı ve benzeri sayısı bakımından hesaplama birimine ayrılan kaynakları belirtmek mümkündür.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. Genellikle, daha fazla kaynak belirtildikçe maliyet artar.Generally, the more resources specified, the greater the cost. Tasarruf etmek için pahalı hesaplama birimlerinin yaptığı işleri artırmak ve uzun süre boşta kalmamalarını sağlamak önemlidir.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.

Kısa zamanda büyük miktarda CPU gücü gerektiren görevler varsa bunları gerekli gücü sağlayacak tek bir hesaplama biriminde birleştirmeyi göz önünde bulundurun.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. Bununla birlikte, pahalı kaynakları kullanma gereksinimine göre planlama yaparken bu kaynakların fazla yük altında kalıp çekişmeli duruma gelmemesine dikkat etmek gerekir.However, it's important to balance this need to keep expensive resources busy against the contention that could occur if they are over stressed. Örneğin uzun süre çalışan, işlem yoğunluklu görevler aynı işlem birimini paylaşmamalıdır.Long-running, compute-intensive tasks shouldn't share the same computational unit, for example.

Sorunlar ve dikkat edilmesi gerekenlerIssues and considerations

Bu düzeni uygularken aşağıdaki noktaları dikkate alın:Consider the following points when implementing this pattern:

Ölçeklenebilirlik ve esneklik.Scalability and elasticity. Pek çok bulut çözümü, işlem birimi düzeyinde birim örneklerini başlatarak ve durdurarak ölçeklenebilirlik ve esneklik sağlar.Many cloud solutions implement scalability and elasticity at the level of the computational unit by starting and stopping instances of units. Ölçeklenebilirlik gereksinimlerini birbiriyle çakışan görevleri aynı işlem biriminde gruplandırmaktan kaçının.Avoid grouping tasks that have conflicting scalability requirements in the same computational unit.

Ömür.Lifetime. Bulut altyapısı, işlem birimini barındıran sanal ortamı düzenli aralıklarla geri dönüştürür.The cloud infrastructure periodically recycles the virtual environment that hosts a computational unit. İşlem biriminde uzun süre çalışan çok sayıda görev olduğunda, bu görevler bitinceye kadar birimin silinmesini önlemek için birimi yapılandırmak gerekli olabilir.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. Alternatif olarak, görevleri düzgün bir şekilde durdurulmalarını ve işlem birimi yeniden başlatıldığında kaldığı noktadan devam edebilecekleri bir onay işareti yaklaşımıyla tasarlayın.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.

Yayın sıklığı.Release cadence. Bir görevin uygulanması veya yapılandırması sık değişirse, güncelleştirilmiş kodu barındıran işlem birimini durdurmak, yeniden yapılandırmak, yeniden dağıtmak ve yeniden başlatmak gerekli olabilir.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. Bu işlem ayrıca aynı hesaplama birimindeki tüm diğer görevlerin durdurulmasını, yeniden dağıtılmasını ve yeniden başlatılmasını gerektirir.This process will also require that all other tasks within the same computational unit are stopped, redeployed, and restarted.

Güvenlik.Security. Aynı hesaplama birimindeki görevler aynı güvenlik bağlamını paylaşabilir ve aynı kaynaklara erişebilir.Tasks in the same computational unit might share the same security context and be able to access the same resources. Görevler arasında yüksek derecede güven ve bir görevin diğerini bozmayacağı ve olumsuz etkilemeyeceği konusunda güvenilirlik olmalıdır.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. Ayrıca, bir işlem biriminde çalışan görevlerin sayısının artırılması birimin saldırı yüzeyini artırır.Additionally, increasing the number of tasks running in a computational unit increases the attack surface of the unit. Her görev yalnızca en fazla güvenlik açığına sahip görev kadar güvenlidir.Each task is only as secure as the one with the most vulnerabilities.

Hataya dayanıklılık.Fault tolerance. İşlem birimindeki bir görev başarısız olduğunda veya anormal davrandığında, aynı birim içinde çalışan diğer görevleri etkileyebilir.If one task in a computational unit fails or behaves abnormally, it can affect the other tasks running within the same unit. Örneğin, bir görevin doğru şekilde başlatılması başarısız olursa, işlem biriminin tüm başlangıç mantığı başarısız olabilir ve diğer görevlerin de aynı birimde çalışmasını engelleyebilir.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.

Çekişme.Contention. Aynı işlem biriminde kaynak için rekabet eden görevler arasında çekişme oluşturmaktan kaçının.Avoid introducing contention between tasks that compete for resources in the same computational unit. İdeal olarak, aynı işlem birimini paylaşan görevlerin farklı kaynak kullanımı özellikleri göstermesi gerekir.Ideally, tasks that share the same computational unit should exhibit different resource utilization characteristics. Örneğin, iki işlem yoğunluklu görev ya da bellek tüketimi yüksek iki görev aynı hesaplama biriminde yer almamalıdır.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. Ancak, bir işlem yoğunluklu görev ile büyük miktarda bellek gerektiren bir görev bir arada bulunabilir.However, mixing a compute intensive task with a task that requires a large amount of memory is a workable combination.

Not

Kullanıcılar ve geliştiricilerin sistemi izlemesini ve her görevin farklı kaynakları nasıl kullandığını belirlemesini sağlayan bir ısı haritası oluşturmasına olanak vermek için yalnızca üretimde bir süre boyunca yer almış sistemlerin işlem kaynaklarını birleştirmeyi göz önünde bulundurun.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. Bu harita, hangi görevlerin işlem kaynaklarını paylaşmak için iyi adaylar olduğunu belirlemek için kullanılabilir.This map can be used to determine which tasks are good candidates for sharing compute resources.

Karmaşıklık.Complexity. Birden çok görevi tek bir hesaplama biriminde birleştirmek, birimdeki kodu karmaşıklaştırır ve test etmeyi, hata ayıklamayı ve bakımı zorlaştırabilir.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.

Kararlı mantıksal mimari.Stable logical architecture. Her görevin kodunu, görevin üzerinde çalıştığı fiziksel ortam değişse bile değişmeyecek şekilde tasarlayın ve uygulayın.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.

Diğer stratejiler.Other strategies. İşlem kaynaklarını birleştirmek eşzamanlı olarak çalışan birden çok görev ile ilişkili maliyetleri azaltmaya yardımcı olmak için yalnızca bir yoldur.Consolidating compute resources is only one way to help reduce costs associated with running multiple tasks concurrently. Etkili bir yaklaşım olması için dikkatli planlanması ve izlenmesi gerekir.It requires careful planning and monitoring to ensure that it remains an effective approach. İşin ve bu görevleri çalıştıran kullanıcıların nerede bulunduğuna bağlı olarak diğer stratejiler daha uygun olabilir.Other strategies might be more appropriate, depending on the nature of the work and where the users these tasks are running are located. Örneğin, iş yükünün işlevsel ayrıştırılması (İşlem Bölümleme Kılavuzu’nda açıklandığı şekliyle) daha iyi bir seçenek olabilir.For example, functional decomposition of the workload (as described by the Compute Partitioning Guidance) might be a better option.

Bu düzenin kullanılacağı durumlarWhen to use this pattern

Kendi hesaplama birimlerinde çalıştırırsanız uygun maliyetli olmayacak görevler için bu düzeni kullanın.Use this pattern for tasks that are not cost effective if they run in their own computational units. Bir görev boşta çok zaman harcıyorsa, bu görevi adanmış birimde çalıştırmak pahalı olabilir.If a task spends much of its time idle, running this task in a dedicated unit can be expensive.

Bu düzen kritik, hataya dayanıklı işlemler yapan görevler veya yüksek oranda gizli veya özel verileri işleyen ve kendi özel güvenlik bağlamını gerektiren görevler için uygun olmayabilir.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. Bu görevler kendi yalıtılmış ortamlarında, ayrı bir hesaplama biriminde çalıştırılmalıdır.These tasks should run in their own isolated environment, in a separate computational unit.

ÖrnekExample

Azure’da bir bulut hizmeti oluştururken, birden çok görev tarafından gerçekleştirilen işlemleri tek bir rolde birleştirmek mümkündür.When building a cloud service on Azure, it’s possible to consolidate the processing performed by multiple tasks into a single role. Genellikle bu, arka plan veya zaman uyumsuz işleme görevlerini gerçekleştiren bir çalışan rolüdür.Typically this is a worker role that performs background or asynchronous processing tasks.

Bazı durumlarda web rolüne arka plan veya zaman uyumsuz işleme görevlerini dahil etmek mümkündür.In some cases it's possible to include background or asynchronous processing tasks in the web role. Bu teknik maliyetleri azaltmaya ve dağıtımı kolaylaştırmaya yardımcı olur. Ancak web rolü tarafından sağlanan genel kullanıma yönelik arabirimin yanıt hızını ve ölçeklenebilirliğini etkileyebilir.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.

Rol, görevleri başlatma ve durdurma işlemlerinden sorumludur.The role is responsible for starting and stopping the tasks. Azure yapı denetleyicisi bir rol yüklediğinde rol için Start olayını başlatır.When the Azure fabric controller loads a role, it raises the Start event for the role. Bu olayı işlemek, verileri ve bu yöntemdeki görevlerin bağlı olduğu diğer kaynaklar başlatmak için WebRole veya WorkerRole sınıfının OnStart yöntemini geçersiz kılabilirsiniz.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.

Zaman OnStart yöntemi tamamlandığında, rol isteklere yanıt başlayabilirsiniz.When the OnStart method completes, the role can start responding to requests. OnStart ve Run yöntemlerini bir rolde kullanma hakkında daha fazla bilgiyi Uygulamaları Buluta Taşıma adlı yaklaşım ve yöntem kılavuzunun Uygulama Başlatma İşlemleri bölümünde bulabilirsiniz.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.

OnStart yöntemindeki kodu olabildiğince kısa tutun.Keep the code in the OnStart method as concise as possible. Azure, bu yöntemin tamamlanması için harcanan süre üzerinde herhangi bir sınır koymaz, ancak rol bu yöntem tamamlanana kadar kendisine gönderilen ağ isteklerine yanıt vermeye başlamaz.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.

OnStart yöntemi tamamlandığında, rol Run yöntemini başlatır.When the OnStart method has finished, the role executes the Run method. Bu noktada, yapı denetleyicisi role istek göndermeye başlayabilir.At this point, the fabric controller can start sending requests to the role.

Görevleri oluşturan kodu Run yöntemine yerleştirin.Place the code that actually creates the tasks in the Run method. Run yönteminin rol örneği ömrünü tanımladığını unutmayın.Note that the Run method defines the lifetime of the role instance. Bu yöntem tamamlandığında, yapı denetleyicisi rolün kapatılmasını düzenler.When this method completes, the fabric controller will arrange for the role to be shut down.

Bir rol kapandığında veya geri dönüştürüldüğünde, yapı denetleyicisi, yük dengeleyicisinden istek gelmesini engeller ve Stop olayını başlatır.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. Rolün OnStop yöntemini geçersiz kılarak bu olayı yakalayabilir ve rol sona erdirmeden önce gerekli tüm temizliği gerçekleştirebilirsiniz.You can capture this event by overriding the OnStop method of the role and perform any tidying up required before the role terminates.

OnStop yönteminde yapılan tüm eylemler beş dakika (veya yerel bilgisayarda Azure öykünücüsü kullanıyorsanız, 30 saniye) içinde tamamlanmalıdır.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). Aksi takdirde Azure yapı denetleyicisi rolün geciktiğini varsayar ve durdurulmasını sağlar.Otherwise the Azure fabric controller assumes that the role has stalled and will force it to stop.

Görevler, görevlerin tamamlanmasını bekleyecek Run yöntemi tarafından başlatılır.The tasks are started by the Run method that waits for the tasks to complete. Görevler, bulut hizmetinin iş mantığını uygular ve Azure yük dengeleyici üzerinden role gönderilen iletilere yanıt verebilir.The tasks implement the business logic of the cloud service, and can respond to messages posted to the role through the Azure load balancer. Şekilde, bir Azure bulut hizmeti rolündeki görevler ve kaynakların yaşam döngüsü gösterilmiştir.The figure shows the lifecycle of tasks and resources in a role in an Azure cloud service.

Azure bulut hizmeti rolündeki görevler ve kaynakların yaşam döngüsü

ComputeResourceConsolidation.Worker projesindeki WorkerRole.cs dosyası, Azure bulut hizmetinde bu düzeni nasıl uygulayabileceğinizi gösterir.The WorkerRole.cs file in the ComputeResourceConsolidation.Worker project shows an example of how you might implement this pattern in an Azure cloud service.

ComputeResourceConsolidation.Worker projesi, GitHub’dan indirebileceğiniz ComputeResourceConsolidation çözümünün bir parçasıdır.The ComputeResourceConsolidation.Worker project is part of the ComputeResourceConsolidation solution available for download from GitHub.

MyWorkerTask1 ve MyWorkerTask2 yöntemleri, aynı çalışan rolü içindeki farklı görevlerin nasıl gerçekleştirileceğini göstermektedir.The MyWorkerTask1 and the MyWorkerTask2 methods illustrate how to perform different tasks within the same worker role. Aşağıdaki kodda MyWorkerTask1 gösterilmiştir.The following code shows MyWorkerTask1. Bu, 30 saniye için uyku moduna geçen ve sonra izleme iletisi üreten basit bir görevdir.This is a simple task that sleeps for 30 seconds and then outputs a trace message. Görev iptal edilene kadar bu işlem yinelenir.It repeats this process until the task is canceled. MyWorkerTask2 örneğindeki kod da buna benzer.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;
  }
}

Örnek kod, bir arka plan işleminin sık kullanılan bir uygulamasını gösterir.The sample code shows a common implementation of a background process. Gerçek hayatta da bu aynı yapıyı izleyebilirsiniz. Ancak iptal isteğini bekleyen döngünün gövdesinde kendi işlem mantığınızı kullanmanız gerekir.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.

Çalışan rolü kullandığı kaynakları başlatıldıktan sonra Run aşağıda gösterildiği gibi yöntemi iki görev aynı anda başlar.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));
  }
}
...

Bu örnekte, Run yöntemi görevlerin tamamlanmasını bekler.In this example, the Run method waits for tasks to be completed. Bir görev iptal edilirse, Run yöntemi rolün kapatılıyor olduğunu varsayar ve bitmeden önce kalan görevlerin iptal edilmesini bekler (kapanmadan önce en fazla beş dakika bekler).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). Bir görev beklenen bir özel durum nedeniyle başarısız olursa Run yöntemi görevi iptal eder.If a task fails due to an expected exception, the Run method cancels the task.

Run yönteminde daha kapsamlı izleme ve özel durum işleme stratejileri uygulayabilirsiniz. Örneğin başarısız olan görevleri yeniden başlatan, her bir görevi ayrı başlatmayı veya durdurmayı sağlayan kodlar ekleyebilirsiniz.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.

Aşağıdaki kodda gösterilen Stop yöntemi, yapı denetleyicisi rol örneğini kapattığında çağrılır (OnStop yönteminden başlatılır).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). Bu kod tüm görevleri iptal ederek düzgün biçimde durdurur.The code stops each task gracefully by canceling it. Herhangi bir görevin tamamlanması beş dakikadan uzun sürerse Stop yöntemindeki iptal işlemi beklemeyi bırakır ve rol sonlandırılır.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));
  }
}

Bu düzen uygulanırken aşağıdaki düzenler ve yönergeler de yararlı olabilir:The following patterns and guidance might also be relevant when implementing this pattern:

  • Otomatik Ölçeklendirme Kılavuzu.Autoscaling Guidance. Otomatik ölçeklendirme, işlem için beklenen isteğe bağlı olarak hesaplama kaynaklarını barındıran hizmetin örneklerini durdurmak ve başlatmak için kullanılabilir.Autoscaling can be used to start and stop instances of service hosting computational resources, depending on the anticipated demand for processing.

  • İşlem Bölümleme Kılavuzu.Compute Partitioning Guidance. Bulut hizmetindeki hizmet ve bileşenlerin, işletim maliyetlerini en aza indirilmesini ve hizmetin ölçeklenebilirlik, performans, kullanılabilirlik ve güvenliğinin korunmasını sağlayacak bir şekilde nasıl ayrılacağını açıklar.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.

  • Bu düzen, indirilebilir bir örnek uygulama içerir.This pattern includes a downloadable sample application.