Mulai Cepat: Membuat aplikasi Durable Functions C#

Gunakan Durable Functions, fitur Azure Functions, untuk menulis alur kerja tanpa server stateful di C#. Dalam panduan mulai cepat ini, Anda mengkloning dan menjalankan aplikasi contoh yang mendemonstrasikan pola orkestrasi perangkaian fungsi:

  • Penautan fungsi: Memanggil aktivitas secara berurutan (Tokyo → Seattle → London).

Pada akhirnya, Anda akan memiliki orkestrasi yang berjalan secara lokal dengan emulator Durable Task Scheduler dan dapat melihat statusnya di dasbor.

  • Kloning dan siapkan proyek sampel Hello Cities.
  • Siapkan emulator Durable Task Scheduler dan Azurite untuk pengembangan lokal.
  • Buat dan jalankan aplikasi fungsi dan picu orkestrasi.
  • Tinjau status orkestrasi dan output di dasbor Durable Task Scheduler.

Prasyarat

Menyiapkan emulator "Durable Task Scheduler"

Emulator Task Scheduler Durable menyediakan lingkungan pengembangan lokal sehingga Anda dapat menguji orkestrasi tanpa langganan Azure. Host .NET Functions juga memerlukan Azurite untuk penyimpanan lokal.

Mulai kedua kontainer:

docker run -d --name dtsemulator -p 8080:8080 -p 8082:8082 \
  mcr.microsoft.com/dts/dts-emulator:latest

docker run -d --name azurite -p 10000:10000 -p 10001:10001 -p 10002:10002 \
  mcr.microsoft.com/azure-storage/azurite

Tip

Setelah emulator berjalan, Anda dapat mengakses dasbor Durable Task Scheduler di http://localhost:8082 untuk memantau orkestrasi.

Jalankan contoh memulai cepat

  1. Navigasikan ke direktori sampel Hello Cities:

    cd samples/durable-functions/dotnet/HelloCities/http
    
  2. Buat local.settings.json file dengan konfigurasi emulator:

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
        "DURABLE_TASK_SERVICE_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None",
        "TASKHUB_NAME": "default"
      }
    }
    
  3. Bangun proyek tersebut:

    dotnet build
    
  4. Mulai aplikasi fungsi:

    func start
    
  5. Pada terminal terpisah, jalankan orkestrasi:

    $response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/DurableFunctionsOrchestrationCSharp1_HttpStart
    $response
    

    Respons berisi URL status untuk instans orkestrasi. statusQueryGetUri Salin nilai dan jalankan untuk memeriksa hasilnya:

    Invoke-RestMethod -Uri $response.statusQueryGetUri
    

Output yang diharapkan

Permintaan POST mengembalikan respons JSON dengan URL status. Contohnya:

{
  "id": "<instanceId>",
  "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/<instanceId>?code=...",
  "sendEventPostUri": "...",
  "terminatePostUri": "...",
  "purgeHistoryDeleteUri": "..."
}

Saat Anda mengkueri statusQueryGetUri dan orkestrasi runtimeStatus adalah Completed, Anda bisa menemukan hasil salam di output bidang :

{
  "name": "DurableFunctionsOrchestrationCSharp1",
  "runtimeStatus": "Completed",
  "output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
}

Tip

Jika runtimeStatus memperlihatkan Running atau Pending, tunggu sebentar dan kueri lagi statusQueryGetUri .

Buka dasbor Durable Task Scheduler di http://localhost:8082 untuk melihat status orkestrasi dan riwayat eksekusi.

Memahami kode

Proyek sampel di DurableFunctionsOrchestrationCSharp1.cs berisi ketiga jenis fungsi yang diperlukan untuk aplikasi Durable Functions.

Fungsi aktivitas

Aktivitas SayHello ini mengambil nama kota dan menghasilkan salam:

[Function(nameof(SayHello))]
public static string SayHello([ActivityTrigger] string name, FunctionContext executionContext)
{
    ILogger logger = executionContext.GetLogger("SayHello");
    logger.LogInformation("Saying hello to {name}.", name);
    return $"Hello {name}!";
}

Fungsi orkestrator

Orkestrator memanggil SayHello secara berurutan untuk tiga kota:

[Function(nameof(DurableFunctionsOrchestrationCSharp1))]
public static async Task<List<string>> RunOrchestrator(
    [OrchestrationTrigger] TaskOrchestrationContext context)
{
    ILogger logger = context.CreateReplaySafeLogger(nameof(DurableFunctionsOrchestrationCSharp1));
    logger.LogInformation("Saying hello.");
    var outputs = new List<string>();

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

    return outputs;
}

Fungsi klien

Fungsi klien yang dipicu HTTP memulai orkestrasi:

[Function("DurableFunctionsOrchestrationCSharp1_HttpStart")]
public static async Task<HttpResponseData> HttpStart(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
    [DurableClient] DurableTaskClient client,
    FunctionContext executionContext)
{
    ILogger logger = executionContext.GetLogger("DurableFunctionsOrchestrationCSharp1_HttpStart");
    string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(
        nameof(DurableFunctionsOrchestrationCSharp1));

    logger.LogInformation("Started orchestration with ID = '{instanceId}'.", instanceId);
    return await client.CreateCheckStatusResponseAsync(req, instanceId);
}

Konfigurasi

Sampel menggunakan emulator Durable Task Scheduler sebagai backend penyimpanannya. Ini dikonfigurasi dalam host.json:

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DURABLE_TASK_SERVICE_CONNECTION_STRING"
      },
      "hubName": "%TASKHUB_NAME%"
    }
  }
}

String koneksi emulator dan nama hub tugas diatur dalam local.settings.json:

{
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
    "DURABLE_TASK_SERVICE_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None",
    "TASKHUB_NAME": "default"
  }
}

Membersihkan sumber daya

Hentikan kontainer emulator setelah Anda selesai:

docker stop dtsemulator azurite && docker rm dtsemulator azurite

Langkah berikutnya