Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
- Yeniden başlatma nasıl çalışır — Yeniden başlatma mekanizması
- Dikkat edilmesi gerekenler — Özel durum davranışı, tamamlanmamış görevler ve dış olaylar
- Düzenli çalışma örneği — Zamanlayıcı çakışmalarını önleyen bir temizleme döngüsü
- Sonsuz bir düzenleme başlatın — Başlatma ve tekil desenler
- Sonsuz düzenlemeden çık — Zarif durdurma ve sonlandırma
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 etmenin işleyişi — Sıfırlama mekanizması
- Dikkat edilmesi gerekenler — Özel durum davranışı, tamamlanmamış görevler ve dış olaylar
- Düzenli çalışma örneği — Zamanlayıcı çakışmalarını önleyen bir temizleme döngüsü
- Sonsuz bir düzenleme başlatın — Başlatma ve tekil desenler
- Sürekli orkestrasyondan çıkış — Zarif durdurma ve son verme
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-newsı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
finallybloğundan yapılan bircontinue-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-newatılır. Örneğin, bir zamanlayıcı ayarlanırsa ve zamanlayıcı tetiklenmeden öncecontinue-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-newişlenmemiş dış olayları koruyabilirsiniz. C# dilinde,ContinueAsNewişlenmemiş olayları varsayılan olarak korur. Java'dacontinueAsNewde varsayılan olarak olayları korur. Python'dacontinue_as_new,save_events=Truesürece olayları korumaz. JavaScript'te,continueAsNewbu davranışı denetlemek için birsaveEventsparametre (trueveyafalse) gerektirir.
continue-as-new yöntemini bir düzenlemede kullanırken şu noktaları göz önünde bulundurun:
Orkestrasyon
continue-as-newmetodu 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
finallybloktancontinue-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-newatılır. Örneğin, bir zamanlayıcı ayarlanırsa ve zamanlayıcı tetiklenmeden öncecontinue-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-newişlenmemiş dış olayları koruyabilirsiniz. .NET ve Javacontinue-as-new, işlenmemiş olayları varsayılan olarak korur. Python'dacontinue_as_new,save_events=Truesürece olayları korumaz. JavaScript'te,continueAsNewbu davranışı denetlemek için birsaveEventsparametre (trueveyafalse) gerektirir. Tüm durumlarda, düzenlemewaitForExternalEventveyawait_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");