Share via


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.UtcNowveya 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.Delayve 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 contextawaityerine 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 , WaitForExternalEventve CreateTimer tarafından CallActivityAsyncdö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.

Sonraki adımlar