Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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) lalu mengembalikannya. Pesan ini secara asinkron memicu dimulainya orkestrasi dengan nama yang ditentukan.
Berikut adalah parameter untuk memulai instans orkestrasi baru:
Penting
Dukungan akan berakhir untuk model dalam proses pada 10 November 2026. Kami sangat menyarankan agar Anda memindahkan aplikasi Anda ke model pekerja terisolasi untuk dukungan penuh.
| Parameter | Description |
|---|---|
| Name | Nama fungsi orchestrator yang akan dijadwalkan. |
| Input | Data apa pun yang dapat diserialisasi ke JSON yang perlu diteruskan sebagai input untuk fungsi orkestrator. |
| InstanceId | (Opsional) ID unik dari instance tersebut. 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 .
| Parameter | Description |
|---|---|
| Name | Nama orkestrasi yang akan dijadwalkan. |
| Input | Data apa pun yang dapat diserialisasi ke format JSON yang akan diteruskan sebagai input ke orkestrasi. |
| InstanceId | (Opsional) ID unik dari instance tersebut. 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:
Model pekerja terisolasi
[Function("HelloWorldQueueTrigger")]
public static async Task Run(
[QueueTrigger("start-queue")] string input,
[DurableClient] DurableTaskClient client,
FunctionContext functionContext)
{
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync("HelloWorld", input);
functionContext.GetLogger("HelloWorldQueueTrigger")
.LogInformation("Started orchestration with ID = '{InstanceId}'.", instanceId);
}
Model dalam proses
[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}'.");
}
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 ketrue, respons berisi riwayat eksekusi. -
showHistoryOutput: Jika diatur ketrue, riwayat eksekusi berisi output aktivitas. -
showInput: Jika diatur kefalse, respons tidak berisi input fungsi. Nilai defaultnya adalahtrue.
Metode mengembalikan objek dengan properti berikut:
| Property | Description |
|---|---|
| Name | Nama fungsi orkestrator. |
| InstanceId | ID instans dari orkestrasi (harus sama dengan masukan instanceId). |
| CreatedTime | Waktu di mana fungsi orchestrator mulai berjalan. |
| LastUpdatedTime | Waktu ketika orkestrasi terakhir kali membuat checkpoint. |
| Input | Input fungsi sebagai nilai JSON. Bidang ini tidak diisi jika showInput adalah false. |
| CustomStatus | Status orkestrasi kustom dalam format JSON. |
| Output | Keluaran dari fungsi sebagai nilai JSON (jika fungsi selesai dieksekusi). 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: Tertunda | Instans sudah dijadwalkan tetapi masih belum mulai berjalan. |
| RuntimeStatus: Sedang berjalan | Instansi sedang berjalan. |
| RuntimeStatus: Selesai | Instans selesai secara normal. |
| RuntimeStatus: ContinuedAsNew | Instance tersebut memulai ulang dirinya sendiri dengan riwayat baru. Status ini adalah status sementara. |
| RuntimeStatus: Gagal | Instans tersebut gagal karena kesalahan. |
| RuntimeStatus: Dihentikan | Kejadian itu berhenti tiba-tiba. |
| RuntimeStatus: Ditangguhkan | Instans tersebut ditangguhkan dan dapat diaktifkan kembali nanti. |
| Riwayat | Sejarah eksekusi orkestrasi. Bidang ini hanya diisi jika showHistory diatur ke true. |
| Parameter | Description |
|---|---|
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 mengandung input dari orkestrasi. Nilai defaultnya adalah true. |
Metode mengembalikan objek dengan properti berikut:
| Property | Description |
|---|---|
| Name | Nama orkestrasi. |
| InstanceId | ID instance dari orkestrasi (harus sama dengan masukan instanceId). |
| CreatedTime | Waktu ketika orkestrasi mulai berjalan. |
| LastUpdatedTime | Waktu saat orkestrasi terakhir kali membuat checkpoint. |
| Input | Masukan untuk orkestrasi dalam bentuk nilai JSON. Bidang ini tidak diisi jika showInput adalah false. |
| CustomStatus | Status orkestrasi kustom dalam format JSON. |
| Output | Output dari orkestrasi sebagai nilai JSON (jika orkestrasi telah selesai). Jika orkestrasi gagal, properti ini menyertakan detail kegagalan. Jika orkestrasi ditangguhkan atau dihentikan, properti ini mencakup alasan penangguhan atau penghentian (jika ada). |
| RuntimeStatus: Menunggu | Instance ini sudah dijadwalkan tetapi belum mulai beroperasi. |
| RuntimeStatus: Sedang berjalan | Instansi sedang berjalan. |
| RuntimeStatus: Selesai | Instans telah selesai secara normal. |
| StatusRuntime: DilanjutkanSebagaiBaru | Instance tersebut memulai ulang dirinya sendiri dengan riwayat baru. Status ini adalah status sementara. |
| RuntimeStatus: Gagal | Instans tersebut gagal karena kesalahan. |
| RuntimeStatus: Dihentikan | Kejadian itu berhenti tiba-tiba. |
| RuntimeStatus: Ditangguhkan | Instans tersebut ditangguhkan dan dapat dijalankan kembali di lain waktu. |
| Riwayat | Sejarah eksekusi 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.
Model pekerja terisolasi
[Function("GetStatus")]
public static async Task Run(
[DurableClient] DurableTaskClient client,
[QueueTrigger("check-status-queue")] string instanceId)
{
OrchestrationMetadata? metadata = await client.GetInstanceAsync(
instanceId,
getInputsAndOutputs: true);
// Do something based on the current status.
}
Model dalam proses
[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.
}
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.
Model pekerja terisolasi
[Function("GetAllStatus")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData request,
[DurableClient] DurableTaskClient client,
FunctionContext functionContext)
{
ILogger logger = functionContext.GetLogger("GetAllStatus");
AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(
new OrchestrationQuery());
await foreach (OrchestrationMetadata instance in instances)
{
logger.LogInformation("{Instance}", instance);
}
}
Model dalam proses
[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.
}
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.
Model pekerja terisolasi
[Function("QueryStatus")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData request,
[DurableClient] DurableTaskClient client,
FunctionContext functionContext)
{
ILogger logger = functionContext.GetLogger("QueryStatus");
var query = new OrchestrationQuery
{
Statuses = new[]
{
OrchestrationRuntimeStatus.Pending,
OrchestrationRuntimeStatus.Running,
},
CreatedFrom = DateTime.UtcNow.Subtract(TimeSpan.FromDays(7)),
CreatedTo = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)),
PageSize = 100,
};
await foreach (OrchestrationMetadata instance in client.GetAllInstancesAsync(query))
{
logger.LogInformation("{Instance}", instance);
}
}
Model dalam proses
[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));
}
}
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.
Model pekerja terisolasi
[Function("TerminateInstance")]
public static Task Run(
[DurableClient] DurableTaskClient client,
[QueueTrigger("terminate-queue")] string instanceId)
{
string reason = "Found a bug";
return client.TerminateInstanceAsync(instanceId, reason);
}
Model dalam proses
[FunctionName("TerminateInstance")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("terminate-queue")] string instanceId)
{
string reason = "Found a bug";
return client.TerminateAsync(instanceId, reason);
}
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.
Model pekerja terisolasi
[Function("SuspendResumeInstance")]
public static async Task Run(
[DurableClient] DurableTaskClient client,
[QueueTrigger("suspend-resume-queue")] string instanceId)
{
// 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);
}
Model dalam proses
[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.
Model pekerja terisolasi
[Function("RaiseEvent")]
public static Task Run(
[DurableClient] DurableTaskClient client,
[QueueTrigger("event-queue")] string instanceId)
{
int[] eventData = new int[] { 1, 2, 3 };
return client.RaiseEventAsync(instanceId, "MyEvent", eventData);
}
Model dalam proses
[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);
}
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:
Model pekerja terisolasi
[Function("HttpSyncStart")]
public static async Task<HttpResponseData> Run(
[HttpTrigger(
AuthorizationLevel.Function,
"post",
Route = "orchestrators/{functionName}/wait")] HttpRequestData request,
[DurableClient] DurableTaskClient client,
string functionName)
{
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(functionName);
using var timeoutCancellation = new CancellationTokenSource(TimeSpan.FromSeconds(30));
return await client.WaitForCompletionOrCreateCheckStatusResponseAsync(
request,
instanceId,
timeoutCancellation.Token);
}
Model dalam proses
// 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
InstanceIdinput). - 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.
Model pekerja terisolasi
[Function("SendInstanceInfo")]
[CosmosDBOutput(
databaseName: "MonitorDB",
containerName: "HttpManagementPayloads",
Connection = "CosmosDBConnectionSetting")]
public static object SendInstanceInfo(
[ActivityTrigger] TaskActivityContext context,
[DurableClient] DurableTaskClient client)
{
HttpManagementPayload payload = client.CreateHttpManagementPayload(context.InstanceId);
// Send the payload to Azure Cosmos DB.
return new { Payload = payload, id = context.InstanceId };
}
Model dalam proses
[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 };
}
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.
Model pekerja terisolasi
[Function("RewindInstance")]
public static Task Run(
[DurableClient] DurableTaskClient client,
[QueueTrigger("rewind-queue")] string instanceId)
{
string reason = "Orchestrator failed and needs to be revived.";
return client.RewindInstanceAsync(instanceId, reason);
}
Model dalam proses
[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);
}
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.
Model pekerja terisolasi
[Function("RestartInstance")]
public static Task<string?> Run(
[DurableClient] DurableTaskClient client,
[QueueTrigger("restart-queue")] string instanceId)
{
return client.RestartAsync(instanceId, restartWithNewInstanceId: true);
}
Model dalam proses
[FunctionName("RestartInstance")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("restart-queue")] string instanceId)
{
return client.RestartAsync(instanceId, restartWithNewInstanceId: true);
}
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.
Model pekerja terisolasi
[Function("PurgeInstanceHistory")]
public static async Task Run(
[DurableClient] DurableTaskClient client,
[QueueTrigger("purge-queue")] string instanceId)
{
await client.PurgeInstanceAsync(instanceId);
}
Model dalam proses
[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:
Model pekerja terisolasi
[Function("PurgeInstanceHistory")]
public static async Task Run(
[DurableClient] DurableTaskClient client,
[TimerTrigger("0 0 12 * * *")] TimerInfo myTimer)
{
var filter = new PurgeInstancesFilter(
CreatedFrom: DateTime.MinValue,
CreatedTo: DateTime.UtcNow.AddDays(-30),
Statuses: new[] { OrchestrationRuntimeStatus.Completed });
await client.PurgeAllInstancesAsync(filter);
}
Model dalam proses
[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
});
}
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.