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.
Durable Functions ile durum bilgisi olan uygulamalar oluşturun. Azure Functions uzantısıdır. İşlev uygulamanızdaki diğer Dayanıklı İşlevleri koordine etmek için bir orchestrator işlevi kullanın. Orchestrator işlevleri durum bilgisi olan, güvenilir ve uzun süre çalışacak şekilde oluşturulmuşlardır.
.NET, Python ve Java Dayanıklı Görev SDK'ları ile durum bilgisi olan, hataya dayanıklı iş akışları oluşturun. Etkinlikleri ve alt düzenlemeleri koordine etmek için bir düzenleyici kullanın. Orkestratörler, durum bilgisine sahip, güvenilir ve onlar uzun süre çalışacak şekilde oluşturulmuşlardır.
Orchestrator kod sınırlamaları
Orchestrator işlevleri, güvenilir yürütmeyi sağlamak ve yerel değişken durumunu korumak için olay kaynağını kullanır. Orchestrator kodunun yeniden yürütme davranışı , bir orchestrator işlevinde yazabileceğiniz kod türü üzerinde kısıtlamalar oluşturur. Örneğin, orchestrator işlevleri belirleyici olmalıdır: bir orchestrator işlevi birden çok kez yeniden yürütülmelidir ve her seferinde aynı sonucu üretmelidir.
Düzenleyiciler, güvenilir yürütmeyi sağlamak ve yerel değişken durumunu korumak için olay kaynağını kullanır. Orchestrator kodunun yeniden yürütme davranışı, bir düzenleyicide yazabileceğiniz kod türü üzerinde kısıtlamalar oluşturur. Örneğin, düzenleyicilerin belirleyici olması gerekir: bir düzenleyici birden çok kez yeniden oynatılmalı ve her seferinde aynı sonucu üretmelidir.
Belirleyici API'leri kullanma
Kodunuzun belirlenimci olduğundan emin olmak için bazı basit yönergeler aşağıda verilmiştir.
Orchestrator işlevlerinde hedef dillerinizden API'leri çağırarak yalnızca belirleyici API'leri kullanın. Belirleyici BIR API, ne zaman veya ne sıklıkta çağrılırsa çağrılsın, her zaman aynı giriş için aynı değeri döndürür.
Aşağıdaki bölümlerde, api'ler ve belirleyici olmadıklarından kaçınmanız gereken desenler hakkında rehberlik sağlanmaktadır. Bu kısıtlamalar yalnızca orchestrator işlevleri için geçerlidir. Diğer işlev türlerinde bu tür kısıtlamalar yoktur.
Kodunuzun belirlenimci olduğundan emin olmak için bazı basit yönergeler aşağıda verilmiştir.
Düzenleyicilerde hedef dillerinizden API'leri çağırarak yalnızca belirleyici API'leri kullanın. Belirleyici BIR API, ne zaman veya ne sıklıkta çağrılırsa çağrılsın, her zaman aynı giriş için aynı değeri döndürür.
Aşağıdaki bölümlerde, api'ler ve belirleyici olmadıklarından kaçınmanız gereken desenler hakkında rehberlik sağlanmaktadır. Bu kısıtlamalar yalnızca düzenleyiciler için geçerlidir. Etkinlikler bu tür kısıtlamalara sahip değildir.
Uyarı
Bu makale yaygın düzenleyici kod kısıtlamalarını kapsar, ancak kapsamlı değildir. API'nin belirleyici olup olmadığına odaklanın. Bu düşünce yapısıyla, bu listeye başvurmadan genellikle hangi API'lerin güvenli olduğunu anlayabilirsiniz.
Tarihler ve saatler
Zaman tabanlı API'ler belirleyici değildir ve hiçbir zaman orchestrator işlevlerinde kullanılmamalıdır. Her bir orchestrator işlevinin yeniden yürütülmesi farklı bir değer üretir. Bunun yerine, geçerli tarih veya saati almak için Durable Functions eşdeğer API'sini kullanın ve bu api yeniden yürütmeler arasında tutarlı kalır.
Geçerli saati almak için , DateTime.Nowveya eşdeğer API'leri kullanmayınDateTime.UtcNow. gibi Stopwatch sınıflardan da kaçınılmalıdır. .NET işlem içi düzenleyici işlevleri için geçerli saati almak için IDurableOrchestrationContext.CurrentUtcDateTime özelliğini kullanın. Yalıtılmış .NET düzenleyici işlevleri için geçerli saati almak için TaskOrchestrationContext.CurrentDateTimeUtc özelliğini kullanın.
DateTime startTime = context.CurrentUtcDateTime;
// do some work
TimeSpan totalTime = context.CurrentUtcDateTime.Subtract(startTime);
Zaman tabanlı API'ler belirleyici değildir ve hiçbir zaman düzenleyicilerde kullanılmamalıdır. Her orkestratör yeniden oynatımı farklı bir değer üretir. Bunun yerine, geçerli tarihi veya saati almak için Dayanıklı Görev SDK'si eşdeğer API'sini kullanın ve bu API tekrar yürütmeler arasında tutarlı kalır.
Geçerli saati almak için , DateTime.Nowveya eşdeğer API'leri kullanmayınDateTime.UtcNow. gibi Stopwatch sınıflardan da kaçınılmalıdır.
TaskOrchestrationContext.CurrentUtcDateTime Geçerli saati almak için özelliğini kullanın.
using Microsoft.DurableTask;
public class TimerExample : TaskOrchestrator<object?, TimeSpan>
{
public override async Task<TimeSpan> RunAsync(TaskOrchestrationContext context, object? input)
{
// Use context.CurrentUtcDateTime instead of DateTime.Now or DateTime.UtcNow
DateTime startTime = context.CurrentUtcDateTime;
// do some work
await context.CallActivityAsync("DoWork", null);
TimeSpan totalTime = context.CurrentUtcDateTime.Subtract(startTime);
return totalTime;
}
}
GUID'ler ve UUID'ler
Oluşturulan değer her yeniden yürütme için farklı olduğundan rastgele GUID veya UUID döndüren API'ler belirleyici değildir. Dilinize bağlı olarak, belirlenimci GUID'ler veya UUID'ler oluşturmaya yönelik yerleşik bir API kullanılabilir. Aksi takdirde, rastgele oluşturulmuş bir GUID veya UUID döndürmek için bir etkinlik işlevi kullanın.
Guid.NewGuid() gibi API'ler yerine orchestrator işlemlerinin yeniden oynatılması için güvenli olan rastgele bir GUID oluşturmak amacıyla bağlam nesnesinin NewGuid() API'sini kullanın.
Guid randomGuid = context.NewGuid();
Uyarı
Düzenleme bağlam API'leri ile oluşturulan GUID'ler Tür 5 UUID'lerdir.
Oluşturulan değer her yeniden yürütme için farklı olduğundan rastgele GUID veya UUID döndüren API'ler belirleyici değildir. Dilinize bağlı olarak, belirlenimci GUID'ler veya UUID'ler oluşturmaya yönelik yerleşik bir API kullanılabilir. Aksi takdirde, rastgele oluşturulmuş bir GUID veya UUID döndürmek için bir etkinlik kullanın.
Guid.NewGuid() gibi API'ler yerine orchestrator işlemlerinin yeniden oynatılması için güvenli olan rastgele bir GUID oluşturmak amacıyla bağlam nesnesinin NewGuid() API'sini kullanın.
using Microsoft.DurableTask;
public class GuidExample : TaskOrchestrator<object?, Guid>
{
public override async Task<Guid> RunAsync(TaskOrchestrationContext context, object? input)
{
// Use context.NewGuid() instead of Guid.NewGuid()
Guid randomGuid = context.NewGuid();
return randomGuid;
}
}
Uyarı
Düzenleme bağlam API'leri ile oluşturulan GUID'ler Tür 5 UUID'lerdir.
Rastgele sayılar
Bir orchestrator işlevine rastgele sayılar döndürmek için etkinlik işlevini kullanın. Etkinlik işlevlerinin dönüş değerleri, düzenleme geçmişine kaydedildiğinden her zaman yeniden yürütme için güvenlidir.
Alternatif olarak, sabit bir başlangıç değerine sahip rastgele bir sayı oluşturucuyu doğrudan bir orchestrator işlevinde kullanabilirsiniz. Her düzenleme gösterimi için aynı sayı dizisi oluşturulduğu sürece bu yaklaşım güvenlidir.
Bir düzenleyiciye rastgele sayılar döndürmek için bir etkinlik kullanın. Etkinliklerin dönüş değerleri, düzenleme geçmişine kaydedildiğinden her zaman yeniden yürütme için güvenlidir.
Alternatif olarak, doğrudan bir orkestratörde sabit bir başlangıç değerine sahip rastgele bir sayı oluşturucu kullanabilirsiniz. Her düzenleme gösterimi için aynı sayı dizisi oluşturulduğu sürece bu yaklaşım güvenlidir.
Bağlamalar
Orchestrator işlevinde orchestration istemcisi ve entity istemcisi bağlamaları dahil olmak üzere bağlamaları kullanmayın. Giriş ve çıkış bağlamalarını yalnızca bir istemci veya etkinlik işlevinde kullanın. Orchestrator işlevleri birden çok kez yeniden çalıştırılarak dış sistemlerde belirsiz ve yinelenen G/Ç'ye neden olabilir.
Düzenleyiciler dış sistemlerle doğrudan G/Ç işlemleri gerçekleştirmemelidir. G/Ç işlemlerini aktivitelere taşıyın. Orkestratörler birden çok kez tekrarlayarak dış sistemlerde belirsiz ve yinelenen G/Ç'ye neden olabilir.
Statik değişkenler
Statik değişkenler zaman içinde değişebilir ve düzenleyici işlevleri için güvenli olmalarını sağlamaz. Orchestrator işlevlerinde statik değişkenleri kullanmaktan kaçının çünkü değerleri zaman içinde değişebilir ve bu da belirsiz çalışma zamanı davranışına neden olabilir. Bunun yerine sabitleri kullanın veya statik değişkenlerin kullanımını etkinlik işlevleriyle sınırlayın.
Statik değişkenler zaman içinde değişebilir ve düzenleyiciler için güvenli olmalarını sağlamaz. Zaman içinde değerleri değişebileceğinden ve belirsiz çalışma zamanı davranışına neden olabileceğinden, düzenleyicilerde statik değişkenleri kullanmaktan kaçının. Bunun yerine sabitleri kullanın veya statik değişkenlerin kullanımını etkinliklerle sınırlayın.
Uyarı
Azure Functions statik değişkenlerin kullanılması, düzenleyici işlevlerinin dışında bile çeşitli nedenlerle sorunlu olabilir çünkü statik durumun birden çok işlev yürütmesinde kalıcı olacağının garantisi yoktur. Etkinlik veya varlık işlevlerinde bellek içi önbelleğe alma konusunda en iyi çaba gibi belirli kullanım durumları dışında statik değişkenlerden kaçının.
Ortam değişkenleri
Orchestrator işlevlerindeki ortam değişkenleri zaman içinde değişebilir ve bu da belirsiz çalışma zamanı davranışına neden olur. Bir düzenleyici işlevi bir ortam değişkeninde tanımlanmış yapılandırmaya ihtiyaç duyuyorsa, yapılandırma değerini orchestrator işlevine giriş veya etkinlik işlevinin dönüş değeri olarak geçirmeniz gerekir.
Düzenleyicilerdeki ortam değişkenleri zaman içinde değişebilir ve bu da belirsiz çalışma zamanı davranışına neden olur. Bir düzenleyicinin ortam değişkeninde tanımlanmış bir yapılandırmaya ihtiyacı varsa, yapılandırma değerini düzenleyiciye giriş olarak veya etkinliğin dönüş değeri olarak geçirmeniz gerekir.
Ağ ve HTTP
Giden ağ çağrıları yapmak için etkinlik işlevlerini kullanın. Orchestrator işlevinizden BIR HTTP çağrısı yapmanız gerekiyorsa , dayanıklı HTTP API'lerini de kullanabilirsiniz.
Giden ağ çağrıları yapmak için etkinlikleri kullanın. Bu işlemler belirsiz olmadığından, düzenleyiciler hiçbir zaman doğrudan HTTP çağrıları veya diğer ağ isteklerinde bulunmamalıdır.
İş parçacığı engelleyen API'ler
sleep gibi API'lerin engellenmesi, düzenleyici işlevleri için performans ve ölçek sorunlarına neden olabilir ve Azure Functions Tüketim planında gereksiz yürütme süresi ücretlerine neden olabilir. Kullanılabilir olduklarında alternatifleri kullanın. Örneğin, yeniden yürütme için güvenli olan ve orchestrator yürütme süresine doğru saymayan gecikmeler oluşturmak için Dayanıklı zamanlayıcıları kullanın.
"Uyku" gibi API'lerin engellenmesi, düzenleyiciler için performans ve ölçek sorunlarına neden olabilir ve bundan kaçınılmalıdır. Yeniden yürütme için güvenli gecikmeler oluşturmak için dayanıklı zamanlayıcıları kullanın.
veya context.CreateTimer()yerine Task.Delay() kullanınThread.Sleep().
// Don't use Task.Delay() or Thread.Sleep()
// Use context.CreateTimer() instead
await context.CreateTimer(context.CurrentUtcDateTime.AddMinutes(5), CancellationToken.None);
Asenkron API'ler
Orchestrator kodu, düzenleme tetikleyicisinin bağlam nesnesi tarafından tanımlanan işlemler dışında hiçbir zaman asenkron işlemi başlatmamalıdır. Örneğin javascript'te Task.Run, Task.Delay ve HttpClient.SendAsync .NET veya setTimeout ve setInterval kullanmayın. Orchestrator işlevi, yalnızca Durable SDK API'lerini kullanarak zaman uyumsuz çalışmaları zamanlamalıdır, örneğin etkinlik işlevlerini zamanlamak gibi. Diğer tüm asenkron çağrı türleri etkinlik işlevlerinin içinde yapılmalıdır.
Orchestrator kodu, düzenleme bağlam nesnesi tarafından tanımlanan işlemler dışında hiçbir zaman uyumsuz işlem başlatmamalıdır. Örneğin, .NET Task.Run, Task.Delay ve HttpClient.SendAsync kullanmayın. Düzenleyici, yalnızca zaman uyumsuz çalışmayı zamanlama etkinlikleri gibi Dayanıklı Görev SDK'sı API'lerini kullanarak zamanlamalıdır. Diğer herhangi bir asenkron çağrı türü aktivitelerin içinde yapılmalıdır.
Asenkron JavaScript işlevleri
JavaScript düzenleyici işlevlerini zaman uyumlu oluşturucu işlevleri olarak bildirin. Node.js çalışma zamanı, async işlevler için belirlenimci davranışı garanti etmediğinden, JavaScript orkestratör işlevlerini bildirmeyin.
Python eş yordamları
Python orkestratör işlevlerini eş yordam olarak bildirmeyin. Coroutine semantiği Durable Functions yeniden yürütme modeliyle uyumlu olmadığından async anahtar sözcüğünü kullanmayın. Python düzenleyici işlevlerini oluşturucu olarak bildirin ve yield API'siyle await yerine context kullanın.
Python düzenleyicileri eş yordam olarak bildirmemelisiniz. Başka bir deyişle, async anahtar sözcüğüyle Python düzenleyicileri bildirmeyin çünkü eş yordam semantiği Dayanıklı Görev yeniden yürütme modeliyle uyumlu değildir. Python düzenleyicileri her zaman oluşturucu olarak bildirmeniz gerekir; başka bir deyişle bağlam API'lerini çağırırken yield yerine await kullanmanız gerekir.
from durabletask import task
# CORRECT - use yield (generator function)
def my_orchestrator(ctx: task.OrchestrationContext, input: str):
result = yield ctx.call_activity(my_activity, input=input)
return result
# WRONG - don't use async/await
async def bad_orchestrator(ctx: task.OrchestrationContext, input: str):
result = await ctx.call_activity(my_activity, input=input) # This won't work!
return result
.NET iş parçacığı API'leri
Dayanıklı Görev Çerçevesi, orchestrator kodunu tek bir iş parçacığında çalıştırır ve diğer iş parçacıklarıyla etkileşim kuramaz. Orkestrasyonun yürütülmesinde çalışan havuzu iş parçacığında asenkron devamlılıkların çalıştırılması, belirsiz yürütme veya kilitlenmelere neden olabilir. Bu nedenle düzenleyici işlevleriniz neredeyse hiçbir zaman iş parçacığı API'lerini kullanmamalıdır. Örneğin, görev devamlılıklarının orchestrator işlevinin orijinal ConfigureAwait(continueOnCapturedContext: false)üzerinde çalıştığından emin olmak için asla SynchronizationContext'i bir orchestrator işlevinde kullanmayın.
Uyarı
Dayanıklı Görev Yapısı, orkestratör olmayan iş parçacıklarının orkestratör işlevlerinde yanlışlıkla kullanıldığını algılamaya çalışır. Bir ihlal bulursa, çerçeve NonDeterministicOrchestrationException özel durumu fırlatır. Ancak, bu algılama davranışı tüm ihlalleri yakalamaz ve buna bağımlı olmamanız gerekir.
Dayanıklı Görev Çerçevesi, orchestrator kodunu tek bir iş parçacığında çalıştırır ve diğer iş parçacıklarıyla etkileşim kuramaz. Orkestrasyonun yürütülmesinde çalışan havuzu iş parçacığında asenkron devamlılıkların çalıştırılması, belirsiz yürütme veya kilitlenmelere neden olabilir. Bu nedenle düzenleyicileriniz neredeyse hiçbir zaman iş parçacığı API'lerini kullanmamalıdır. Örneğin, görev devamlılıklarının düzenleyicinin özgün ConfigureAwait(continueOnCapturedContext: false)üzerinde çalıştığından emin olmak için hiçbir zaman düzenleyicide kullanmayınSynchronizationContext.
Uyarı
Dayanıklı Görev Çerçevesi, düzenleyicilerde nonorchestrator iş parçacıklarının yanlışlıkla kullanımını algılamaya çalışır. Bir ihlal bulursa, çerçeve NonDeterministicOrchestrationException özel durumu fırlatır. Ancak, bu algılama davranışı tüm ihlalleri yakalamaz ve buna bağımlı olmamanız gerekir.
Sürüm oluşturma
Dayanıklı bir düzenleme günler, aylar, yıllar, hatta sonsuz bir düzenleme olarak çalıştırılabilir. Çalışan düzenlemeleri etkileyen kod değişiklikleri yeniden oynatma davranışını bozabileceğinden, uygulamanızı güncellemeden önce dikkatli bir şekilde plan yapın. Daha fazla bilgi için bkz . Sürüm oluşturma.
Dayanıklı düzenleme günler, aylar, yıllar ve hatta süresiz olarak çalışabilir. Çalışan düzenlemeleri etkileyen kod değişiklikleri yeniden oynatma davranışını bozabileceğinden, uygulamanızı güncellemeden önce dikkatli bir şekilde plan yapın. Yaygın sürüm oluşturma stratejileri arasında eşzamanlı dağıtım ve versiyona özgü görev merkezi adları kullanımı bulunur.
Dayanıklı görevler
Uyarı
Bu bölümde Dayanıklı Görev Çerçevesi'nin iç uygulama ayrıntıları açıklanmaktadır. Durable Functions kullanmak için bu bilgileri bilmeniz gerekmez, ancak yeniden yürütme davranışını açıklamaya yardımcı olur.
Düzenleyici işlevlerinde güvenle bekleyebilen görevlere bazen dayanıklı görevler denir. Dayanıklı Görev Çerçevesi bu görevleri oluşturur ve yönetir.
CallActivityAsync, WaitForExternalEvent ve .NET orchestrator işlevlerinde CreateTimer tarafından döndürülen görevler örnek olarak verilebilir.
.NET içindeki TaskCompletionSource nesnelerinin listesi bu dayanıklı görevleri dahili olarak yönetir. Yeniden yürütme sırasında orchestrator kodu bu görevleri oluşturur. Dağıtıcı, ilgili geçmiş olaylarını numaralandırırken bunları tamamlar.
Çalışma zamanı, geçmişi tekrar çalıştırana kadar görevleri tek bir iş parçacığında zaman uyumlu olarak yürütür. Türkçesi: Sağlam bir görev, tarihsel tekrar yürütmenin sonuna kadar tamamlanmazsa, çalışma süresi uygun eylemleri gerçekleştirir. Örneğin, çalışma zamanı bir etkinlik işlevini çağırmak için bir ileti sıralayabilir.
Bu çalışma zamanı davranışı, orchestrator işlevinizin neden await veya yield'i sürekli olmayan bir görevde kullanamayacağını açıklar. Dağıtıcı iş parçacığı görevin tamamlanmasını bekleyemez ve bu görevdeki geri çağırmalar, "orchestrator" fonksiyonunun izleme durumunu bozabilir. Çalışma zamanı, bu ihlalleri algılamaya yardımcı olmak için denetimler içerir.
Dayanıklı Görev Çerçevesi'nin düzenleyici işlevlerini nasıl yürüttüğü hakkında daha fazla bilgi edinmek için GitHub üzerinde
Orkestratörlerde güvenle bekleyebilen görevlere bazen dayanıklı görevler denir. Dayanıklı Görev Çerçevesi bu görevleri oluşturur ve yönetir. Örnek olarak CallActivityAsync, WaitForExternalEvent ve .NET düzenleyicilerinde CreateTimer tarafından döndürülen görevler verilebilir.
.NET içindeki TaskCompletionSource nesnelerinin listesi bu dayanıklı görevleri dahili olarak yönetir. Yeniden yürütme sırasında orchestrator kodu bu görevleri oluşturur. Dağıtıcı, ilgili geçmiş olaylarını numaralandırırken bunları tamamlar.
Çalışma zamanı, geçmişi tekrar çalıştırana kadar görevleri tek bir iş parçacığında zaman uyumlu olarak yürütür. Türkçesi: Sağlam bir görev, tarihsel tekrar yürütmenin sonuna kadar tamamlanmazsa, çalışma süresi uygun eylemleri gerçekleştirir. Örneğin, çalışma zamanı bir etkinliği çağırmak için bir ileti sıralayabilir.
Bu çalışma zamanı davranışı, düzenleyicinizin await veya yield'i kalıcı olmayan bir görevde neden kullanamayacağını açıklar. Dağıtıcı iş parçacığı görevin tamamlanmasını bekleyemez ve bu görevdeki geri çağırmalar koordinatörün izleme durumunu bozabilir. Çalışma zamanı, bu ihlalleri algılamaya yardımcı olmak için denetimler içerir.
Dayanıklı Görev Çerçevesi'nin düzenleyicileri nasıl yürüttüğü hakkında daha fazla bilgi edinmek için GitHub üzerinde