Lompati ke konten utama
Browser ini sudah tidak didukung.
Mutakhirkan ke Microsoft Edge untuk memanfaatkan fitur, pembaruan keamanan, dan dukungan teknis terkini.
Timer di Durable Functions (Azure Functions)
- Artikel
- 09/27/2022
- 5 menit untuk membaca
Dalam
artikel ini
Durable Functions menyediakan timer durable untuk digunakan dalam fungsi orkestrator untuk menerapkan penundaan atau mengatur batas waktu pada tindakan asinkron. Timer tahan lama harus digunakan dalam fungsi orkestrator alih-alih API "tidur" atau "tunda" yang mungkin dibangun ke dalam bahasa.
Timer tahan
lama adalah tugas yang dibuat menggunakan API "buat timer" yang sesuai untuk bahasa yang disediakan, seperti yang ditunjukkan di bawah, dan menggunakan waktu atau durasi sebagai argumen.
-
C#
-
JavaScript
-
Python
-
PowerShell
- Java
// Put the orchestrator to sleep for 72 hours
DateTime dueTime = context.CurrentUtcDateTime.AddHours(72);
await context.CreateTimer(dueTime, CancellationToken.None);
// Put the orchestrator to sleep for 72 hours
// Note that DateTime comes from the "luxon" module
const deadline = DateTime.fromJSDate(context.df.currentUtcDateTime, {zone: 'utc'}).plus({ hours: 72 });
yield context.df.createTimer(deadline.toJSDate());
# Put the orchestrator to sleep for 72 hours
due_time = context.current_utc_datetime + timedelta(hours=72)
durable_timeout_task = context.create_timer(due_time)
# Put the orchestrator to sleep for 72 hours
@duration = New-TimeSpan -Hours 72
Start-DurableTimer -Duration $duration
// Put the orchestrator to sleep for 72 hours
ctx.createTimer(Duration.ofHours(72)).await();
Saat Anda "menunggu" tugas timer, fungsi orkestrator akan tidur hingga waktu kedaluwarsa yang ditentukan.
Catatan
Orkestrasi akan terus memproses peristiwa masuk lainnya sambil menunggu tugas timer berakhir.
Batasan timer
Saat Anda membuat timer yang kedaluwarsa pada pukul 16:30 UTC, Kerangka Kerja Tahan
Lama yang mendasari mengantrekan pesan yang hanya terlihat pada 16:30 UTC. Jika aplikasi fungsi diturunkan skalanya ke nol instans sementara itu, pesan timer yang baru terlihat akan memastikan bahwa aplikasi fungsi diaktifkan kembali pada mesin virtual yang sesuai.
Catatan
- Dimulai dengan versi 2.3.0 dari Durable Extension, timer Durable
menjadi tidak terbatas untuk .NET apps. Untuk aplikasi JavaScript, Python, dan PowerShell, serta aplikasi .NET yang menggunakan versi ekstensi sebelumnya, timer Durable dibatasi hingga enam hari. Saat Anda menggunakan versi ekstensi yang lebih lama atau runtime bahasa non-.NET dan memerlukan penundaan lebih dari enam hari, gunakan API timer dalam satu lingkaran
while
untuk mensimulasikan penundaan yang lebih lama. - Jangan gunakan API tanggal/waktu bawaan untuk mendapatkan waktu saat
ini. Saat menghitung tanggal masa mendatang untuk timer kedaluwarsa, selalu gunakan API waktu saat ini fungsi orkestrator. Untuk informasi selengkapnya, lihat artikel batasan kode fungsi orkestrator.
Penggunaan untuk penundaan
Contoh berikut ini menggambarkan cara menggunakan
time durable untuk menunda eksekusi. Contohnya adalah menerbitkan pemberitahuan penagihan setiap hari selama 10 hari.
- C#
-
JavaScript
-
Python
-
PowerShell
- Java
[FunctionName("BillingIssuer")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
for (int i = 0; i < 10; i++)
{
DateTime deadline = context.CurrentUtcDateTime.Add(TimeSpan.FromDays(1));
await context.CreateTimer(deadline, CancellationToken.None);
await context.CallActivityAsync("SendBillingEvent");
}
}
Catatan
Contoh C# sebelumnya menargetkan Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan DurableOrchestrationContext
alih-alih IDurableOrchestrationContext
. Untuk informasi selengkapnya tentang perbedaan antara versi, lihat artikel
Versi Durable Functions.
const df = require("durable-functions");
const { DateTime } = require("luxon");
module.exports = df.orchestrator(function*(context) {
for (let i = 0; i < 10; i++) {
const deadline = DateTime.fromJSDate(context.df.currentUtcDateTime, {zone: 'utc'}).plus({ days: 1 });
yield context.df.createTimer(deadline.toJSDate());
yield context.df.callActivity("SendBillingEvent");
}
});
import azure.functions as func
import azure.durable_functions as df
from datetime import datetime, timedelta
def orchestrator_function(context: df.DurableOrchestrationContext):
for i in range(0, 9):
deadline = context.current_utc_datetime + timedelta(days=1)
yield context.create_timer(deadline)
yield context.call_activity("SendBillingEvent")
main = df.Orchestrator.create(orchestrator_function)
param($Context)
for ($num = 0 ; $num -le 9 ; $num++){
$expiryTime = New-TimeSpan -Days 1
$timerTask = Start-DurableTimer -Duration $expiryTime
Invoke-DurableActivity -FunctionName 'SendBillingEvent'
}
@FunctionName("BillingIssuer")
public String billingIssuer(
@DurableOrchestrationTrigger(name = "runtimeState") String runtimeState) {
return OrchestrationRunner.loadAndRun(runtimeState, ctx -> {
for (int i = 0; i < 10; i++) {
ctx.createTimer(Duration.ofDays(1)).await();
ctx.callActivity("SendBillingEvent").await();
}
return "done";
});
}
Peringatan
Hindari perulangan tak terbatas dalam fungsi orkestrator. Untuk informasi tentang cara menerapkan skenario perulangan tanpa batas dengan aman dan efisien, lihat
Eternal Orchestrations.
Penggunaan untuk batas waktu
Contoh ini menggambarkan cara menggunakan timer durable untuk menerapkan batas waktu.
-
C#
-
JavaScript
-
Python
-
PowerShell
- Java
[FunctionName("TryGetQuote")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
TimeSpan timeout = TimeSpan.FromSeconds(30);
DateTime deadline = context.CurrentUtcDateTime.Add(timeout);
using (var cts = new CancellationTokenSource())
{
Task activityTask = context.CallActivityAsync("GetQuote");
Task timeoutTask = context.CreateTimer(deadline, cts.Token);
Task winner = await Task.WhenAny(activityTask, timeoutTask);
if (winner == activityTask)
{
// success case
cts.Cancel();
return true;
}
else
{
// timeout case
return false;
}
}
}
Catatan
Contoh C# sebelumnya menargetkan Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan DurableOrchestrationContext
alih-alih IDurableOrchestrationContext
. Untuk informasi selengkapnya tentang perbedaan antara versi, lihat artikel
Versi Durable Functions.
const df = require("durable-functions");
const { DateTime } = require("luxon");
module.exports = df.orchestrator(function*(context) {
const deadline = DateTime.fromJSDate(context.df.currentUtcDateTime, {zone: 'utc'}).plus({ seconds: 30 });
const activityTask = context.df.callActivity("GetQuote");
const timeoutTask = context.df.createTimer(deadline.toJSDate());
const winner = yield context.df.Task.any([activityTask, timeoutTask]);
if (winner === activityTask) {
// success case
timeoutTask.cancel();
return true;
}
else
{
// timeout case
return false;
}
});
import azure.functions as func
import azure.durable_functions as df
from datetime import datetime, timedelta
def orchestrator_function(context: df.DurableOrchestrationContext):
deadline = context.current_utc_datetime + timedelta(seconds=30)
activity_task = context.call_activity("GetQuote")
timeout_task = context.create_timer(deadline)
winner = yield context.task_any([activity_task, timeout_task])
if winner == activity_task:
timeout_task.cancel()
return True
elif winner == timeout_task:
return False
main = df.Orchestrator.create(orchestrator_function)
param($Context)
$expiryTime = New-TimeSpan -Seconds 30
$activityTask = Invoke-DurableActivity -FunctionName 'GetQuote'-NoWait
$timerTask = Start-DurableTimer -Duration $expiryTime -NoWait
$winner = Wait-DurableTask -Task @($activityTask, $timerTask) -Any
if ($winner -eq $activityTask) {
Stop-DurableTimerTask -Task $timerTask
return $True
}
else {
return $False
}
@FunctionName("TryGetQuote")
public String tryGetQuote(
@DurableOrchestrationTrigger(name = "runtimeState") String runtimeState) {
return OrchestrationRunner.loadAndRun(runtimeState, ctx -> {
Task activityTask = ctx.callActivity("GetQuote");
Task timerTask = ctx.createTimer(Duration.ofSeconds(30));
Task winner = ctx.anyOf(activityTask, timerTask);
if (winner == activityTask) {
// success case
return true;
} else {
// timeout case
return false;
}
});
}
Peringatan
Di .NET, JavaScript, Python, dan PowerShell, Anda harus membatalkan timer tahan lama yang dibuat jika kode Anda tidak akan menunggu hingga selesai. Lihat contoh di atas tentang cara membatalkan timer yang tertunda. Durable Task Framework tidak akan mengubah status orkestrasi
menjadi "Selesai" hingga semua tugas yang belum selesai, termasuk tugas timer tahan lama, diselesaikan atau dibatalkan.
Mekanisme pembatalan ini menggunakan pola when-any tidak menghentikan fungsi aktivitas yang sedang berlangsung atau eksekusi suborkestrasi. Sebaliknya, itu hanya memungkinkan fungsi orkestrator untuk mengabaikan hasil dan melanjutkan. Jika aplikasi fungsi Anda menggunakan paket Konsumsi, Anda masih akan ditagihkan untuk setiap waktu dan memori yang
dikonsumsi oleh fungsi aktivitas yang ditinggalkan. Secara default, fungsi yang berjalan dalam paket Konsumsi memiliki batas waktu lima menit. Jika batas ini terlampaui, host Azure Functions didaur ulang untuk menghentikan semua eksekusi dan mencegah situasi penagihan tak terkendali. Batas waktu fungsi dapat dikonfigurasi.
Untuk contoh yang
lebih mendalam tentang cara menerapkan batas waktu dalam fungsi orkestra, lihat artikel Interaksi Manusia & Batas Waktu - Verifikasi Telepon.
Langkah berikutnya