Bagikan melalui


Mengelola instans di Durable Functions di Azure

Orkestrasi dalam Durable Functions adalah fungsi stateful yang berlangsung lama dan dapat dijalankan, diquery, ditunda, dilanjutkan, serta dihentikan menggunakan API manajemen bawaan. Beberapa API manajemen instans lainnya juga diekspos oleh pengikatan klien orkestrasi Durable Functions, seperti mengirim peristiwa eksternal ke instans, membersihkan riwayat instans, dll. Artikel ini masuk ke detail semua operasi manajemen instans yang didukung.

Memulai instance

Metode start-new (atau schedule-new) pada pengikatan klien orkestrasi memulai instans orkestrasi baru. Secara internal, metode ini menulis pesan melalui penyedia penyimpanan Durable Functions lalu kembali. Pesan ini secara asinkron memicu dimulainya fungsi orkestrasi dengan nama yang ditentukan.

Parameter untuk memulai instans orkestrasi baru adalah sebagai berikut:

  • 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 instance non-acak adalah ketika ID harus berasal dari sumber eksternal, yaitu saat Anda menerapkan pola orkestrator singleton.

Kode berikut adalah contoh fungsi yang 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 adalah untuk Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan atribut OrchestrationClient alih-alih DurableClient, dan Anda harus menggunakan tipe parameter DurableOrchestrationClient alih-alih IDurableOrchestrationClient. Untuk informasi selengkapnya tentang perbedaan antar versi, lihat artikel versi Durable Functions .

Azure Functions Core Tools (Alat Inti Fungsi Azure)

Anda juga dapat memulai instans secara langsung dengan menggunakan func durable start-new perintah di Core Tools, yang mengambil parameter berikut:

  • function-name (wajib): Nama fungsi yang akan dimulai.
  • input (opsional): Input ke fungsi, baik sebaris atau melalui file JSON. Untuk file, tambahkan awalan pada jalur file dengan @, seperti @path/to/file.json.
  • id (opsional): ID instance orkestrasi. Jika Anda tidak menentukan parameter ini, perintah menggunakan GUID acak.
  • connection-string-setting (opsional): Nama pengaturan aplikasi yang berisi string koneksi penyimpanan yang akan digunakan. Defaultnya adalah AzureWebJobsStorage.
  • task-hub-name (opsional): Nama hub tugas Durable Functions yang akan digunakan. Defaultnya adalah DurableFunctionsHub. Anda juga dapat mengatur ini di host.json dengan menggunakan durableTask:HubName.

Nota

Perintah Core Tools mengasumsikan Anda menjalankannya dari direktori akar aplikasi fungsi. Jika Anda secara eksplisit menyediakan connection-string-setting parameter dan task-hub-name , Anda dapat menjalankan perintah dari direktori apa pun. Meskipun Anda dapat menjalankan perintah ini tanpa host aplikasi fungsi yang sedang berjalan, Anda mungkin menemukan bahwa Anda tidak dapat mengamati beberapa efek kecuali host aplikasi fungsi tersebut berjalan. Misalnya, perintah start-new mengantre pesan mulai ke hub tugas target, tetapi orkestrasi tidak benar-benar berjalan kecuali ada proses host aplikasi fungsi yang berjalan untuk memproses pesan.

Nota

Perintah Core Tools saat ini hanya didukung saat menggunakan penyedia Azure Storage default untuk mempertahankan status runtime.

Perintah berikut memulai fungsi bernama HelloWorld, dan meneruskan konten file counter-data.json ke dalamnya:

func durable start-new --function-name HelloWorld --input @counter-data.json --task-hub-name TestTaskHub

Instans kueri

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

Metode get-status pada pengikatan klien orkestrasi memeriksa 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 akan 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 ketika orkestrasi terakhir kali melakukan checkpoint.
  • Input: Input fungsi sebagai nilai JSON. Bidang ini tidak diisi jika showInput salah.
  • CustomStatus: Status orkestrasi kustom dalam format JSON.
  • Output: Output fungsi sebagai nilai JSON (jika fungsi telah 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 telah dijadwalkan tetapi belum mulai berjalan.
    • Berjalan: Instans telah mulai berjalan.
    • Selesai: Instans telah selesai secara normal.
    • ContinuedAsNew: Instans telah memulai ulang dirinya sendiri dengan riwayat baru. Status ini adalah status sementara.
    • Gagal: Instans gagal dengan kesalahan.
    • Dihentikan: Instance dihentikan dengan mendadak.
    • Ditangguhkan: Instans telah dihentikan sementara dan dapat dilanjutkan kembali pada waktu yang akan datang.
  • Riwayat: Riwayat pelaksanaan orkestrasi. Bidang ini hanya diisi jika showHistory diatur ke true.

Nota

Orkestrator tidak ditandai sebagai Completed sampai semua tugas terjadwalnya selesai dan orkestrator telah kembali. Dengan kata lain, tidak cukup bagi orkestrator untuk mencapai pernyataannya return agar ditandai sebagai Completed. Ini sangat relevan untuk kasus di mana WhenAny digunakan; pengatur orkestrasi tersebut sering return sebelum semua tugas terjadwal 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 adalah untuk Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan atribut OrchestrationClient alih-alih DurableClient, dan Anda harus menggunakan tipe parameter DurableOrchestrationClient alih-alih IDurableOrchestrationClient. Untuk informasi selengkapnya tentang perbedaan antar versi, lihat artikel versi Durable Functions .

Azure Functions Core Tools (Alat Inti Fungsi Azure)

Dimungkinkan juga untuk mendapatkan status instans orkestrasi secara langsung dengan menggunakan func durable get-runtime-status perintah di Core Tools.

Nota

Perintah Core Tools saat ini hanya didukung saat menggunakan penyedia Azure Storage default untuk mempertahankan status runtime.

Perintah durable get-runtime-status mengambil parameter berikut:

  • id (wajib): ID instans orkestrasi.
  • show-input (opsional): Jika diatur ke true, respons berisi input fungsi. Nilai defaultnya adalah false.
  • show-output (opsional): Jika diatur ke true, respons berisi output fungsi. Nilai defaultnya adalah false.
  • connection-string-setting (opsional): Nama pengaturan aplikasi yang berisi string koneksi penyimpanan yang akan digunakan. Defaultnya adalah AzureWebJobsStorage.
  • task-hub-name (opsional): Nama hub tugas Durable Functions yang akan digunakan. Defaultnya adalah DurableFunctionsHub. Ini juga dapat diatur dalam host.json, dengan menggunakan durableTask:HubName.

Perintah berikut mengambil status (termasuk input dan output) dari sebuah instans dengan ID instans orkestrasi 0ab8c55a6664d68a3a8b220b12d209c. Ini mengasumsikan bahwa Anda menjalankan perintah func dari direktori root aplikasi fungsi.

func durable get-runtime-status --id 0ab8c55a66644d68a3a8b220b12d209c --show-input true --show-output true

Anda dapat menggunakan durable get-history perintah untuk mengambil riwayat instans orkestrasi. Prosedur ini membutuhkan parameter berikut:

  • id (wajib): ID instans orkestrasi.
  • connection-string-setting (opsional): Nama pengaturan aplikasi yang berisi string koneksi penyimpanan yang akan digunakan. Defaultnya adalah AzureWebJobsStorage.
  • task-hub-name (opsional): Nama hub tugas Durable Functions yang akan digunakan. Defaultnya adalah DurableFunctionsHub. Ini juga dapat diatur dalam host.json, dengan menggunakan durableTask:HubName.
func durable get-history --id 0ab8c55a66644d68a3a8b220b12d209c

Melakukan kueri pada semua instance

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 adalah untuk Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan atribut OrchestrationClient alih-alih DurableClient, dan Anda harus menggunakan tipe parameter DurableOrchestrationClient alih-alih IDurableOrchestrationClient. Untuk informasi selengkapnya tentang perbedaan antar versi, lihat artikel versi Durable Functions .

Azure Functions Core Tools (Alat Inti Fungsi Azure)

Dimungkinkan juga untuk mengkueri instans secara langsung, dengan menggunakan func durable get-instances perintah di Core Tools.

Nota

Perintah Core Tools saat ini hanya didukung saat menggunakan penyedia Azure Storage default untuk mempertahankan status runtime.

Perintah durable get-instances mengambil parameter berikut:

  • top (opsional): Perintah ini mendukung penelusuran halaman. Parameter ini sesuai dengan jumlah instans yang diperoleh per permintaan. Nilai default adalah 10.
  • continuation-token (opsional): Token untuk menunjukkan halaman atau bagian instans mana yang akan diambil. Setiap get-instances eksekusi mengembalikan token ke kumpulan instans berikutnya.
  • connection-string-setting (opsional): Nama pengaturan aplikasi yang berisi string koneksi penyimpanan yang akan digunakan. Defaultnya adalah AzureWebJobsStorage.
  • task-hub-name (opsional): Nama hub tugas Durable Functions yang akan digunakan. Defaultnya adalah DurableFunctionsHub. Ini juga dapat diatur dalam host.json, dengan menggunakan durableTask:HubName.
func durable get-instances

Instans kueri dengan filter

Bagaimana jika Anda tidak benar-benar memerlukan semua informasi yang dapat diberikan kueri instans standar? Misalnya, bagaimana jika Anda hanya mencari waktu pembuatan orkestrasi, atau status waktu jalan orkestrasi? Anda bisa mempersempit 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 day(s) 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 adalah untuk Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan atribut OrchestrationClient alih-alih DurableClient, dan Anda harus menggunakan tipe parameter DurableOrchestrationClient alih-alih IDurableOrchestrationClient. Untuk informasi selengkapnya tentang perbedaan antar versi, lihat artikel versi Durable Functions .

Azure Functions Core Tools (Alat Inti Fungsi Azure)

Di Azure Functions Core Tools, Anda juga dapat menggunakan durable get-instances perintah dengan filter. Selain parameter top, continuation-token, connection-string-setting, dan task-hub-name yang disebutkan sebelumnya, Anda dapat menggunakan tiga parameter filter (created-after, created-before, dan runtime-status).

Nota

Perintah Core Tools saat ini hanya didukung saat menggunakan penyedia Azure Storage default untuk mempertahankan status runtime.

Berikut ini adalah parameter untuk durable get-instances perintah .

  • created-after (opsional): Ambil instans yang dibuat setelah tanggal/waktu ini (UTC). Tanggalwaktu berformat ISO 8601 diterima.
  • created-before (opsional): Ambil instans yang dibuat sebelum tanggal/waktu (UTC) ini. Tanggalwaktu berformat ISO 8601 diterima.
  • runtime-status (opsional): Ambil instans dengan status tertentu (misalnya, berjalan atau selesai). Dapat menyediakan beberapa status (dipisahkan spasi).
  • top (opsional): Jumlah instance yang diambil setiap permintaan. Nilai default adalah 10.
  • continuation-token (opsional): Token untuk menunjukkan halaman atau bagian instans mana yang akan diambil. Setiap proses eksekusi get-instances mengembalikan token ke set instans berikutnya.
  • connection-string-setting (opsional): Nama pengaturan aplikasi yang berisi string koneksi penyimpanan yang akan digunakan. Defaultnya adalah AzureWebJobsStorage.
  • task-hub-name (opsional): Nama hub tugas Durable Functions yang akan digunakan. Defaultnya adalah DurableFunctionsHub. Ini juga dapat diatur dalam host.json, dengan menggunakan durableTask:HubName.

Jika Anda tidak menyediakan filter apa pun (created-after, , created-beforeatau runtime-status), perintah hanya mengambil top instans, tanpa memperhatikan status runtime atau waktu pembuatan.

func durable get-instances --created-after 2021-03-10T13:57:31Z --created-before  2021-03-10T23:59Z --top 15

Mengakhiri instans

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

Dua parameter untuk API yang dihentikan adalah ID instans dan string alasan , yang ditulis 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 adalah untuk Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan atribut OrchestrationClient alih-alih DurableClient, dan Anda harus menggunakan tipe parameter DurableOrchestrationClient alih-alih IDurableOrchestrationClient. Untuk informasi selengkapnya tentang perbedaan antar versi, lihat artikel versi Durable Functions .

Instans yang dihentikan pada akhirnya akan beralih ke status Terminated . Namun, transisi ini tidak akan segera terjadi. Sebaliknya, operasi penghentian akan 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 akan terus berjalan hingga selesai, terlepas dari apakah Anda telah menghentikan instans orkestrasi yang memanggilnya.

Menangguhkan dan Melanjutkan instance

Menangguhkan orkestrasi memungkinkan Anda menghentikan orkestrasi yang sedang berjalan. Tidak seperti penghentian, Anda memiliki opsi untuk memulai kembali orkestrator yang ditangguhkan di kemudian waktu.

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

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

Ketika orkestrator dilanjutkan setelah ditangguhkan, statusnya akan berubah kembali menjadi Running.

Azure Functions Core Tools (Alat Inti Fungsi Azure)

Anda juga dapat mengakhiri instans orkestrasi secara langsung, dengan menggunakan func durable terminate perintah di Core Tools.

Nota

Perintah Core Tools saat ini hanya didukung saat menggunakan penyedia Azure Storage default untuk mempertahankan status runtime.

Perintah durable terminate mengambil parameter berikut:

  • id (wajib): ID instans orkestrasi untuk dihentikan.
  • reason (opsional): Alasan penghentian.
  • connection-string-setting (opsional): Nama pengaturan aplikasi yang berisi string koneksi penyimpanan yang akan digunakan. Defaultnya adalah AzureWebJobsStorage.
  • task-hub-name (opsional): Nama hub tugas Durable Functions yang akan digunakan. Defaultnya adalah DurableFunctionsHub. Ini juga dapat diatur dalam host.json, dengan menggunakan durableTask:HubName.

Perintah berikut mengakhiri instans orkestrasi dengan ID 0ab8c55a6664d68a3a8b220b12d209c:

func durable terminate --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Found a bug"

Mengirim event ke instans

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

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

Parameter untuk peristiwa kenaikan adalah sebagai berikut:

  • 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 adalah untuk Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan atribut OrchestrationClient alih-alih DurableClient, dan Anda harus menggunakan tipe parameter DurableOrchestrationClient alih-alih IDurableOrchestrationClient. Untuk informasi selengkapnya tentang perbedaan antar versi, lihat artikel versi Durable Functions .

Nota

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

Azure Functions Core Tools (Alat Inti Fungsi Azure)

Anda juga dapat menaikkan peristiwa ke instans orkestrasi secara langsung, dengan menggunakan func durable raise-event perintah di Core Tools.

Nota

Perintah Core Tools saat ini hanya didukung saat menggunakan penyedia Azure Storage default untuk mempertahankan status runtime.

Perintah durable raise-event mengambil parameter berikut:

  • id (wajib): ID instans orkestrasi.
  • event-name: Nama acara yang akan dinaikkan.
  • event-data (opsional): Data untuk dikirim ke instans orkestrasi. Ini bisa menjadi jalur ke file JSON, atau Anda dapat memberikan data langsung pada baris perintah.
  • connection-string-setting (opsional): Nama pengaturan aplikasi yang berisi string koneksi penyimpanan yang akan digunakan. Defaultnya adalah AzureWebJobsStorage.
  • task-hub-name (opsional): Nama hub tugas Durable Functions yang akan digunakan. Defaultnya adalah DurableFunctionsHub. Ini juga dapat diatur dalam host.json, dengan menggunakan durableTask:HubName.
func durable raise-event --id 0ab8c55a66644d68a3a8b220b12d209c --event-name MyEvent --event-data @eventdata.json
func durable raise-event --id 1234567 --event-name MyOtherEvent --event-data 3

Tunggu penyelesaian orkestrasi

Dalam orkestrasi yang berjalan lama, Anda mungkin ingin menunggu dan mendapatkan hasil orkestrasi. Dalam kasus ini, juga berguna untuk dapat menentukan periode batas waktu pada orkestrasi. Jika batas waktu telah terlampaui, status orkestrasi harus dikembalikan alih-alih mengembalikan hasilnya.

API "tunggu penyelesaian atau buat respons status pemeriksaan" dapat digunakan untuk mendapatkan output aktual dari instans orkestrasi secara sinkron. Secara default, metode ini memiliki batas waktu default 10 detik dan interval polling 1 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));
        }
    }
}

Panggil fungsi dengan baris berikut. Gunakan 2 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 2 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.

Memperoleh URL webhook manajemen HTTP

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

API pembuatan payload manajemen HTTP memiliki satu parameter:

  • Instance ID: ID unik instance.

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 "tangguhkan" instans orkestrasi.
  • resumePostUri: URL melanjutkan instans orkestrasi.

Fungsi dapat mengirim instans objek ini ke sistem eksternal untuk memantau atau menaikkan peristiwa pada orkestrasi yang sesuai, seperti yang ditunjukkan dalam 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 adalah untuk Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan DurableActivityContext alih-alih IDurableActivityContext, Anda harus menggunakan OrchestrationClient atribut alih-alih DurableClient atribut, dan Anda harus menggunakan DurableOrchestrationClient jenis parameter alih-alih IDurableOrchestrationClient. Untuk informasi selengkapnya tentang perbedaan antar versi, lihat artikel versi Durable Functions .

Memutar kembali instans (pratinjau)

Jika Anda mengalami kegagalan orkestrasi karena alasan yang tidak terduga, Anda dapat memutar 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 kasus di mana instans orkestrasi gagal karena alasan yang tidak terduga. Orkestrasi dalam status selain Failed (misalnya, Running, Pending, Terminated, Completed) tidak dapat "diulang". Untuk informasi selengkapnya tentang penanganan kesalahan dan kebijakan coba lagi, lihat artikel Penanganan kesalahan .

RewindAsync Gunakan metode (.NET) atau rewind (JavaScript) dari pengikatan klien orkestrasi untuk menempatkan orkestrasi kembali ke status Berjalan. Metode ini juga akan menjalankan kembali aktivitas atau kegagalan eksekusi sub-orkestrasi yang menyebabkan kegagalan orkestrasi.

Misalnya, Anda memiliki alur kerja yang melibatkan serangkaian persetujuan manusia. Misalkan ada serangkaian fungsi aktivitas yang memberi tahu seseorang bahwa persetujuan mereka diperlukan, dan tunggu respons real-time. Setelah semua aktivitas persetujuan menerima respons atau waktu habis, misalkan aktivitas lain gagal karena kesalahan konfigurasi aplikasi, seperti string koneksi database yang tidak valid. Hasilnya adalah kegagalan orkestrasi jauh ke dalam alur kerja. RewindAsync Dengan API (.NET) atau rewind (JavaScript), administrator 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 adalah untuk Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan atribut OrchestrationClient alih-alih DurableClient, dan Anda harus menggunakan tipe parameter DurableOrchestrationClient alih-alih IDurableOrchestrationClient. Untuk informasi selengkapnya tentang perbedaan antar versi, lihat artikel versi Durable Functions .

Azure Functions Core Tools (Alat Inti Fungsi Azure)

Anda juga dapat mengulang kembali instans orkestrasi secara langsung dengan menggunakan perintah func durable rewind di Core Tools.

Nota

Perintah Core Tools saat ini hanya didukung saat menggunakan penyedia Azure Storage default untuk mempertahankan status runtime.

Perintah durable rewind mengambil parameter berikut:

  • id (wajib): ID instans orkestrasi.
  • reason (opsional): Alasan untuk memutar balik instans orkestrasi.
  • connection-string-setting (opsional): Nama pengaturan aplikasi yang berisi string koneksi penyimpanan yang akan digunakan. Defaultnya adalah AzureWebJobsStorage.
  • task-hub-name (opsional): Nama hub tugas Durable Functions yang akan digunakan. Secara default, nama hub tugas dalam file host.json digunakan.
func durable rewind --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Orchestrator failed and needs to be revived."

Hapus riwayat instance

Untuk menghapus semua data yang terkait dengan orkestrasi, Anda dapat menghapus riwayat instans. Misalnya, Anda mungkin ingin menghapus sumber daya penyimpanan apa pun yang terkait dengan instans yang telah selesai. Untuk melakukannya, gunakan API hapus instans yang didefinisikan oleh klien orkestrasi.

Contoh pertama ini menunjukkan cara membersihkan instance orkestrasi tunggal.

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

Contoh berikutnya menunjukkan fungsi yang dipicu oleh timer untuk menghapus riwayat secara menyeluruh untuk semua instans orkestrasi yang telah selesai setelah interval 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 adalah untuk Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan atribut OrchestrationClient alih-alih DurableClient, dan Anda harus menggunakan tipe parameter DurableOrchestrationClient alih-alih IDurableOrchestrationClient. Untuk informasi selengkapnya tentang perbedaan antar versi, lihat artikel versi Durable Functions .

Nota

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

Azure Functions Core Tools (Alat Inti Fungsi Azure)

Anda dapat menghapus riwayat instance orkestrasi dengan menggunakan perintah func durable purge-history di Core Tools. Mirip dengan contoh C# kedua di bagian sebelumnya, ini menghapus riwayat untuk semua instans orkestrasi yang dibuat selama interval waktu yang ditentukan. Anda selanjutnya dapat memfilter instans yang dibersihkan berdasarkan status runtime.

Nota

Perintah Core Tools saat ini hanya didukung saat menggunakan penyedia Azure Storage default untuk mempertahankan status runtime.

Perintah durable purge-history memiliki beberapa parameter:

  • created-after (opsional): Hapus menyeluruh riwayat instans yang dibuat setelah tanggal/waktu (UTC) ini. Tanggalwaktu berformat ISO 8601 diterima.
  • created-before (opsional): Hapus menyeluruh riwayat instans yang dibuat sebelum tanggal/waktu (UTC) ini. Tanggalwaktu berformat ISO 8601 diterima.
  • runtime-status (opsional): Hapus menyeluruh riwayat instans dengan status tertentu (misalnya, berjalan atau selesai). Dapat menyediakan beberapa status (dipisahkan spasi).
  • connection-string-setting (opsional): Nama pengaturan aplikasi yang berisi string koneksi penyimpanan yang akan digunakan. Defaultnya adalah AzureWebJobsStorage.
  • task-hub-name (opsional): Nama hub tugas Durable Functions yang akan digunakan. Secara default, nama hub tugas dalam file host.json digunakan.

Perintah berikut menghapus riwayat semua instans yang gagal yang dibuat sebelum 14 November 2021 pukul 19.35 (UTC).

func durable purge-history --created-before 2021-11-14T19:35:00.0000000Z --runtime-status failed

Menghapus hub tugas

func durable delete-task-hub Dengan menggunakan perintah di Core Tools, Anda dapat menghapus semua artefak penyimpanan yang terkait dengan hub tugas tertentu, termasuk tabel penyimpanan Azure, antrean, dan blob.

Nota

Perintah Core Tools saat ini hanya didukung saat menggunakan penyedia Azure Storage default untuk mempertahankan status runtime.

Perintah durable delete-task-hub memiliki dua parameter:

  • connection-string-setting (opsional): Nama pengaturan aplikasi yang berisi string koneksi penyimpanan yang akan digunakan. Defaultnya adalah AzureWebJobsStorage.
  • task-hub-name (opsional): Nama hub tugas Durable Functions yang akan digunakan. Secara default, nama hub tugas dalam file host.json digunakan.

Perintah berikut menghapus semua Azure penyimpanan data yang dihubungkan dengan hub tugas UserTest.

func durable delete-task-hub --task-hub-name UserTest

Langkah selanjutnya