İşlem Kaynağı Birleştirme düzeni
Birden çok görevi veya işlemi tek bir hesaplama biriminde birleştirin. 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.
Bağlam ve sorun
Bir bulut uygulama genelde çeşitli işlemler uygular. 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). 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.
Ö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. Her hesaplama birimi kendi sanal ortamında çalışır. 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.

Boşta veya az kullanılan hesaplama birimleri bile ücrete tabi kaynaklar kullanır. Bu nedenle, bu her zaman en uygun maliyetli çözüm değildir.
Azure'da, bu sorun Bulut Hizmeti, Uygulama Hizmetleri ve Sanal Makineler rolleri için geçerlidir. Bu öğeler, kendi sanal ortamlarında çalıştırılır. 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.
Çözüm
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.
Görevler ortam tarafından sağlanan özellikler ve bu özelliklerle ilişkili maliyetlere ilişkin ölçütlere göre gruplanabilir. Ö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. Bunların bir araya gruplandırılması bir birim olarak ölçeklendirilmelerini sağlar. 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. Örneğin Azure, Bulut Hizmeti, Uygulama Hizmetleri ve Sanal Makineler rollerinde uygulayabileceğiniz otomatik ölçeklendirme özellikleri sağlar. Daha fazla bilgi için bkz. Otomatik Ölçeklendirme Kılavuzu.
Ö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:
- Görev 1, arada sırada kuyruğa gönderilen, zaman duyarsız iletileri yoklar.
- Görev 2 ağ trafiğinde yüksek hacimli artışları işler.
İ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. İ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.
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. Genellikle, daha fazla kaynak belirtildikçe maliyet artar. Tasarruf etmek için pahalı hesaplama birimlerinin yaptığı işleri artırmak ve uzun süre boşta kalmamalarını sağlamak önemlidir.
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. 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. Örneğin uzun süre çalışan, işlem yoğunluklu görevler aynı işlem birimini paylaşmamalıdır.
Sorunlar ve dikkat edilmesi gerekenler
Bu düzeni uygularken aşağıdaki noktaları dikkate alın:
Ölçeklenebilirlik ve esneklik. Pek çok bulut çözümü, işlem birimi düzeyinde birim örneklerini başlatarak ve durdurarak ölçeklenebilirlik ve esneklik sağlar. Ölçeklenebilirlik gereksinimlerini birbiriyle çakışan görevleri aynı işlem biriminde gruplandırmaktan kaçının.
Yaşam süresi. Bulut altyapısı, işlem birimini barındıran sanal ortamı düzenli aralıklarla geri dönüştürür. İş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. 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.
Yayın sıklığı. 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. 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.
Güvenlik. Aynı hesaplama birimindeki görevler aynı güvenlik bağlamını paylaşabilir ve aynı kaynaklara erişebilir. 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. 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. Her görev yalnızca en fazla güvenlik açığına sahip görev kadar güvenlidir.
Hataya dayanıklılık. İş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. Ö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.
Çekişme. Aynı işlem biriminde kaynak için rekabet eden görevler arasında çekişme oluşturmaktan kaçının. İdeal olarak, aynı işlem birimini paylaşan görevlerin farklı kaynak kullanımı özellikleri göstermesi gerekir. Ö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. Ancak, yoğun bir miktarda bellek gerektiren bir görevle yoğun işlem gücü olan bir görevi karıştırmak, daha fazla bir bileşimdir.
Not
İşleçlerin ve geliştiricilerin sistemi izleyebilmesi ve her görevin farklı kaynakları nasıl kullandığını tanımlayan bir ısı haritası oluşturabilmesi için işlem kaynaklarını yalnızca üretimde bir süre için birleştirmeyi düşünün. Bu harita, hangi görevlerin işlem kaynaklarını paylaşmak için iyi adaylar olduğunu belirlemek için kullanılabilir.
Karmaşıklık. 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.
Kararlı mantıksal mimari. Her görevin kodunu, görevin üzerinde çalıştığı fiziksel ortam değişse bile değişmeyecek şekilde tasarlayın ve uygulayın.
Diğer stratejiler. İş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. Etkili bir yaklaşım olması için dikkatli planlanması ve izlenmesi gerekir. İşin ve bu görevleri çalıştıran kullanıcıların nerede bulunduğuna bağlı olarak diğer stratejiler daha uygun olabilir. Ö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.
Bu düzenin kullanılacağı durumlar
Kendi hesaplama birimlerinde çalıştırırsanız uygun maliyetli olmayacak görevler için bu düzeni kullanın. Bir görev boşta çok zaman harcıyorsa, bu görevi adanmış birimde çalıştırmak pahalı olabilir.
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. Bu görevler kendi yalıtılmış ortamlarında, ayrı bir hesaplama biriminde çalıştırılmalıdır.
Örnek
Azure 'da bir bulut hizmeti oluştururken, birden çok görev tarafından gerçekleştirilen işlemeyi tek bir rol halinde birleştirmek mümkündür. Genellikle bu, arka plan veya zaman uyumsuz işleme görevlerini gerçekleştiren bir çalışan rolüdür.
Bazı durumlarda web rolüne arka plan veya zaman uyumsuz işleme görevlerini dahil etmek mümkündür. 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.
Rol, görevleri başlatma ve durdurma işlemlerinden sorumludur. Azure yapı denetleyicisi bir rol yüklediğinde rol için Start olayını başlatır. 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.
OnStartYöntem tamamlandığında rol, isteklere yanıt vermeye başlayabilir. OnStartVe Run yöntemlerini OnStart bölümündeki bir rol içinde kullanma hakkında daha fazla bilgi ve yönergeler, &Runmodeller Yöntemler Kılavuzu ' nda yer alabilir.
OnStartyöntemindeki kodu olabildiğince kısa tutun. 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.
OnStart yöntemi tamamlandığında, rol Run yöntemini başlatır. Bu noktada, yapı denetleyicisi role istek göndermeye başlayabilir.
Görevleri oluşturan kodu Run yöntemine yerleştirin. Run yönteminin rol örneği ömrünü tanımladığını unutmayın. Bu yöntem tamamlandığında, yapı denetleyicisi rolün kapatılmasını düzenler.
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. 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.
OnStopyö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. Aksi takdirde Azure yapı denetleyicisi rolün geciktiğini varsayar ve durdurulmasını sağlar.
Görevler, görevlerin tamamlanmasını bekleyecek Run yöntemi tarafından başlatılır. Görevler, bulut hizmetinin iş mantığını uygular ve Azure yük dengeleyici üzerinden role gönderilen iletilere yanıt verebilir. Şekilde, bir Azure bulut hizmeti rolündeki görevler ve kaynakların yaşam döngüsü gösterilmiştir.

ComputeResourceConsolidation.Worker projesindeki WorkerRole.cs dosyası, Azure bulut hizmetinde bu düzeni nasıl uygulayabileceğinizi gösterir.
ComputeResourceConsolidation.Worker projesi, GitHub’dan indirebileceğiniz ComputeResourceConsolidation çözümünün bir parçasıdır.
MyWorkerTask1 ve MyWorkerTask2 yöntemleri, aynı çalışan rolü içindeki farklı görevlerin nasıl gerçekleştirileceğini göstermektedir. Aşağıdaki kodda MyWorkerTask1 gösterilmiştir. Bu, 30 saniye için uyku moduna geçen ve sonra izleme iletisi üreten basit bir görevdir. Görev iptal edilene kadar bu işlem yinelenir. MyWorkerTask2 örneğindeki kod da buna benzer.
// 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. 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.
Çalışan rolü, kullandığı kaynakları başlattıktan sonra Run yöntemi burada gösterildiği gibi iki görevi aynı anda başlatır.
/// <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. 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). Bir görev beklenen bir özel durum nedeniyle başarısız olursa Run yöntemi görevi iptal eder.
Runyö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.
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). Bu kod tüm görevleri iptal ederek düzgün biçimde durdurur. 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.
// 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));
}
}
İlgili yönergeler
Bu düzen uygulanırken aşağıdaki düzenler ve yönergeler de yararlı olabilir:
Otomatik Ölçeklendirme Kılavuzu. 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.
İşlem Bölümleme Kılavuzu. 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.
Bu düzen, indirilebilir bir örnek uygulama içerir.