Orchestrator işlev kodu kısıtlamaları
Dayanıklı İşlevler, durum bilgisi olan uygulamalar oluşturmanıza olanak tanıyan bir Azure İşlevleri uzantısıdır. Bir işlev uygulamasındaki diğer dayanıklı işlevlerin yürütülmesini yönetmek için bir düzenleyici işlevi kullanabilirsiniz. Orchestrator işlevleri durum bilgisi olan, güvenilir ve potansiyel olarak uzun süre çalışan işlevlerdir.
Düzenleyici kodu kısıtlamaları
Orchestrator işlevleri, güvenilir yürütmeyi sağlamak ve yerel değişken durumunu korumak için olay kaynağını belirlemeyi kullanır. Düzenleyici kodunun yeniden yürütme davranışı , bir düzenleyici işlevinde yazabileceğiniz kod türü üzerinde kısıtlamalar oluşturur. Örneğin, orchestrator işlevleri belirlenici olmalıdır: bir orchestrator işlevi birden çok kez yeniden yürütülür ve her seferinde aynı sonucu üretmesi gerekir.
Belirlenmci API'leri kullanma
Bu bölümde, kodunuzun belirlenimci olduğundan emin olmak için bazı basit yönergeler sağlanır.
Orchestrator işlevleri herhangi bir API'ye hedef dillerinde çağrı yapabilir. Ancak orchestrator işlevlerinin yalnızca belirleyici API'leri çağırması önemlidir. Belirleyici API, ne zaman veya ne sıklıkta çağrıldığında farketmez, her zaman aynı girişin verildiği değeri döndüren bir API'dir.
Aşağıdaki bölümler, belirleyici olmadıklarından kaçınmanız gereken API'ler ve desenler hakkında rehberlik sağlar. Bu kısıtlamalar yalnızca orchestrator işlevleri için geçerlidir. Diğer işlev türlerinin bu tür kısıtlamaları yoktur.
Not
Birkaç tür kod kısıtlaması aşağıda açıklanmıştır. Bu liste ne yazık ki kapsamlı değildir ve bazı kullanım örnekleri ele alınamayabilir. Düzenleyici kodu yazarken dikkate alınması gereken en önemli şey, kullandığınız API'nin belirlenici olup olmadığıdır. Bu şekilde düşünmekten rahat olduğunuzda, hangi API'lerin kullanımı güvenli olduğunu ve hangilerinin bu belgelenmiş listeye başvurmaya gerek kalmadan olmadığını anlamak kolaydır.
Tarihler ve saatler
Geçerli tarih veya saati döndüren API'ler belirleyici değildir ve hiçbir zaman orchestrator işlevlerinde kullanılmamalıdır. Bunun nedeni, her orchestrator işlevinin yeniden gösteriminin farklı bir değer üretmesidir. Bunun yerine geçerli tarih veya saati almak için eşdeğer Dayanıklı İşlevler API'sini kullanmanız gerekir ve bu da yeniden yürütmeler arasında tutarlı kalır.
Geçerli saati almak için , DateTime.UtcNow
veya eşdeğer API'leri kullanmayınDateTime.Now
. 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 özelliğini kullanın IDurableOrchestrationContext.CurrentUtcDateTime
. .NET yalıtılmış düzenleyici işlevleri için TaskOrchestrationContext.CurrentDateTimeUtc
geçerli saati almak için özelliğini kullanın.
DateTime startTime = context.CurrentUtcDateTime;
// do some work
TimeSpan totalTime = context.CurrentUtcDateTime.Subtract(startTime);
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. Hangi dili kullandığınıza bağlı olarak, belirlenimci GUID'ler veya UUID'ler oluşturmak için 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.
Rastgele GUID'ler oluşturmak için gibi Guid.NewGuid()
API'leri kullanmayın. Bunun yerine bağlam nesnesinin API'sini NewGuid()
kullanarak düzenleyici yeniden yürütme için güvenli olan rastgele bir GUID oluşturun.
Guid randomGuid = context.NewGuid();
Not
Düzenleme bağlam API'leriyle oluşturulan GUID'ler Tür 5 UUID'lerdir.
Rastgele sayılar
Bir düzenleyici işlevine rastgele sayılar döndürmek için bir etkinlik işlevi kullanın. Etkinlik işlevlerinin dönüş değerleri düzenleme geçmişine kaydedildikleri için her zaman yeniden yürütme için güvenlidir.
Alternatif olarak, sabit bir tohum değerine sahip rastgele bir sayı oluşturucu doğrudan bir düzenleyici işlevinde kullanılabilir. Her düzenleme gösterimi için aynı sayı dizisi oluşturulduğu sürece bu yaklaşım güvenlidir.
Bağlamalar
Orchestrator işlevi, orchestration istemcisi ve varlık istemcisi bağlamaları da dahil olmak üzere hiçbir bağlama kullanmamalıdır. Her zaman bir istemci veya etkinlik işlevinin içinden giriş ve çıkış bağlamaları kullanın. Düzenleyici işlevleri birden çok kez yeniden yürütülebileceğinden ve dış sistemlerde belirsiz ve yinelenen G/Ç'ye neden olabileceği için bu önemlidir.
Statik değişkenler
Değerleri zaman içinde değişebileceğinden ve belirleyici olmayan çalışma zamanı davranışına neden olabileceğinden düzenleyici işlevlerinde statik değişkenleri kullanmaktan kaçının. Bunun yerine sabitleri kullanın veya statik değişkenlerin kullanımını etkinlik işlevleriyle sınırlayın.
Not
Birden çok işlev yürütmesinde statik durumun kalıcı olacağının garantisi olmadığından, düzenleyici işlevlerin dışında bile Azure İşlevleri statik değişkenlerin kullanılması çeşitli nedenlerle sorunlu olabilir. Etkinlik veya varlık işlevlerinde bellek içi önbelleğe alma konusunda en iyi çabayı gösterme gibi çok özel kullanım durumları dışında statik değişkenlerden kaçınılmalıdır.
Ortam değişkenleri
Orchestrator işlevlerinde ortam değişkenlerini kullanmayın. Değerleri zaman içinde değişebilir ve bu da belirsiz çalışma zamanı davranışına neden olur. Bir düzenleyici işlevinin bir ortam değişkeninde tanımlanan bir yapılandırmaya ihtiyacı varsa, yapılandırma değerini orchestrator işlevine giriş olarak veya etkinlik işlevinin 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.
İş parçacığı engelleyen API'ler
"Uyku" gibi API'lerin engellenmesi orchestrator işlevleri için performans ve ölçek sorunlarına neden olabilir ve bundan kaçınılmalıdır. Azure İşlevleri Tüketim planında, bunlar gereksiz yürütme süresi ücretlerine bile neden olabilir. Kullanılabilir olduğunda API'leri engellemek için alternatifleri kullanın. Örneğin, yeniden yürütme için güvenli olan ve düzenleyici işlevinin yürütme süresine kadar sayılmayan gecikmeler oluşturmak için Dayanıklı zamanlayıcıları kullanın.
Zaman Uyumsuz API'ler
Orchestrator kodu, orchestration tetikleyicisinin bağlam nesnesi tarafından tanımlananlar dışında hiçbir zaman uyumsuz işlemi başlatmamalıdır. Örneğin, .NET veya setTimeout
JavaScript'te HttpClient.SendAsync
hiçbir zaman , Task.Delay
ve setInterval
kullanmayınTask.Run
. Düzenleyici işlevi, yalnızca zamanlama etkinliği işlevleri gibi Dayanıklı SDK API'lerini kullanarak zaman uyumsuz çalışma zamanlamalıdır. Diğer tüm zaman uyumsuz çağrı türleri etkinlik işlevlerinin içinde yapılmalıdır.
Zaman uyumsuz JavaScript işlevleri
JavaScript düzenleyici işlevlerini her zaman zaman uyumlu oluşturucu işlevleri olarak bildirin. Node.js çalışma zamanı zaman uyumsuz işlevlerin belirlenimci olduğunu garanti etmediğinden JavaScript düzenleyici işlevlerini async
bildirmemelisiniz.
Python eş yordamları
Python orchestrator işlevlerini eş yordam olarak bildirmemelisiniz. Başka bir deyişle, eş yordam semantiği Dayanıklı İşlevler yeniden yürütme modeliyle uyumlu olmadığından python orchestrator işlevlerini hiçbir zaman anahtar sözcüğüyle async
bildirmeyin. Python orchestrator işlevlerini her zaman oluşturucu olarak bildirmeniz gerekir; başka bir deyişle API'nin context
await
yerine kullanmasını yield
beklemelisiniz.
.NET iş parçacığı oluşturma 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. Bir çalışan havuzu iş parçacığında zaman uyumsuz devamlılıkların çalıştırılması, düzenlemenin yürütülmesi belirsiz yürütme veya kilitlenmelere neden olabilir. Bu nedenle orchestrator işlevleri neredeyse hiçbir zaman iş parçacığı API'lerini kullanmamalıdır. Örneğin, hiçbir zaman düzenleyici işlevinde kullanmayın ConfigureAwait(continueOnCapturedContext: false)
. Bu, görev devamlılıklarının orchestrator işlevinin özgün SynchronizationContext
üzerinde çalışmasını sağlar.
Not
Dayanıklı Görev Çerçevesi, düzenleyici işlevlerinde düzenleyici olmayan iş parçacıklarının yanlışlıkla kullanımını algılamaya çalışır. Bir ihlal bulursa, çerçeve nonDeterministicOrchestrationException özel durumu oluşturur. Ancak bu algılama davranışı tüm ihlalleri yakalamaz ve buna bağımlı olmamanız gerekir.
Sürüm Oluşturma
Dayanıklı düzenleme günler, aylar, yıllar ve hatta sonsuza kadar sürekli çalışabilir. Tamamlanmamış düzenlemeleri etkileyen Dayanıklı İşlevler uygulamalarda yapılan kod güncelleştirmeleri, düzenlemelerin yeniden yürütme davranışını bozabilir. Bu nedenle kod güncelleştirmeleri yaparken dikkatli planlama yapmak önemlidir. Kodunuzun sürümünü oluşturma hakkında daha ayrıntılı bir açıklama için sürüm oluşturma makalesine bakın.
Dayanıklı görevler
Not
Bu bölümde Dayanıklı Görev Çerçevesi'nin iç uygulama ayrıntıları açıklanmaktadır. Bu bilgileri bilmeden dayanıklı işlevleri kullanabilirsiniz. Yalnızca yeniden yürütme davranışını anlamanıza yardımcı olmak için tasarlanmıştır.
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. .NET düzenleyici işlevlerinde , WaitForExternalEvent
ve CreateTimer
tarafından CallActivityAsync
döndürülen görevler örnek olarak verilebilir.
Bu dayanıklı görevler.NET'teki nesnelerin listesi TaskCompletionSource
tarafından dahili olarak yönetilir. Yeniden yürütme sırasında bu görevler orchestrator kod yürütmesinin bir parçası olarak oluşturulur. Dağıtıcı ilgili geçmiş olaylarını numaralandırdıkça bunlar tamamlanmıştır.
Tüm geçmiş yeniden oynatılana kadar görevler tek bir iş parçacığı kullanılarak zaman uyumlu olarak yürütülür. Geçmiş gösteriminin sonunda tamamlanmayan dayanıklı görevlerin uygun eylemleri gerçekleştirilir. Örneğin, bir etkinlik işlevini çağırmak için bir ileti sıraya alınabilir.
Bu bölümün çalışma zamanı davranışının açıklaması, bir düzenleyici işlevinin neden veya yield
kalıcı olmayan bir görevde kullanılamayabileceğini await
anlamanıza yardımcı olmalıdır. bunun iki nedeni vardır: dağıtıcı iş parçacığı görevin bitmesini bekleyemiyor ve bu görevin herhangi bir geri çağırması düzenleyici işlevinin izleme durumunu bozabilir. Bu ihlalleri algılamaya yardımcı olmak için bazı çalışma zamanı denetimleri vardır.
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'da Dayanıklı Görev kaynak koduna başvurun. Özellikle bkz . TaskOrchestrationExecutor.cs ve TaskOrchestrationContext.cs.