Aracılığıyla paylaş


İşlev zincirleme

İşlev zincirleme, bir etkinlik dizisini sırayla çalıştırdığınız bir desendir. Bir etkinliğin çıkışını bir sonraki etkinliğin girişine geçirmek yaygın bir işlemdir. Bu makalede .NET, JavaScript, Python ve Java için Dayanıklı Görev SDK'larının zincirleme sırası açıklanmaktadır.

Functions

Bu makalede, örnek uygulamadaki şu işlevler açıklanmaktadır:

  • E1_HelloSequence: Bir orchestrator işlevi, sırayla birden çok kez E1_SayHello çağırır. Her çıkışı depolar ve sonuçları kaydeder.
  • E1_SayHello: Dizenin başlangıcına "Hello" ekleyen bir etkinlik işlevi .
  • HttpStart: Düzenleyicinin bir örneğini başlatan HTTP ile tetiklenen dayanıklı istemci işlevi.

Bu makalede, örnek uygulamadaki şu bileşenler açıklanmaktadır:

  • GreetingOrchestration, greetingOrchestrator, function_chaining_orchestratorveya ActivityChaining: Birden çok etkinliği sırayla çağıran bir düzenleyici. Her çıkışı depolar ve sonuçları kaydeder.
  • Etkinlik işlevleri: Girişi işleyen ve sonuçları döndüren etkinlikler. Her etkinlik, giriş üzerinde basit bir dönüştürme gerçekleştirir.
  • İstemci: Bir orkestratör örneğini başlatan ve sonucu bekleyen bir istemci uygulaması.

Orchestrator

[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şlevlerinin DurableOrchestrationContext derlemesinde bulunan Microsoft.Azure.WebJobs.Extensions.DurableTask türünde bir parametresi 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.

Bu kod, sırayla üç etkinliği çağıran ve her çıkışı bir sonraki etkinliğe geçiren bir düzenleyici gösterir:

using Microsoft.DurableTask;

[DurableTask]
public class GreetingOrchestration : TaskOrchestrator<string, string>
{
    public override async Task<string> RunAsync(TaskOrchestrationContext context, string name)
    {
        // Step 1: Say hello to the person
        string greeting = await context.CallActivityAsync<string>(nameof(SayHelloActivity), name);

        // Step 2: Process the greeting
        string processedGreeting = await context.CallActivityAsync<string>(nameof(ProcessGreetingActivity), greeting);

        // Step 3: Finalize the response
        string finalResponse = await context.CallActivityAsync<string>(nameof(FinalizeResponseActivity), processedGreeting);

        return finalResponse;
    }
}

Tüm .NET orkestratörleri TaskOrchestrator<TInput, TOutput>'dan devralır. TaskOrchestrationContext kullanarak CallActivityAsync etkinlikleri çağırmanızı sağlar. Kod, her etkinliğin önceki etkinliğin çıkışını aldığı sırayla üç etkinliği çağırır.

Activity

[FunctionName("E1_SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext context)
{
    string name = context.GetInput<string>();
    return $"Hello {name}!";
}

Etkinlikler özniteliğini ActivityTrigger kullanır. "IDurableActivityContext, GetInput<T> ile giriş okumak gibi etkinlik eylemleri için kullanın."

E1_SayHello bir selamlama stringini biçimlendirir.

IDurableActivityContext yerine, doğrudan aktivite fonksiyonuna geçirilen tipe bağlanın. Örneğin:

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

Dayanıklı Görev SDK'sındaki etkinlikler TaskActivity<TInput, TOutput>'dan devralınır.

using Microsoft.DurableTask;
using Microsoft.Extensions.Logging;

[DurableTask]
public class SayHelloActivity : TaskActivity<string, string>
{
    private readonly ILogger<SayHelloActivity> _logger;

    public SayHelloActivity(ILogger<SayHelloActivity> logger)
    {
        _logger = logger;
    }

    public override Task<string> RunAsync(TaskActivityContext context, string name)
    {
        _logger.LogInformation("Activity SayHello called with name: {Name}", name);
        return Task.FromResult($"Hello {name}!");
    }
}

[DurableTask]
public class ProcessGreetingActivity : TaskActivity<string, string>
{
    public override Task<string> RunAsync(TaskActivityContext context, string greeting)
    {
        return Task.FromResult($"{greeting} How are you today?");
    }
}

[DurableTask]
public class FinalizeResponseActivity : TaskActivity<string, string>
{
    public override Task<string> RunAsync(TaskActivityContext context, string response)
    {
        return Task.FromResult($"{response} I hope you're doing well!");
    }
}

gibi ILoggerhizmetleri almak için bağımlılık ekleme özelliğini kullanın. Çalışan ile etkinliğini kaydetmek için [DurableTask] özniteliğini ekleyin.

Müşteri

bir istemci işlevinden orchestrator işlev örneğini başlatın. HttpStart örneklerini başlatmak için HTTP tetiklemeli işlevi kullanın.

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 bir DurableClient giriş bağlaması ekleyin. İstemciyi kullanarak bir düzenleme başlatın ve yeni düzenlemenin durumunu denetlemek için URL'ler içeren bir HTTP yanıtı döndürin.

İstemci uygulamasından düzenleme başlatın. Müşteri orkestrasyonu zamanlar ve tamamlanmasını bekleyebilir.

using Microsoft.DurableTask.Client;

// Create the client
var client = DurableTaskClientBuilder.UseDurableTaskScheduler(connectionString).Build();

// Schedule a new orchestration instance
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(
    nameof(GreetingOrchestration),
    input: "World");

Console.WriteLine($"Started orchestration with ID: {instanceId}");

// Wait for the orchestration to complete
OrchestrationMetadata result = await client.WaitForInstanceCompletionAsync(
    instanceId,
    getInputsAndOutputs: true);

Console.WriteLine($"Orchestration completed with result: {result.ReadOutputAs<string>()}");

Dayanıklı Görev Zamanlayıcı'ya bağlanmak için bağlantı dizesi kullanarak DurableTaskClient oluşturun. ScheduleNewOrchestrationInstanceAsync kullanarak bir orkestrasyon başlatın ve WaitForInstanceCompletionAsync tamamlanmasını bekleyin.

Örneği çalıştırma

Orkestrasyonu E1_HelloSequence çalıştırmak için, bu HTTP POST isteğini HttpStart işlevine gönderin.

POST http://{host}/orchestrators/E1_HelloSequence

Not

Önceki HTTP kod parçacığı, örneğin host.json dosyasının tüm HTTP tetikleyicisi işlev URL'lerinden varsayılan api/ ön eki kaldırmış olduğunu varsayar. Bu yapılandırmayı örneğin host.json dosyasında bulabilirsiniz.

Örneğin, myfunctionapp adlı bir işlev uygulamasında örneği çalıştırıyorsanız, myfunctionapp.azurewebsites.net değerini {host} ile değiştirin.

İstek HTTP 202 döndürür (kısa olması için kırpılır):

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

Orkestrasyon kuyrukları oluşturulur ve hemen çalışmaya başlar. Yürütme durumunu denetlemek için üst bilgideki Location URL'yi kullanın.

GET http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

Yanıt düzenleme durumunu gösterir. Hızlı bir şekilde tamamlandığından, örnek genellikle Tamamlandı durumundadır ve şuna benzer bir yanıt döndürür (kısa süre için kırpılı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"}

Örneği runtimeStatusTamamlandı'dır ve output orchestrator işlevi yürütmesinin JSON serileştirilmiş sonucunu içerir.

Not

, queueTriggerveya eventHubTriggergibi timerTriggerdiğer tetikleyici türleri için benzer başlangıç mantığı uygulayın.

İşlev yürütme günlüklerini gözden geçirin. İşlev, E1_HelloSequenceorkestrasyon güvenilirliğinde açıklanan yeniden yürütme davranışı nedeniyle birden fazla kez başlar ve tamamlanır. Ancak etkinlik işlevi yürütmeleri yeniden yürütülmediğinden E1_SayHello yalnızca üç kez çalışır.

Örneği çalıştırmak için şunları yapmanız gerekir:

  1. Dayanıklı Görev Zamanlayıcı öykünücüsü 'ni başlatın (yerel geliştirme için):

    docker run -d -p 8080:8080 -p 8082:8082 --name dts-emulator mcr.microsoft.com/dts/dts-emulator:latest
    
  2. Düzenleyiciyi ve etkinlikleri kaydetmek için çalışanı başlatın.

  3. Bir düzenleme zamanlamak ve sonucu beklemek için istemciyi çalıştırın.

İstemci çıktısı zincirleme orkestrasyon sonucunu gösterir.

Started orchestration with ID: abc123
Orchestration completed with result: "Hello World! How are you today? I hope you're doing well!"

Çalışan günlük kayıtları, her etkinliğin ardışık olarak çalıştığını ve çıktısını bir sonraki etkinliğe aktardığını gösterir.

Sonraki adımlar

Bu örnek, basit bir işlev zincirleme orkestrasyonunu göstermektedir. Ardından, fan-out/fan-in desenini uygulayın.

Bu örnek, basit bir işlev zincirleme orkestrasyonunu göstermektedir. Ardından, daha fazla desen keşfedin.

Tam JavaScript SDK örnekleri için bkz . Dayanıklı Görev JavaScript SDK örnekleri.