Mengelola instans orkestrasi

Gunakan API manajemen instans bawaan untuk memulai, memeriksa, menghentikan, menangguhkan, melanjutkan, dan menghapus instans orkestrasi dalam alur kerja tahan lama Anda. Dalam Durable Functions, pengikatan klien orchestration mengekspos API ini. Dalam Durable Task SDKs, operasi yang sama tersedia melalui kelas DurableTaskClient. Artikel ini menunjukkan cara melakukan setiap operasi manajemen instans dengan contoh kode untuk kedua platform.

Petunjuk / Saran

Azure Durable Task Scheduler adalah backend yang direkomendasikan untuk Durable Functions dan Durable Task SDK, memberikan pengalaman tanpa server yang dikelola sepenuhnya untuk menjalankan alur kerja yang tahan lama dalam skala besar.

Memulai instance

Metode start-new (atau schedule-new) pada klien orkestrasi memulai instans orkestrasi baru. Secara internal, metode ini menulis pesan ke backend yang dikonfigurasi (seperti Durable Task Scheduler atau Azure Storage) lalu mengembalikan. Pesan ini secara asinkron memicu dimulainya orkestrasi dengan nama yang ditentukan.

Berikut adalah parameter untuk memulai instans orkestrasi baru:

  • Nama: Nama fungsi orkestrator yang akan dijadwalkan.
  • Input: Setiap data yang dapat diserialisasikan JSON yang harus diteruskan sebagai input ke fungsi orkestrator.
  • InstanceId: (Opsional) ID unik instans. Jika Anda tidak menentukan parameter ini, metode menggunakan ID acak.

Petunjuk / Saran

Gunakan pengidentifikasi acak untuk ID instans jika memungkinkan. ID instans acak membantu memastikan distribusi beban yang sama saat Anda menskalakan fungsi orkestrator di beberapa VM. Waktu yang tepat untuk menggunakan ID instans nonrandom adalah ketika ID berasal dari sumber eksternal atau saat Anda menerapkan pola orkestrator singleton .

  • Nama: Nama orkestrasi yang akan dijadwalkan.
  • Input: Setiap data yang dapat diserialisasikan JSON yang harus diteruskan sebagai input ke orkestrasi.
  • InstanceId: (Opsional) ID unik instans. Jika Anda tidak menentukan parameter ini, metode menggunakan ID acak.

Petunjuk / Saran

Gunakan pengidentifikasi acak untuk ID instans jika memungkinkan. ID instans acak membantu memastikan distribusi beban yang sama saat Anda menskalakan orkestrasi di beberapa VM. Waktu yang tepat untuk menggunakan ID instans nonrandom adalah ketika ID berasal dari sumber eksternal atau saat Anda menerapkan pola orkestrator singleton .

Contoh fungsi berikut memulai instans orkestrasi baru:

[FunctionName("HelloWorldQueueTrigger")]
public static async Task Run(
    [QueueTrigger("start-queue")] string input,
    [DurableClient] IDurableOrchestrationClient starter,
    ILogger log)
{
    string instanceId = await starter.StartNewAsync("HelloWorld", input);
    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
}

Nota

Kode C# sebelumnya menggunakan model dalam proses dengan IDurableOrchestrationClient, yang ditandai sebagai usang dalam versi ekstensi Durable Functions yang lebih baru. Untuk proyek .NET baru, pertimbangkan untuk menggunakan model pekerja terisolasi .NET dengan DurableTaskClient. Untuk informasi selengkapnya, lihat artikel versi Durable Functions .

Penting

Saat ini, PowerShell Durable Task SDK tidak tersedia.

Kode berikut menunjukkan cara memulai instans orkestrasi baru dengan menggunakan SDK Tugas Tahan Lama:

using Microsoft.DurableTask.Client;

// Schedule a new orchestration instance
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync("HelloWorld", input);
Console.WriteLine($"Started orchestration with ID = '{instanceId}'.");

// Optionally, wait for the orchestration to start
OrchestrationMetadata metadata = await client.WaitForInstanceStartAsync(instanceId, timeout: TimeSpan.FromSeconds(30));

Instans kueri

Setelah memulai instans orkestrasi baru, Anda kemungkinan besar perlu mengkueri status runtime mereka untuk mempelajari apakah instans tersebut berjalan, selesai, atau gagal.

Metode get-status pada klien orkestrasi mengembalikan status instans orkestrasi.

instanceId Dibutuhkan (wajib), showHistory (opsional), showHistoryOutput (opsional), dan showInput (opsional) sebagai parameter.

  • showHistory: Jika diatur ke true, respons berisi riwayat eksekusi.
  • showHistoryOutput: Jika diatur ke true, riwayat eksekusi berisi output aktivitas.
  • showInput: Jika diatur ke false, respons tidak berisi input fungsi. Nilai defaultnya adalah true.

Metode mengembalikan objek dengan properti berikut:

  • Nama: Nama fungsi orkestrator.
  • InstanceId: ID instans orkestrasi (harus sama instanceId dengan input).
  • CreatedTime: Waktu saat fungsi orkestrator mulai berjalan.
  • LastUpdatedTime: Waktu saat orkestrasi terakhir melakukan checkpoint.
  • Input: Input fungsi sebagai nilai JSON. Bidang ini tidak diisi jika showInput adalah false.
  • CustomStatus: Status orkestrasi kustom dalam format JSON.
  • Output: Output fungsi sebagai nilai JSON (jika fungsi selesai). Jika fungsi orkestrator gagal, properti ini menyertakan detail kegagalan. Jika fungsi orkestrator ditangguhkan atau dihentikan, properti ini mencakup alasan penangguhan atau penghentian (jika ada).
  • RuntimeStatus: Salah satu nilai berikut:
    • Tertunda: Instans dijadwalkan tetapi belum mulai berjalan.
    • Berjalan: Instance sedang berjalan.
    • Selesai: Instans selesai secara normal.
    • ContinuedAsNew: Instans memulai ulang dirinya sendiri dengan riwayat baru. Status ini adalah status sementara.
    • Gagal: Instans gagal dengan kesalahan.
    • Dihentikan: Instans berhenti tiba-tiba.
    • Ditangguhkan: Instans ditangguhkan dan dapat dilanjutkan pada titik waktu selanjutnya.
  • Riwayat: Riwayat pelaksanaan orkestrasi. Bidang ini hanya diisi jika showHistory diatur ke true.
  • showHistory: Jika diatur ke true, respons berisi riwayat eksekusi.
  • showHistoryOutput: Jika diatur ke true, riwayat eksekusi berisi output aktivitas.
  • showInput: Jika diatur ke false, respons tidak berisi input orkestrasi. Nilai defaultnya adalah true.

Metode mengembalikan objek dengan properti berikut:

  • Nama: Nama orkestrasi.
  • InstanceId: ID instans orkestrasi (harus sama instanceId dengan input).
  • CreatedTime: Waktu saat orkestrasi mulai berjalan.
  • LastUpdatedTime: Waktu saat orkestrasi terakhir melakukan checkpoint.
  • Input: Input orkestrasi sebagai nilai JSON. Bidang ini tidak diisi jika showInput adalah false.
  • CustomStatus: Status orkestrasi kustom dalam format JSON.
  • Output: Output orkestrasi sebagai nilai JSON (jika orkestrasi selesai). Jika orkestrasi gagal, properti ini menyertakan detail kegagalan. Jika orkestrasi ditangguhkan atau dihentikan, properti ini mencakup alasan penangguhan atau penghentian (jika ada).
  • RuntimeStatus: Salah satu nilai berikut:
    • Tertunda: Instans dijadwalkan tetapi belum mulai berjalan.
    • Berjalan: Instance sedang berjalan.
    • Selesai: Instans selesai secara normal.
    • ContinuedAsNew: Instans memulai ulang dirinya sendiri dengan riwayat baru. Status ini adalah status sementara.
    • Gagal: Instans gagal dengan kesalahan.
    • Dihentikan: Instans berhenti tiba-tiba.
    • Ditangguhkan: Instans ditangguhkan dan dapat dilanjutkan pada titik waktu selanjutnya.
  • Riwayat: Riwayat pelaksanaan orkestrasi. Bidang ini hanya diisi jika showHistory diatur ke true.

Nota

Orkestrator tidak ditandai sebagai Completed sampai semua tugas terjadwal selesai dan orkestrator kembali. Dengan kata lain, tidaklah cukup bagi orkestrator untuk mencapai pernyataan return agar dapat ditandai sebagai Completed. Ini sangat relevan untuk kasus di mana WhenAny digunakan; sering kali orkestrator tersebut return sebelum semua tugas yang dijadwalkan selesai dijalankan.

Metode ini mengembalikan null (.NET dan Java), undefined (JavaScript), atau None (Python) jika instans tidak ada.

[FunctionName("GetStatus")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("check-status-queue")] string instanceId)
{
    DurableOrchestrationStatus status = await client.GetStatusAsync(instanceId);
    // do something based on the current status.
}

Nota

Kode C# sebelumnya menggunakan model dalam proses dengan IDurableOrchestrationClient, yang ditandai sebagai usang dalam versi ekstensi Durable Functions yang lebih baru. Untuk proyek .NET baru, pertimbangkan untuk menggunakan model pekerja terisolasi .NET dengan DurableTaskClient. Untuk informasi selengkapnya, lihat artikel versi Durable Functions .

using Microsoft.DurableTask.Client;

// Get the status of an orchestration instance
OrchestrationMetadata? metadata = await client.GetInstanceAsync(instanceId, getInputsAndOutputs: true);
if (metadata != null)
{
    OrchestrationRuntimeStatus status = metadata.RuntimeStatus;
    // do something based on the current status
}

Mengkueri semua instans orkestrasi

Anda dapat menggunakan API dalam SDK bahasa Anda untuk mengkueri status semua instans orkestrasi di hub tugas Anda. API "list-instances" atau "get-status" ini mengembalikan daftar objek yang mewakili instans orkestrasi yang cocok dengan parameter kueri.

[FunctionName("GetAllStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    var noFilter = new OrchestrationStatusQueryCondition();
    OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
        noFilter,
        CancellationToken.None);
    foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
    {
        log.LogInformation(JsonConvert.SerializeObject(instance));
    }

    // Note: ListInstancesAsync only returns the first page of results.
    // To request additional pages provide the result.ContinuationToken
    // to the OrchestrationStatusQueryCondition's ContinuationToken property.
}

Nota

Kode C# sebelumnya menggunakan model dalam proses dengan IDurableOrchestrationClient, yang ditandai sebagai usang dalam versi ekstensi Durable Functions yang lebih baru. Untuk proyek .NET baru, pertimbangkan untuk menggunakan model pekerja terisolasi .NET dengan DurableTaskClient. Untuk informasi selengkapnya, lihat artikel versi Durable Functions .

using Microsoft.DurableTask.Client;

// Query all orchestration instances
AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(new OrchestrationQuery());

await foreach (OrchestrationMetadata instance in instances)
{
    Console.WriteLine(instance.InstanceId);
}

Instans orkestrasi kueri dengan filter

Bagaimana jika Anda tidak memerlukan semua informasi yang disediakan kueri instans standar? Misalnya, bagaimana jika yang Anda cari hanya waktu pembuatan orkestrasi atau status waktu jalan orkestrasi? Persempit kueri Anda dengan menerapkan filter.

[FunctionName("QueryStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    // Get the first 100 running or pending instances that were created between 7 and 1 days ago
    var queryFilter = new OrchestrationStatusQueryCondition
    {
        RuntimeStatus = new[]
        {
            OrchestrationRuntimeStatus.Pending,
            OrchestrationRuntimeStatus.Running,
        },
        CreatedTimeFrom = DateTime.UtcNow.Subtract(TimeSpan.FromDays(7)),
        CreatedTimeTo = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)),
        PageSize = 100,
    };

    OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
        queryFilter,
        CancellationToken.None);
    foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
    {
        log.LogInformation(JsonConvert.SerializeObject(instance));
    }
}

Nota

Kode C# sebelumnya menggunakan model dalam proses dengan IDurableOrchestrationClient, yang ditandai sebagai usang dalam versi ekstensi Durable Functions yang lebih baru. Untuk proyek .NET baru, pertimbangkan untuk menggunakan model pekerja terisolasi .NET dengan DurableTaskClient. Untuk informasi selengkapnya, lihat artikel versi Durable Functions .

using Microsoft.DurableTask.Client;

// Get running or pending instances created in the last 7 days
var query = new OrchestrationQuery
{
    Statuses = new[] { OrchestrationRuntimeStatus.Running, OrchestrationRuntimeStatus.Pending },
    CreatedFrom = DateTime.UtcNow.AddDays(-7),
    CreatedTo = DateTime.UtcNow.AddDays(-1),
    PageSize = 100
};

AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(query);

await foreach (OrchestrationMetadata instance in instances)
{
    Console.WriteLine($"{instance.InstanceId}: {instance.RuntimeStatus}");
}

Menghentikan instans orkestrasi

Jika Anda memiliki instans orkestrasi yang membutuhkan waktu terlalu lama untuk dijalankan, atau Anda perlu menghentikannya sebelum selesai karena alasan apa pun, Anda dapat mengakhirinya.

Dua parameter untuk API yang dihentikan adalah ID instans dan string alasan , yang menulis ke log dan ke status instans.

[FunctionName("TerminateInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("terminate-queue")] string instanceId)
{
    string reason = "Found a bug";
    return client.TerminateAsync(instanceId, reason);
}

Nota

Kode C# sebelumnya menggunakan model dalam proses dengan IDurableOrchestrationClient, yang ditandai sebagai usang dalam versi ekstensi Durable Functions yang lebih baru. Untuk proyek .NET baru, pertimbangkan untuk menggunakan model pekerja terisolasi .NET dengan DurableTaskClient. Untuk informasi selengkapnya, lihat artikel versi Durable Functions .

using Microsoft.DurableTask.Client;

string reason = "Found a bug";
await client.TerminateInstanceAsync(instanceId, reason);

Instans yang dihentikan pada akhirnya beralih ke status Terminated . Tapi transisi ini tidak segera terjadi. Sebaliknya, operasi penghentian diantrekan di hub tugas bersama dengan operasi lain untuk instans tersebut. Anda dapat menggunakan API kueri instans untuk mengetahui kapan instans yang dihentikan benar-benar telah mencapai status Terminated .

Nota

Penghentian instans saat ini tidak mengalami propagasi. Fungsi aktivitas dan sub-orkestrasi berjalan hingga selesai, terlepas dari apakah Anda mengakhiri instans orkestrasi yang memanggilnya.

Menangguhkan dan melanjutkan instans orkestrasi

Menangguhkan orkestrasi memungkinkan Anda menghentikan orkestrasi yang sedang berjalan. Tidak seperti mengakhiri suatu orkestrasi, Anda dapat melanjutkan proses orkestrasi yang ditangguhkan nanti.

Dua parameter untuk API suspend adalah ID instance dan string alasan, yang ditulis ke log dan ke status instance.

[FunctionName("SuspendResumeInstance")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("suspend-resume-queue")] string instanceId)
{
    // To suspend an orchestration
    string suspendReason = "Need to pause workflow";
    await client.SuspendAsync(instanceId, suspendReason);

    // To resume an orchestration
    string resumeReason = "Continue workflow";
    await client.ResumeAsync(instanceId, resumeReason);
}
using Microsoft.DurableTask.Client;

// To suspend an orchestration
string suspendReason = "Need to pause workflow";
await client.SuspendInstanceAsync(instanceId, suspendReason);

// To resume an orchestration
string resumeReason = "Continue workflow";
await client.ResumeInstanceAsync(instanceId, resumeReason);

Instans yang ditangguhkan pada akhirnya beralih ke status Suspended . Namun, transisi ini tidak segera terjadi. Sebaliknya, operasi penangguhan diantri di hub tugas bersama dengan operasi lain untuk instans tersebut. Gunakan API kueri instans untuk mengetahui kapan instans yang sedang berjalan benar-benar telah mencapai status Suspended .

Saat orkestrator yang ditangguhkan dilanjutkan, statusnya akan berubah kembali menjadi Running.

Mengirim event ke instans

Dalam beberapa skenario, fungsi orkestrator perlu menunggu dan mendengarkan peristiwa eksternal. Contoh di mana pendekatan ini berguna termasuk skenario pemantauan dan interaksi manusia .

Dalam beberapa skenario, orkestrasi perlu menunggu dan mendengarkan peristiwa eksternal. Contoh di mana pendekatan ini berguna termasuk skenario pemantauan dan interaksi manusia .

Anda dapat mengirim pemberitahuan peristiwa ke instans yang sedang berjalan dengan menggunakan API ajukan peristiwa klien orkestrasi. Orkestrasi dapat mendengarkan dan merespons peristiwa ini menggunakan API orkestrator menunggu peristiwa eksternal.

Parameter untuk peristiwa kenaikan adalah:

  • ID Instans: ID unik instans.
  • Nama peristiwa: Nama peristiwa yang akan dikirim.
  • Data peristiwa: Muatan yang dapat diserialkan JSON untuk dikirim ke instance.
[FunctionName("RaiseEvent")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("event-queue")] string instanceId)
{
    int[] eventData = new int[] { 1, 2, 3 };
    return client.RaiseEventAsync(instanceId, "MyEvent", eventData);
}

Nota

Kode C# sebelumnya menggunakan model dalam proses dengan IDurableOrchestrationClient, yang ditandai sebagai usang dalam versi ekstensi Durable Functions yang lebih baru. Untuk proyek .NET baru, pertimbangkan untuk menggunakan model pekerja terisolasi .NET dengan DurableTaskClient. Untuk informasi selengkapnya, lihat artikel versi Durable Functions .

using Microsoft.DurableTask.Client;

int[] eventData = new int[] { 1, 2, 3 };
await client.RaiseEventAsync(instanceId, "MyEvent", eventData);

Nota

Jika tidak ada instans orkestrasi dengan ID instans yang ditentukan, pesan peristiwa akan dibuang. Jika instans ada tetapi belum menunggu peristiwa, peristiwa disimpan dalam status instans hingga siap diterima dan diproses.

Tunggu penyelesaian orkestrasi

Dalam orkestrasi yang berlangsung lama, Anda mungkin ingin menunggu dan mendapatkan hasil dari sebuah orkestrasi. Dalam kasus ini, juga berguna untuk menentukan jangka waktu batas pada proses orkestrasi. Jika batas waktu terlampaui, status orkestrasi dikembalikan alih-alih hasilnya.

Gunakan API "tunggu penyelesaian atau buat respons status pemeriksaan" untuk mendapatkan output aktual dari instans orkestrasi secara sinkron. Secara default, metode ini memiliki batas waktu sepuluh detik dan interval polling satu detik.

Berikut adalah contoh fungsi pemicu HTTP yang menunjukkan cara menggunakan API ini:

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace VSSample
{
    public static class HttpSyncStart
    {
        private const string Timeout = "timeout";
        private const string RetryInterval = "retryInterval";

        [FunctionName("HttpSyncStart")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}/wait")]
            HttpRequestMessage req,
            [DurableClient] IDurableOrchestrationClient 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}'.");

            TimeSpan timeout = GetTimeSpan(req, Timeout) ?? TimeSpan.FromSeconds(30);
            TimeSpan retryInterval = GetTimeSpan(req, RetryInterval) ?? TimeSpan.FromSeconds(1);
            
            return await starter.WaitForCompletionOrCreateCheckStatusResponseAsync(
                req,
                instanceId,
                timeout,
                retryInterval);
        }

        private static TimeSpan? GetTimeSpan(HttpRequestMessage request, string queryParameterName)
        {
            string queryParameterStringValue = request.RequestUri.ParseQueryString()[queryParameterName];
            if (string.IsNullOrEmpty(queryParameterStringValue))
            {
                return null;
            }

            return TimeSpan.FromSeconds(double.Parse(queryParameterStringValue));
        }
    }
}

SDK Tugas Tahan Lama menyediakan metode untuk menunggu orkestrasi selesai secara sinkron.

using Microsoft.DurableTask.Client;

// Wait for orchestration to complete with a timeout
OrchestrationMetadata metadata = await client.WaitForInstanceCompletionAsync(
    instanceId,
    timeout: TimeSpan.FromSeconds(30),
    getInputsAndOutputs: true);

if (metadata.RuntimeStatus == OrchestrationRuntimeStatus.Completed)
{
    Console.WriteLine($"Output: {metadata.SerializedOutput}");
}

Panggil fungsi dengan baris berikut. Gunakan dua detik untuk batas waktu dan 0,5 detik untuk interval coba lagi:

curl -X POST "http://localhost:7071/orchestrators/E1_HelloSequence/wait?timeout=2&retryInterval=0.5"

Nota

Perintah cURL di atas mengasumsikan Anda memiliki fungsi orkestrator bernama E1_HelloSequence dalam proyek Anda. Karena bagaimana fungsi pemicu HTTP ditulis, Anda dapat menggantinya dengan nama fungsi orkestrator apa pun dalam proyek Anda.

Tergantung pada waktu yang diperlukan untuk mendapatkan respons dari instans orkestrasi, ada dua kasus:

  • Instans orkestrasi selesai dalam batas waktu yang ditentukan (dalam hal ini dua detik), dan responsnya adalah output instans orkestrasi aktual, dikirimkan secara sinkron:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:14:29 GMT
Transfer-Encoding: chunked

[
    "Hello Tokyo!",
    "Hello Seattle!",
    "Hello London!"
]
  • Instans orkestrasi tidak dapat diselesaikan dalam batas waktu yang ditentukan, dan responsnya adalah default yang dijelaskan dalam penemuan URL API HTTP:
HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:13:51 GMT
Location: http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}
Retry-After: 10
Transfer-Encoding: chunked

{
    "id": "d3b72dddefce4e758d92f4d411567177",
    "sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/raiseEvent/{eventName}?taskHub={taskHub}&connection={connection}&code={systemKey}",
    "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}",
    "terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/terminate?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
    "suspendPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/suspend?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
    "resumePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/resume?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}"
}

Nota

Format URL webhook mungkin berbeda, tergantung pada versi host Azure Functions mana yang Anda jalankan. Contoh sebelumnya adalah untuk host Azure Functions 3.0.

Mengambil URL webhook manajemen HTTP untuk instans orkestrasi

Gunakan sistem eksternal untuk memantau atau menaikkan peristiwa ke orkestrasi. Sistem eksternal berkomunikasi dengan Durable Functions melalui URL webhook yang merupakan bagian dari respons default yang dijelaskan dalam penemuan URL API HTTP. URL webhook dapat diakses secara terprogram menggunakan pengikatan klien orkestrasi. Secara khusus, API payload buat manajemen HTTP mendapatkan objek yang dapat diserialisasikan yang berisi URL webhook ini.

API pembuatan payload manajemen HTTP memiliki satu parameter:

  • ID Instans: ID unik instans.

Metode mengembalikan objek dengan properti string berikut:

  • Id: ID instans orkestrasi (harus sama dengan InstanceId input).
  • StatusQueryGetUri: URL status instance dari orkestrasi.
  • SendEventPostUri: URL "memicu peristiwa" dari instans orkestrasi.
  • TerminatePostUri: URL "menghentikan" dari instans orkestrasi.
  • PurgeHistoryDeleteUri: URL "hapus riwayat" untuk instans orkestrasi.
  • SuspendPostUri: URL "suspend" untuk instans orkestrasi.
  • ResumePostUri: URL "lanjutkan" instans orkestrasi.

Fungsi mengirim instans objek ini ke sistem eksternal untuk memantau atau memicu peristiwa pada orkestrasi yang sesuai, seperti yang terlihat pada contoh berikut.

[FunctionName("SendInstanceInfo")]
public static void SendInstanceInfo(
    [ActivityTrigger] IDurableActivityContext ctx,
    [DurableClient] IDurableOrchestrationClient client,
    [CosmosDB(
        databaseName: "MonitorDB",
        containerName: "HttpManagementPayloads",
        Connection = "CosmosDBConnectionSetting")]out dynamic document)
{
    HttpManagementPayload payload = client.CreateHttpManagementPayload(ctx.InstanceId);

    // send the payload to Azure Cosmos DB
    document = new { Payload = payload, id = ctx.InstanceId };
}

Nota

Kode C# sebelumnya menggunakan model dalam proses dengan IDurableOrchestrationClient dan IDurableActivityContext, yang ditandai sebagai usang dalam versi ekstensi Durable Functions yang lebih baru. Untuk proyek .NET baru, pertimbangkan untuk menggunakan model pekerja terisolasi .NET dengan DurableTaskClient. Untuk informasi selengkapnya, lihat artikel versi Durable Functions .

Instans orkestrasi memutar ulang

Jika Anda mengalami kegagalan orkestrasi karena alasan yang tidak terduga, gulung balik instans ke keadaan sehat sebelumnya dengan menggunakan API yang dibangun untuk tujuan tersebut.

Nota

API ini tidak dimaksudkan untuk menjadi pengganti penanganan kesalahan yang tepat dan kebijakan coba lagi. Sebaliknya, ini dimaksudkan untuk digunakan hanya dalam situasi di mana instans orkestrasi mengalami kegagalan karena alasan yang tidak terduga. Orkestrasi dalam status selain Failed (misalnya, Running, Pending, Terminated, atau Completed) tidak dapat "diulang". Untuk informasi selengkapnya tentang penanganan kesalahan dan kebijakan coba lagi, lihat artikel Penanganan kesalahan .

Gunakan metode RewindAsync (.NET) atau rewind (JavaScript) dari metode orchestration client binding untuk menempatkan orkestrasi kembali ke Running status. Metode ini juga menjalankan ulang aktivitas atau kegagalan eksekusi suborkestrasi yang menyebabkan kegagalan orkestrasi.

Misalnya, Anda memiliki alur kerja yang melibatkan serangkaian persetujuan manusia. Misalkan serangkaian fungsi aktivitas memberi tahu seseorang bahwa persetujuan mereka diperlukan dan menunggu tanggapan secara real-time. Setelah semua aktivitas persetujuan menerima respons atau waktu habis, misalkan aktivitas lain gagal karena kesalahan konfigurasi aplikasi, seperti string koneksi basis data yang tidak valid. Hasilnya adalah kegagalan orkestrasi jauh ke dalam alur kerja. Dengan API RewindAsync (.NET) atau rewind (JavaScript), admin aplikasi dapat memperbaiki kesalahan konfigurasi dan memutar balik orkestrasi yang gagal kembali ke status segera sebelum kegagalan. Tidak ada langkah-langkah interaksi manusia yang perlu disetujui kembali, dan orkestrasi sekarang dapat berhasil diselesaikan.

Nota

Fitur rewind tidak mendukung pengulangan mundur instans orkestrasi yang menggunakan penjadwal tahan lama.

[FunctionName("RewindInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("rewind-queue")] string instanceId)
{
    string reason = "Orchestrator failed and needs to be revived.";
    return client.RewindAsync(instanceId, reason);
}

Nota

Kode C# sebelumnya menggunakan model dalam proses dengan IDurableOrchestrationClient, yang ditandai sebagai usang dalam versi ekstensi Durable Functions yang lebih baru. Untuk proyek .NET baru, pertimbangkan untuk menggunakan model pekerja terisolasi .NET dengan DurableTaskClient. Untuk informasi selengkapnya, lihat artikel versi Durable Functions .

using Microsoft.DurableTask.Client;

string reason = "Orchestrator failed and needs to be revived.";
await client.RewindInstanceAsync(instanceId, reason);

Memulai ulang instans orkestrasi

Memulai ulang orkestrasi membuat instans baru menggunakan riwayat instans yang dijalankan sebelumnya. Fitur ini berguna ketika Anda ingin menjalankan ulang orkestrasi dengan pola ID input dan instans yang sama, membuat eksekusi baru berdasarkan aslinya.

[FunctionName("RestartInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("restart-queue")] string instanceId)
{
    return client.RestartAsync(instanceId, restartWithNewInstanceId: true);
}

Nota

Kode C# sebelumnya menggunakan model dalam proses dengan IDurableOrchestrationClient, yang ditandai sebagai usang dalam versi ekstensi Durable Functions yang lebih baru. Untuk proyek .NET baru, pertimbangkan untuk menggunakan model pekerja terisolasi .NET dengan DurableTaskClient. Untuk informasi selengkapnya, lihat artikel versi Durable Functions .

using Microsoft.DurableTask.Client;

// Restart an orchestration with a new instance ID
string newInstanceId = await client.RestartInstanceAsync(instanceId, restartWithNewInstanceId: true);
Console.WriteLine($"Restarted as new instance: {newInstanceId}");

// Restart an orchestration keeping the same instance ID
await client.RestartInstanceAsync(instanceId, restartWithNewInstanceId: false);

Menghapus riwayat instans orkestrasi

Untuk menghapus semua data yang terkait dengan orkestrasi, bersihkan riwayat instans. Misalnya, hapus sumber daya penyimpanan apa pun yang terkait dengan instans yang telah selesai. Gunakan API instans pembersihan yang ditentukan oleh klien orkestrasi.

Contoh berikut menunjukkan cara memurnikan satu instans orkestrasi.

[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("purge-queue")] string instanceId)
{
    return client.PurgeInstanceHistoryAsync(instanceId);
}
using Microsoft.DurableTask.Client;

// Purge a single orchestration instance
PurgeResult result = await client.PurgeInstanceAsync(instanceId);
Console.WriteLine($"Purged {result.PurgedInstanceCount} instance(s).");

Contoh berikut menunjukkan fungsi yang dipicu oleh timer yang menghapus riwayat untuk semua instans orkestrasi yang selesai setelah jangka waktu yang ditentukan. Dalam hal ini, sistem menghapus data untuk semua instans yang telah selesai 30 hari atau lebih yang lalu. Contoh fungsi ini dijadwalkan berjalan sekali per hari, pada pukul 12.00 UTC:

[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [TimerTrigger("0 0 12 * * *")] TimerInfo myTimer)
{
    return client.PurgeInstanceHistoryAsync(
        DateTime.MinValue,
        DateTime.UtcNow.AddDays(-30),  
        new List<OrchestrationStatus>
        {
            OrchestrationStatus.Completed
        });
}

Nota

Kode C# sebelumnya menggunakan model dalam proses dengan IDurableOrchestrationClient, yang ditandai sebagai usang dalam versi ekstensi Durable Functions yang lebih baru. Untuk proyek .NET baru, pertimbangkan untuk menggunakan model pekerja terisolasi .NET dengan DurableTaskClient. Untuk informasi selengkapnya, lihat artikel versi Durable Functions .

using Microsoft.DurableTask.Client;

// Purge completed instances older than 30 days
var filter = new PurgeInstancesFilter(
    CreatedFrom: DateTime.MinValue,
    CreatedTo: DateTime.UtcNow.AddDays(-30),
    Statuses: new[] { OrchestrationRuntimeStatus.Completed });

PurgeResult result = await client.PurgeAllInstancesAsync(filter);
Console.WriteLine($"Purged {result.PurgedInstanceCount} instance(s).");

Nota

Agar operasi riwayat penghapusan menyeluruh berhasil, status runtime instans target harus Diselesaikan, Dihentikan, atau Gagal.

Langkah berikutnya