Ebedi Orkestrasyonlar

Sonsuz orkestrasyonlar, API'yi kullanarak kendi geçmişlerini düzenli aralıklarla resetleyip süresiz çalışan orchestrator işlevleridir continue-as-new . Veri toplayıcılar, periyodik arka plan görevleri ve sınırsız tarihçe büyümesi olmadan sonsuz döngü gerektiren Dayanıklı İşlevler senaryoları için kullanışlıdır.

continue-as-new olmadan, sürekli döngüde olan bir orkestratör zamanlanmış her görevle orkestrasyon geçmişi biriktirir, ve sonunda performans problemlerine ve aşırı bellek tüketimine yol açar. Sonsuz düzenleme düzeni, her yinelemenin geçmişini sıfırlayarak bunu çözer.

Uyarı

C#, JavaScript, Python ve Java için sonsuz düzenleme kodu örnekleri sağlanır. PowerShell desteklemez continue-as-new.

Bu makalede:

Ebedi düzenlemeler , API'yi kullanarak continue-as-new kendi geçmişlerini düzenli aralıklarla sıfırlayarak süresiz olarak çalışan düzenlemelerdir. Toplayıcılar, düzenli arka plan işleri ve sınırsız geçmiş birikimi olmadan sonsuz döngü gerektiren tüm senaryolar için kullanışlıdır.

continue-as-new olmadan, sürekli döngüye giren bir orkestrasyon her zamanlanmış görevle birlikte geçmiş biriktirir ve nihayetinde performans sorunları ile aşırı bellek kullanımına yol açar. Sonsuz düzenleme düzeni, her yinelemenin geçmişini sıfırlayarak bunu çözer.

Önemli

Şu anda PowerShell Dayanıklı Görev SDK'sı kullanılamıyor.

Bu makalede:

Yeni olarak devam etme nasıl çalışır?

Orchestrator işlevleri, sonsuz döngüler kullanmak yerine continue-as-new yöntemini çağırarak durumlarını sıfırlar. Bu yöntem, sonraki orchestrator işlev oluşturma işlemi için yeni giriş haline gelen JSON serileştirilebilir bir parametre alır.

çağırdığınızda continue-as-newdüzenleme örneği yeni giriş değeriyle kendini yeniden başlatır. Aynı örnek kimliği korunur, ancak düzenleyici işlevinin geçmişi sıfırlanır.

Düzenlemeler, sonsuz döngüler kullanmak yerine düzenleme bağlamındaki continue-as-new yöntemini çağırarak durumunu sıfırlar. Bu yöntem, sonraki düzenleme nesli için yeni giriş haline gelen JSON serileştirilebilir bir parametre alır.

çağırdığınızda continue-as-newdüzenleme örneği yeni giriş değeriyle kendini yeniden başlatır. Aynı örnek kimliği korunur, ancak orkestrasyonun geçmişi sıfırlanır.

Ebedi düzenlemeyle ilgili dikkat edilmesi gerekenler

continue-as-new yöntemini bir düzenlemede kullanırken şu noktaları göz önünde bulundurun:

  • Bir düzenleyici işlevi yöntemi kullanılarak continue-as-new sıfırlandığında Dayanıklı Görev Çerçevesi aynı örnek kimliğini korur, ancak dahili olarak yeni bir yürütme kimliği oluşturur ve kullanır. Bu yürütme kimliği harici olarak açığa çıkarılmaz, ancak orchestrasyon yürütmesi sırasında hata ayıklarken kullanışlıdır.

  • Yürütme sırasında işlenmeyen bir özel durum oluştuğunda düzenleme başarısız bir duruma girer ve yürütme sonlandırılır. Bir finally bloğundan yapılan bir continue-as-new çağrısı, yakalanmayan bir özel durumdan sonra orchestrasyonu yeniden başlatmaz.

  • Tamamlanmamış görevlerin sonuçları, bir orkestrasyon çağırdığında continue-as-new atılır. Örneğin, bir zamanlayıcı ayarlanırsa ve zamanlayıcı tetiklenmeden önce continue-as-new çağrılırsa, zamanlayıcı olayı atılır.

  • İsteğe bağlı olarak, yeniden başlatmalar sırasında continue-as-new işlenmemiş dış olayları koruyabilirsiniz. C# dilinde, ContinueAsNew işlenmemiş olayları varsayılan olarak korur. Java'da continueAsNew de varsayılan olarak olayları korur. Python'da continue_as_new, save_events=True sürece olayları korumaz. JavaScript'te, continueAsNew bu davranışı denetlemek için bir saveEvents parametre (true veya false) gerektirir.

continue-as-new yöntemini bir düzenlemede kullanırken şu noktaları göz önünde bulundurun:

  • Orkestrasyon continue-as-new metodu kullanılarak sıfırlandığında, Dayanıklı Görev SDK'ları aynı örnek kimliğini aynen muhafaza eder ancak bundan sonra dahili olarak yeni bir yürütme kimliği oluşturur ve kullanır. Bu yürütme kimliği dışarıdan kullanıma sunulmaz, ancak düzenleme yürütme hatalarını ayıklarken yararlı olabilir.

  • Yürütme sırasında işlenmeyen bir özel durum oluştuğunda düzenleme başarısız bir duruma girer ve yürütme sonlandırılır. Bir finally bloktan continue-as-new çağrısı, yakalanmamış bir istisnadan sonra orkestrasyonu yeniden başlatmaz.

  • Tamamlanmamış görevlerin sonuçları, bir orkestrasyon çağırdığında continue-as-new atılır. Örneğin, bir zamanlayıcı ayarlanırsa ve zamanlayıcı tetiklenmeden önce continue-as-new çağrılırsa, zamanlayıcı olayı atılır.

  • İsteğe bağlı olarak, yeniden başlatmalar sırasında continue-as-new işlenmemiş dış olayları koruyabilirsiniz. .NET ve Java continue-as-new, işlenmemiş olayları varsayılan olarak korur. Python'da continue_as_new, save_events=True sürece olayları korumaz. JavaScript'te, continueAsNew bu davranışı denetlemek için bir saveEvents parametre (true veya false) gerektirir. Tüm durumlarda, düzenleme waitForExternalEvent veya wait_for_external_event öğesini bir sonraki çağırdığında işlenmemiş olaylar teslim edilir.

Düzenli çalışma örneği

Sonsuz düzenlemelerde yaygın kullanım örneklerinden biri, temizleme işleri gibi düzenli arka plan çalışmalarıdır.

Zamanlayıcı tetikleyicisi neden kullanılmıyor? CRON tabanlı zamanlayıcı tetikleyicisi, önceki çalıştırmanın tamamlanıp tamamlanmadığına bakılmaksızın sabit zamanlarda çalışır. Kalıcı düzenleme, sonraki yinelemeyi zamanlamadan önce çalışmanın tamamlanmasını bekler, bu yüzden çalıştırmalar hiç çakışmaz.

Approach Zamanlama (1 saatlik aralık, 30 dakikalık iş) Çakışma riski
Zamanlayıcı tetikleyicisi (CRON) 1:00, 2:00, 3:00 Evet — iş süreyi aşarsa
Ebedi düzenleme 1:00, 2:30, 4:00 Hayır — sonraki işlem tamamlanmayı bekler
[FunctionName("Periodic_Cleanup_Loop")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    await context.CallActivityAsync("DoCleanup", null);

    // sleep for one hour between cleanups
    DateTime nextCleanup = context.CurrentUtcDateTime.AddHours(1);
    await context.CreateTimer(nextCleanup, CancellationToken.None);

    context.ContinueAsNew(null);
}
public class PeriodicCleanupLoop : TaskOrchestrator<object?, object?>
{
    public override async Task<object?> RunAsync(TaskOrchestrationContext context, object? input)
    {
        await context.CallActivityAsync("DoCleanup");

        // sleep for one hour between cleanups
        await context.CreateTimer(TimeSpan.FromHours(1), CancellationToken.None);

        context.ContinueAsNew(null);
        return null;
    }
}

Sonsuz bir düzenleme başlatın

Diğer tüm düzenleme işlevleri gibi sonsuz bir düzenleme başlatmak için start-new veya schedule-new dayanıklı istemci yöntemini kullanın. Aynı anda yalnızca bir örneğin çalıştığından emin olmak için sabit bir örnek kimliği kullanın. Daha fazla bilgi için bkz. Singleton düzenlemeleri.

[FunctionName("Trigger_Eternal_Orchestration")]
public static async Task<HttpResponseMessage> OrchestrationTrigger(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage request,
    [DurableClient] IDurableOrchestrationClient client)
{
    string instanceId = "StaticId";

    await client.StartNewAsync("Periodic_Cleanup_Loop", instanceId); 
    return client.CreateCheckStatusResponse(request, instanceId);
}

Diğer tüm düzenlemelerde olduğu gibi sonsuz bir düzenleme başlatmak için schedule-new istemci yöntemini kullanın. Aynı anda yalnızca bir örneğin çalıştığından emin olmak için sabit bir örnek kimliği kullanın. Daha fazla bilgi için bkz. Singleton düzenlemeleri.

string instanceId = "StaticId";
await client.ScheduleNewOrchestrationInstanceAsync(
    "PeriodicCleanupLoop",
    null,
    new StartOrchestrationOptions { InstanceId = instanceId });

Sonsuz orkestrasyondan çıkış

Bir düzenleyici işlevinin sonunda tamamlanması gerekiyorsa continue-as-new çağırmayın ve işlevin sonlanmasına izin verin.

Orchestrator işlevi sonsuz bir döngüdeyse ve durdurulması gerekiyorsa, durdurmak için orchestration istemci bağlamasınınsonlandırma API'sini kullanın.

await client.TerminateAsync(instanceId, "Cleanup no longer needed");

Daha fazla bilgi için bkz Örnekyönetimi.

Bir düzenlemenin sonunda tamamlanması gerekiyorsa, continue-as-new çağırmayın ve düzenlemenin çıkışına izin verin.

Düzenleme sonsuz bir döngüdeyse ve durdurulması gerekiyorsa, bunu durdurmak için dayanıklı görev istemcisindeki sonlandırma API'sini kullanın.

await client.TerminateInstanceAsync(instanceId, "Cleanup no longer needed");

Sonraki Adımlar