Dayanıklı İşlevler'de işlev zinciri - Merhaba dizisi örneği
Makale
İşlev zincirleme, belirli bir sırada bir işlev dizisi yürütme desenini ifade eder. Genellikle bir işlevin çıkışının başka bir işlevin girişine uygulanması gerekir. Bu makalede, Dayanıklı İşlevler hızlı başlangıcı (C#, JavaScript, TypeScript, Python, PowerShell veya Java) tamamladığınızda oluşturduğunuz zincirleme dizisi açıklanmaktadır. Dayanıklı İşlevler hakkında daha fazla bilgi için bkz. Dayanıklı İşlevler genel bakış.
Azure İşlevleri için Node.js programlama modelinin 4. sürümü genel olarak kullanılabilir. Yeni v4 modeli, JavaScript ve TypeScript geliştiricileri için daha esnek ve sezgisel bir deneyime sahip olacak şekilde tasarlanmıştır.
Geçiş kılavuzunda v3 ile v4 arasındaki farklar hakkında daha fazla bilgi edinin.
Aşağıdaki kod parçacıklarında JavaScript (PM4), yeni deneyim olan programlama modeli V4'i belirtir.
İşlevler
Bu makalede örnek uygulamada aşağıdaki işlevler açıklanmaktadır:
E1_HelloSequence: Bir dizide birden çok kez çağıran E1_SayHello bir düzenleyici işlevi. Çağrıların E1_SayHello çıkışlarını depolar ve sonuçları kaydeder.
Tüm C# düzenleme işlevleri, derlemede bulunan türünde DurableOrchestrationContextbir parametreye Microsoft.Azure.WebJobs.Extensions.DurableTask sahip olmalıdır. Bu bağlam nesnesi, diğer etkinlik işlevlerini çağırmanızı ve yöntemini kullanarak giriş parametrelerini geçirmenizi CallActivityAsync sağlar.
Kod, farklı parametre değerleriyle sırayla üç kez çağırır E1_SayHello . Her çağrının dönüş değeri, işlevin outputs sonunda döndürülen listeye eklenir.
function.json
geliştirme için Visual Studio Code veya Azure portal kullanıyorsanız, orchestrator işlevi için function.json dosyasının içeriği aşağıdadır. Çoğu orchestrator function.json dosyası neredeyse tam olarak böyle görünür.
Önemli olan bağlama türüdür orchestrationTrigger . Tüm düzenleyici işlevleri bu tetikleyici türünü kullanmalıdır.
Uyarı
Düzenleyici işlevlerinin "G/Ç yok" kuralına uymak için tetikleyici bağlamasını kullanırken herhangi bir giriş veya çıkış bağlaması orchestrationTrigger kullanmayın. Diğer giriş veya çıkış bağlamaları gerekiyorsa, bunun yerine düzenleyici tarafından çağrılan işlevler bağlamında activityTrigger kullanılmalıdır. Daha fazla bilgi için orchestrator işlev kodu kısıtlamaları makalesine bakın.
Tüm JavaScript düzenleme işlevleri modülü içermelidirdurable-functions. JavaScript'te Dayanıklı İşlevler yazmanızı sağlayan bir kitaplıktır. Orchestrator işleviyle diğer JavaScript işlevleri arasında üç önemli fark vardır:
İşlev, modülün orchestrator yöntemine (buradadf) yapılan bir çağrıda durable-functions sarmalanır.
İşlevin zaman uyumlu olması gerekir. 'orchestrator' yöntemi 'context.done' için son çağrıyı işlediğinden, işlevin basitçe 'return' olması gerekir.
nesnesi, context diğer etkinlik işlevlerini çağırmanızı ve yöntemini kullanarak callActivity giriş parametrelerini geçirmenizi sağlayan dayanıklı bir df düzenleme bağlam nesnesi içerir. Kod, yürütmenin döndürülecek zaman uyumsuz etkinlik işlev çağrılarını beklemesi gerektiğini belirtmek için kullanarak yield farklı parametre değerleriyle sırayla üç kez çağrırE1_SayHello. Her çağrının dönüş değeri, işlevin outputs sonunda döndürülen diziye eklenir.
Tüm JavaScript düzenleme işlevleri modülü içermelidirdurable-functions. Bu modül JavaScript'te Dayanıklı İşlevler yazmanızı sağlar. V4 düğüm programlama modelini kullanmak için önizleme v3.x sürümünü durable-functionsyüklemeniz gerekir.
Düzenleyici işlevi ile diğer JavaScript işlevleri arasında iki önemli fark vardır:
İşlevin zaman uyumlu olması gerekir. İşlevin basitçe 'return' olması gerekir.
nesnesi, context diğer etkinlik işlevlerini çağırmanızı ve yöntemini kullanarak callActivity giriş parametrelerini geçirmenizi sağlayan dayanıklı bir df düzenleme bağlam nesnesi içerir. Kod, yürütmenin döndürülecek zaman uyumsuz etkinlik işlev çağrılarını beklemesi gerektiğini belirtmek için kullanarak yield farklı parametre değerleriyle sırayla üç kez çağrırsayHello. Her çağrının dönüş değeri, işlevin outputs sonunda döndürülen diziye eklenir.
Not
Python Dayanıklı İşlevler yalnızca İşlevler 3.0 çalışma zamanı için kullanılabilir.
function.json
geliştirme için Visual Studio Code veya Azure portal kullanıyorsanız, orchestrator işlevi için function.json dosyasının içeriği aşağıdadır. Çoğu orchestrator function.json dosyası neredeyse tam olarak böyle görünür.
Önemli olan bağlama türüdür orchestrationTrigger . Tüm düzenleyici işlevleri bu tetikleyici türünü kullanmalıdır.
Uyarı
Düzenleyici işlevlerinin "G/Ç yok" kuralına uymak için tetikleyici bağlamasını kullanırken herhangi bir giriş veya çıkış bağlaması orchestrationTrigger kullanmayın. Diğer giriş veya çıkış bağlamaları gerekiyorsa, bunun yerine düzenleyici tarafından çağrılan işlevler bağlamında activityTrigger kullanılmalıdır. Daha fazla bilgi için orchestrator işlev kodu kısıtlamaları makalesine bakın.
Tüm Python düzenleme işlevleri paketi içermelidirdurable-functions. Python'da Dayanıklı İşlevler yazmanızı sağlayan bir kitaplıktır. Düzenleyici işleviyle diğer Python işlevleri arasında iki önemli fark vardır:
Dosyanın sonunda belirterek main = df.Orchestrator.create(<orchestrator function name>) orchestrator işlevini bir düzenleyici olarak kaydetmesi gerekir. Bu, dosyada bildirilen diğer yardımcı işlevlerden ayırt edilebilmesine yardımcı olur.
context nesnesi, diğer etkinlik işlevlerini çağırmanızı ve yöntemini kullanarak giriş parametrelerini geçirmenizi call_activity sağlar. Kod, yürütmenin döndürülecek zaman uyumsuz etkinlik işlev çağrılarını beklemesi gerektiğini belirtmek için kullanarak yield farklı parametre değerleriyle sırayla üç kez çağrırE1_SayHello. Her çağrının dönüş değeri işlevin sonunda döndürülür.
[FunctionName("E1_SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext context)
{
string name = context.GetInput<string>();
return $"Hello {name}!";
}
Etkinlikler özniteliğini ActivityTrigger kullanır. kullanarak GetInput<T>giriş değerine erişme gibi etkinlikle ilgili eylemleri gerçekleştirmek için sağlanan IDurableActivityContext öğesini kullanın.
uygulaması E1_SayHello , nispeten önemsiz bir dize biçimlendirme işlemidir.
bir IDurableActivityContextöğesine bağlamak yerine, doğrudan etkinlik işlevine geçirilen türe bağlayabilirsiniz. Örnek:
Activity işlevinin E1_SayHellofunction.json dosyası, bağlama türü yerine orchestrationTrigger bağlama türü kullanması activityTrigger dışında öğesine benzerE1_HelloSequence.
Düzenleme işlevi tarafından çağrılan tüm etkinlik işlevleri bağlamayı activityTrigger kullanmalıdır.
uygulaması E1_SayHello , nispeten önemsiz bir dize biçimlendirme işlemidir.
E1_SayHello/index.js
module.exports = function (context) {
context.done(null, `Hello ${context.bindings.name}!`);
};
Düzenleme işlevinin aksine, bir etkinlik işlevinin özel bir kuruluma ihtiyacı yoktur. Orchestrator işlevi tarafından ona geçirilen giriş, nesnesinde context.bindings bağlama adı activityTrigger altında bulunur. Bu durumda, context.bindings.name. Bağlama adı, dışarı aktarılan işlevin parametresi olarak ayarlanabilir ve örnek kodun yaptığı gibi doğrudan erişilebilir.
uygulaması sayHello , nispeten önemsiz bir dize biçimlendirme işlemidir.
Düzenleme işlevinin aksine, bir etkinlik işlevinin özel bir kuruluma ihtiyacı yoktur. Orchestrator işlevi tarafından ona geçirilen giriş, işlevin ilk bağımsız değişkenidir. İkinci bağımsız değişken, bu örnekte kullanılmayan çağırma bağlamıdır.
E1_SayHello/function.json
Activity işlevinin E1_SayHellofunction.json dosyası, bağlama türü yerine orchestrationTrigger bağlama türü kullanması activityTrigger dışında öğesine benzerE1_HelloSequence.
Orchestrator işlevinin aksine, bir etkinlik işlevinin özel bir kuruluma ihtiyacı yoktur. Orchestrator işlevi tarafından ona geçirilen girişe, işlevin parametresi olarak doğrudan erişilebilir.
HttpStart istemci işlevi
bir istemci işlevi kullanarak orchestrator işlevinin bir örneğini başlatabilirsiniz. örneklerini E1_HelloSequencebaşlatmak için HTTP ile tetiklenen işlevini kullanacaksınızHttpStart.
public static class HttpStart
{
[FunctionName("HttpStart")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}")] HttpRequestMessage req,
[DurableClient] IDurableClient starter,
string functionName,
ILogger log)
{
// Function input comes from the request content.
object eventData = await req.Content.ReadAsAsync<object>();
string instanceId = await starter.StartNewAsync(functionName, eventData);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
return starter.CreateCheckStatusResponse(req, instanceId);
}
}
Düzenleyicilerle etkileşime geçmek için işlevin bir giriş bağlaması içermesi DurableClient gerekir. Bir düzenleme başlatmak için istemciyi kullanırsınız. Ayrıca, yeni düzenlemenin durumunu denetlemek için URL'leri içeren bir HTTP yanıtı döndürmenize de yardımcı olabilir.
Bir DurableOrchestrationClient nesneyi almak için kullanındf.getClient. Bir düzenleme başlatmak için istemciyi kullanırsınız. Ayrıca, yeni düzenlemenin durumunu denetlemek için URL'leri içeren bir HTTP yanıtı döndürmenize de yardımcı olabilir.
Düzenleyicileri yönetmek ve bunlarla etkileşime geçmek için işlevin bir durableClient giriş bağlaması olması gerekir. İşlevi kaydederken bağımsız değişkende extraInputs bu bağlamanın belirtilmesi gerekir.
durableClient çağrılarak df.input.durableClient()bir giriş elde edilebilir.
Bir DurableClient nesneyi almak için kullanındf.getClient. Bir düzenleme başlatmak için istemciyi kullanırsınız. Ayrıca, yeni düzenlemenin durumunu denetlemek için URL'leri içeren bir HTTP yanıtı döndürmenize de yardımcı olabilir.
Düzenleyicilerle etkileşime geçmek için işlevin bir giriş bağlaması içermesi durableClient gerekir.
HttpStart/__init__.py
import logging
import azure.functions as func
import azure.durable_functions as df
async def main(req: func.HttpRequest, starter: str) -> func.HttpResponse:
client = df.DurableOrchestrationClient(starter)
instance_id = await client.start_new(req.route_params["functionName"], None, None)
logging.info(f"Started orchestration with ID = '{instance_id}'.")
return client.create_check_status_response(req, instance_id)
DurableOrchestrationClient bir Dayanıklı İşlevler istemcisi almak için oluşturucuyu kullanın. Bir düzenleme başlatmak için istemciyi kullanırsınız. Ayrıca, yeni düzenlemenin durumunu denetlemek için URL'leri içeren bir HTTP yanıtı döndürmenize de yardımcı olabilir.
Örneği çalıştırma
Düzenlemeyi E1_HelloSequence yürütmek için işleve aşağıdaki HTTP POST isteğini HttpStart gönderin.
POST http://{host}/orchestrators/E1_HelloSequence
Not
Önceki HTTP kod parçacığı, dosyada tüm HTTP tetikleyici işlevleri URL'lerinden host.json varsayılan api/ ön eki kaldıran bir giriş olduğunu varsayar. Bu yapılandırma için işaretlemeyi örneklerdeki host.json dosyada bulabilirsiniz.
Örneğin, örneği "myfunctionapp" adlı bir işlev uygulamasında çalıştırıyorsanız, "{host}" yerine "myfunctionapp.azurewebsites.net" yazın.
Sonuç, şuna benzer bir HTTP 202 yanıtıdır (kısaltılmış):
Bu noktada düzenleme sıraya alınır ve hemen çalışmaya başlar. Üst bilgideki Location URL, yürütmenin durumunu denetlemek için kullanılabilir.
GET http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}
Sonuç, düzenlemenin durumudur. Hızlı bir şekilde çalıştırılır ve tamamlanır, böylece şuna benzer bir yanıtla Tamamlandı durumunda görürsünüz (kısa bir süre için kırpılmıştır):
Gördüğünüz gibi, runtimeStatus örneğin değeri Tamamlandı şeklindedir ve output orchestrator işlevi yürütmesinin JSON serileştirilmiş sonucunu içerir.
Not
, eventHubTriggerveya timerTriggergibi queueTriggerdiğer tetikleyici türleri için benzer başlangıç mantığı uygulayabilirsiniz.
İşlev yürütme günlüklerine bakın. düzenleme E1_HelloSequencegüvenilirliği konusunda açıklanan yeniden yürütme davranışı nedeniyle işlev birden çok kez başlatılmış ve tamamlanmıştır. Öte yandan, bu işlev yürütmeleri E1_SayHello yeniden oynatılmadığından yalnızca üç yürütme yapıldı.
Sonraki adımlar
Bu örnekte basit bir işlev zincirleme düzenlemesi gösterilmiştir. Sonraki örnekte, yayma/fan-in deseninin nasıl uygulandığı gösterilmektedir.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz. https://aka.ms/ContentUserFeedback.