Bagikan melalui


Penautan fungsi

Penautan fungsi adalah pola di mana Anda menjalankan urutan fungsi secara berurutan. Adalah umum untuk meneruskan output dari satu fungsi ke input berikutnya. Artikel ini menjelaskan urutan penautan yang Anda buat saat menyelesaikan panduan awal Durable Functions (C#, JavaScript, TypeScript, Python, PowerShell, atau Java). Pelajari selengkapnya di ringkasan Durable Functions.

Prasyarat

Penautan fungsi adalah pola di mana Anda menjalankan urutan aktivitas secara berurutan. Adalah umum untuk meneruskan output dari satu aktivitas ke input berikutnya. Artikel ini menjelaskan rangkaian penautan untuk Durable Task SDKs untuk .NET, JavaScript, Python, dan Java.

Functions

Artikel ini menjelaskan fungsi-fungsi ini di aplikasi sampel:

  • E1_HelloSequence: Fungsi orkestrator yang memanggil E1_SayHello beberapa kali secara berurutan. Ini menyimpan setiap output dan merekam hasilnya.
  • E1_SayHello: Fungsi aktivitas yang menambahkan "Halo" ke awal string.
  • HttpStart: Fungsi klien tahan lama yang dipicu HTTP yang memulai instans orkestrator.

Artikel ini menjelaskan komponen-komponen ini di aplikasi sampel:

  • GreetingOrchestration, , greetingOrchestratorfunction_chaining_orchestrator, atau ActivityChaining: Orkestrator yang memanggil beberapa aktivitas secara berurutan. Ini menyimpan setiap output dan merekam hasilnya.
  • Fungsi aktivitas: Aktivitas yang memproses input dan mengembalikan hasil. Setiap aktivitas melakukan transformasi sederhana pada input.
  • Klien: Aplikasi klien yang memulai instans orkestrator dan menunggu hasilnya.

Pengorkestra

[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;
}

Semua fungsi orkestrasi C# harus memiliki parameter jenis DurableOrchestrationContext, yang ada di rakitan Microsoft.Azure.WebJobs.Extensions.DurableTask. Objek konteks ini memungkinkan Anda memanggil fungsi aktivitas lain dan meneruskan parameter input menggunakan CallActivityAsync metodenya.

Kode memanggil E1_SayHello tiga kali secara berurutan dengan nilai parameter yang berbeda. Nilai yang dikembalikan dari setiap panggilan ditambahkan ke daftar outputs, yang akan dikembalikan di akhir fungsi.

Kode ini menunjukkan orkestrator yang memanggil tiga aktivitas secara berurutan dan meneruskan setiap output ke aktivitas berikutnya:

using System.Threading.Tasks;
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;
    }
}

Semua orkestrator .NET mewarisi dari TaskOrchestrator<TInput, TOutput>. Fungsi TaskOrchestrationContext memungkinkan Anda untuk memanggil aktivitas menggunakan CallActivityAsync. Kode memanggil tiga aktivitas secara berurutan, di mana setiap aktivitas menerima output aktivitas sebelumnya.

Activity

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

Aktivitas menggunakan ActivityTrigger atribut. Gunakan IDurableActivityContext untuk tindakan aktivitas, seperti membaca input dengan GetInput<T>.

E1_SayHello mengformat string sapaan.

Alih-alih mengikat ke IDurableActivityContext, ikat langsung ke tipe yang diteruskan ke fungsi aktivitas tersebut. Contohnya:

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

Aktivitas dalam Durable Task SDK diwarisi dari TaskActivity<TInput, TOutput>:

using System.Threading.Tasks;
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!");
    }
}

Gunakan injeksi dependensi untuk mendapatkan layanan seperti ILogger. Tambahkan atribut [DurableTask] untuk mendaftarkan aktivitas ke pekerja.

Klien

Mulai instans fungsi orkestrator dari fungsi klien. Gunakan fungsi HTTP yang dipicu HttpStart untuk memulai instans E1_HelloSequence.

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);
    }
}

Untuk berinteraksi dengan orkestrator, tambahkan pengikatan DurableClient input. Gunakan klien untuk memulai orkestrasi dan mengembalikan respons HTTP yang menyertakan URL untuk memeriksa status orkestrasi baru.

Mulai orkestrasi dari aplikasi klien. Klien menjadwalkan orkestrasi dan dapat menunggu penyelesaian.

using System;
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>()}");

Buat DurableTaskClient dengan menggunakan string koneksi ke Durable Task Scheduler. Gunakan ScheduleNewOrchestrationInstanceAsync untuk memulai orkestrasi dan WaitForInstanceCompletionAsync menunggu penyelesaian.

Jalankan sampel

Untuk menjalankan E1_HelloSequence orkestrasi, kirim permintaan HTTP POST ini ke HttpStart fungsi .

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

Catatan

Cuplikan HTTP sebelumnya mengasumsikan file host.json sampel menghapus awalan default api/ dari semua URL fungsi pemicu HTTP. Temukan konfigurasi ini dalam file host.json sampel.

Misalnya, jika Anda menjalankan sampel di aplikasi fungsi bernama myfunctionapp, ganti {host} dengan myfunctionapp.azurewebsites.net.

Permintaan mengembalikan HTTP 202 (dipangkas untuk ringkasnya):

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

Antrean orkestrasi mulai berjalan segera. Gunakan URL di Location header untuk memeriksa status eksekusi.

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

Tanggapan menunjukkan status orkestrasi. Karena selesai dengan cepat, instans sering dalam keadaan Selesai dan mengembalikan respons seperti ini (dipangkas untuk brevity):

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"}

Instans runtimeStatusSelesai, dan output berisi hasil serial JSON dari eksekusi fungsi orkestrator.

Catatan

Terapkan logika pemula serupa untuk jenis pemicu lainnya, seperti queueTrigger, eventHubTrigger, atau timerTrigger.

Tinjau log eksekusi fungsi. Fungsi E1_HelloSequence dimulai dan selesai beberapa kali karena perilaku pemutaran ulang yang dijelaskan dalam keandalan orkestrasi. Tetapi E1_SayHello hanya berjalan tiga kali karena eksekusi fungsi aktivitas tidak diputar ulang.

Untuk menjalankan sampel, Anda memerlukan:

  1. Mulai emulator Durable Task Scheduler (untuk pengembangan lokal):

    docker run -d -p 8080:8080 -p 8082:8082 --name dts-emulator mcr.microsoft.com/dts/dts-emulator:latest
    
  2. Mulai pekerja untuk mendaftarkan orkestrator dan aktivitas.

  3. Jalankan klien untuk menjadwalkan orkestrasi dan menunggu hasilnya.

Output klien menunjukkan hasil orkestrasi berantai:

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

Log pekerja menunjukkan setiap aktivitas berjalan secara berurutan dan meneruskan outputnya ke aktivitas berikutnya.

Langkah berikutnya

Sampel ini menunjukkan orkestrasi rantai fungsi sederhana. Selanjutnya, terapkan pola fan-out/fan-in.

Sampel ini menunjukkan orkestrasi rantai fungsi sederhana. Selanjutnya, jelajahi lebih banyak pola.

Untuk contoh JavaScript SDK lengkap, lihat sampel SDK JavaScript Tugas Tahan Lama.