Aracılığıyla paylaş


Dayanıklı İşlevler'de işlev zinciri - Merhaba dizisi örneği

İş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ış.

Önkoşullar

Not

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.
  • E1_SayHello: Bir dizenin başına "Hello" ekleyen bir etkinlik işlevi .
  • HttpStart: Düzenleyicinin bir örneğini başlatan HTTP tarafından tetiklenen dayanıklı istemci işlevi.

E1_HelloSequence orchestrator işlevi

[FunctionName("E1_HelloSequence")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Tokyo"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Seattle"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello_DirectInput", "London"));

    // returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
    return outputs;
}

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.

etkinlik işlevini E1_SayHello

[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:

[FunctionName("E1_SayHello_DirectInput")]
public static string SayHelloDirectInput([ActivityTrigger] string name)
{
    return $"Hello {name}!";
}

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.

Ö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ış):

HTTP/1.1 202 Accepted
Content-Length: 719
Content-Type: application/json; charset=utf-8
Location: http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

(...trimmed...)

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):

HTTP/1.1 200 OK
Content-Length: 179
Content-Type: application/json; charset=utf-8

{"runtimeStatus":"Completed","input":null,"output":["Hello Tokyo!","Hello Seattle!","Hello London!"],"createdTime":"2017-06-29T05:24:57Z","lastUpdatedTime":"2017-06-29T05:24:59Z"}

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.