قم بتطبيق مؤقتات متينة للتأخيرات وانتهاء الوقت

مهم

سينتهي الدعم للنموذج قيد التنفيذ في 10 نوفمبر 2026. نوصي بشدة بترحيل تطبيقاتك إلى نموذج العامل المعزول للحصول على الدعم الكامل.

يوفر Durable Functionsمؤقتات دائمة للاستخدام في وظائف التنسيق لتنفيذ التأخيرات أو لإعداد مهلات زمنية على الإجراءات غير المتزامنة. استخدم مؤقتات متينة في وظائف التنسيق بدلا من sleepdelay واجهات برمجة التطبيقات التي قد تكون مدمجة في اللغة.

توفر مجموعات تطوير المهام المتطورة مؤقتات متينة للاستخدام في التنسيقات لتنفيذ التأخيرات أو لإعداد مهلات زمنية على الإجراءات غير المتزامنة. استخدم مؤقتات متينة في التنسيقات بدلا من sleepdelay واجهات برمجة التطبيقات التي قد تكون مدمجة في اللغة.

مهم

حاليا، حزمة تطوير المهام الدائمة PowerShell غير متوفرة.

المؤقتات المتطورة هي مهام يتم إنشاؤها باستخدام واجهة برمجة التطبيقات المناسبة create timer للغة المقدمة، كما هو موضح في الأمثلة التالية، وتستغرق إما وقتا مستحقا أو مدة كوسيط.

// Put the orchestrator to sleep for 72 hours
DateTime dueTime = context.CurrentUtcDateTime.AddHours(72);
await context.CreateTimer(dueTime, CancellationToken.None);
// Put the orchestration to sleep for 72 hours
await context.CreateTimer(TimeSpan.FromHours(72), CancellationToken.None);

عند تنفيذ await مهمة المؤقت، تظل وظيفة المنسق نائمة حتى وقت انتهاء الصلاحية المحدد.

عندما تقوم await بمهمة المؤقت، يبقى التوزيع في حالة نوم حتى الوقت المحدد.

ملحوظة

تستمر الآلات الموسيقية في معالجة الأحداث الواردة الأخرى أثناء انتظار انتهاء مهمة المؤقت.

قيود المؤقت المتانة

عندما تنشئ مؤقتا ينتهي في الساعة 4:30 مساء بالتوقيت العالمي، يقوم إطار العمل الأساسي بإنشاء رسالة تظهر فقط عند الساعة 4:30 مساء بالتوقيت العالمي. إذا تم تقليل عدد الاستخدامات إلى صفر في هذه الأثناء، تضمن رسالة المؤقت المرئية الجديدة تفعيل تطبيق الوظائف مرة أخرى على آلة افتراضية مناسبة.

ملحوظة

  • بالنسبة لتطبيقات JavaScript وPython وPowerShell، فإن المؤقتات الطويلة محدودة بستة أيام فقط. لتجاوز هذا القيد، استخدم واجهات برمجة التطبيقات المؤقتة في حلقة while لمحاكاة تأخير أطول. تدعم تطبيقات .NET وJava المحدثة تطبيقات طويلة الأمد بشكل تعسفي.
  • اعتمادا على إصدار مجموعة تطوير البرمجيات ومزود التخزين المستخدم، قد يتم تنفيذ المؤقتات الطويلة التي تستمر ستة أيام أو أكثر داخليا باستخدام سلسلة من المؤقتات الأقصر (على سبيل المثال، بمدة ثلاثة أيام) حتى الوصول إلى وقت انتهاء الصلاحية المرغوب. يمكن ملاحظة هذا السلوك في مخزن البيانات الأساسي لكنه لا يؤثر على سلوك التنسيق.
  • لا تستخدم واجهات برمجة تطبيقات مدمجة للتاريخ أو الوقت للحصول على الوقت الحالي. عند حساب تاريخ مستقبلي لانتهاء المؤقت، استخدم دائما واجهة برمجة التطبيقات الحالية للوقت في وظيفة المنسق. لمزيد من المعلومات، راجع المقالة قيود رمز دالة المنسق.

عندما تنشئ مؤقتا ينتهي في الساعة 4:30 مساء بالتوقيت العالمي، يقوم إطار العمل الأساسي بإنشاء رسالة تظهر فقط عند الساعة 4:30 مساء بالتوقيت العالمي. تضمن رسالة المؤقت أن العامل ينشط مرة أخرى عند انتهاء المؤقت.

ملحوظة

  • تحديد تأخير طويل (على سبيل المثال، تأخير لبضعة أيام أو أكثر) قد يؤدي إلى إنشاء عدة مؤقتات دائمة مدارة داخليا. لا يحتاج كود التوزيع الموسيقي إلى أن يكون على علم بهذا السلوك. ومع ذلك، قد يكون مرئيا في سجلات الإطار وحالة التاريخ المخزن.
  • لا تستخدم واجهات برمجة التطبيقات المدمجة للتاريخ والوقت للحصول على الوقت الحالي. عند حساب تاريخ مستقبلي لانتهاء المؤقت، استخدم دائما خاصية الوقت الحالية لسياق التوزيع (مثل context.CurrentUtcDateTime في .NET، ctx.current_utc_datetime في Python، أو ctx.currentUtcDateTime في JavaScript).

استخدم مؤقتات متينة للتأخيرات

يوضح المثال التالي كيفية استخدام مؤقتات متينة لتأخير التنفيذ. المثال يصدر إشعار فوترة يوميا لمدة 10 أيام.

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

ملحوظة

المثال السابق من C# يستهدف Durable Functions 2.x. بالنسبة ل Durable Functions 1.x، استخدم DurableOrchestrationContext بدلا من IDurableOrchestrationContext. لمزيد من المعلومات حول الفروقات بين الإصدارات، راجع مقال Durable Functions versions.

public class BillingIssuer : TaskOrchestrator<object?, string>
{
    public override async Task<string> RunAsync(TaskOrchestrationContext context, object? input)
    {
        for (int i = 0; i < 10; i++)
        {
            await context.CreateTimer(TimeSpan.FromDays(1), CancellationToken.None);
            await context.CallActivityAsync("SendBillingEvent");
        }
        return "done";
    }
}

التحذير

تجنب الحلقات اللانهائية في وظائف الأوركستراتور. للحصول على معلومات حول كيفية تنفيذ سيناريوهات الحلقات اللانهائية بأمان وكفاءة، راجع التنسيقات الأبدية.

التحذير

تجنب الحلقات اللانهائية في التوزيعات. للحصول على معلومات حول كيفية تنفيذ سيناريوهات الحلقات اللانهائية بأمان وكفاءة، راجع التنسيقات الأبدية.

استخدم مؤقتات متينة لإيقاف الوقت

يوضح هذا المثال كيفية استخدام المؤقتات المتينة لتنفيذ المهلات:

[FunctionName("TryGetQuote")]
public static async Task<bool> 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;
        }
    }
}

ملحوظة

يستهدف المثال السابق من C# Durable Functions 2.x. بالنسبة ل Durable Functions 1.x، استخدم DurableOrchestrationContext بدلا من IDurableOrchestrationContext. لمزيد من المعلومات حول الفروقات بين الإصدارات، راجع مقال Durable Functions versions.

public class TryGetQuote : TaskOrchestrator<object?, bool>
{
    public override async Task<bool> RunAsync(TaskOrchestrationContext context, object? input)
    {
        using var cts = new CancellationTokenSource();

        Task<double> activityTask = context.CallActivityAsync<double>("GetQuote");
        Task timeoutTask = context.CreateTimer(TimeSpan.FromSeconds(30), cts.Token);

        Task winner = await Task.WhenAny(activityTask, timeoutTask);
        if (winner == activityTask)
        {
            // success case
            cts.Cancel();
            return true;
        }
        else
        {
            // timeout case
            return false;
        }
    }
}

التحذير

في .NET وJavaScript وPython وPowerShell، قم بإلغاء أي مؤقتات متينة تم إنشاؤها إذا لم ينتظر الكود حتى يكملها. راجع الأمثلة السابقة لمعرفة كيفية إلغاء المؤقتات المعلقة. إطار المهام الدائمة لا يغير حالة التوزيع إلى "مكتمل" حتى يتم إتمام أو إلغاء جميع المهام العالقة، بما في ذلك مهام المؤقتات الدائمة.

التحذير

إذا كان SDK الخاص بك يدعم إلغاء المؤقتات (مثل .NET)، قم بإلغاء أي مؤقتات دائمة تم إنشاؤها إذا لم ينتظر الكود حتى تكملها. راجع الأمثلة السابقة لمعرفة كيفية إلغاء المؤقتات المعلقة. إطار المهام الدائمة لا يغير حالة التوزيع إلى "مكتمل" حتى يتم إتمام أو إلغاء جميع المهام العالقة، بما في ذلك مهام المؤقتات الدائمة.

آلية الإلغاء هذه باستخدام نمط متى-أي لا تنهي دالة النشاط الجارية أو تنفيذ التنسيق الفرعي. بل ببساطة يسمح لوظيفة الموزع بتجاهل النتيجة والمضي قدما. إذا كان تطبيق الوظائف الخاص بك يستخدم خطة الاستهلاك، ستظل تخصم منك أي وقت وذاكرة تستهلكها وظيفة النشاط المهجور. بشكل افتراضي، الوظائف التي تعمل في خطة الاستهلاك لها مهلة زمنية مدتها خمس دقائق. إذا تم تجاوز هذا الحد، يقوم مضيف دالات Azure بإعادة التدوير لإيقاف جميع التنفيذات ومنع حدوث حالة فوترة مفرطة. مهلة الوظيفة قابلة للتكوين.

للحصول على مثال أكثر تفصيلا حول كيفية تنفيذ المهمات المنفصلة في وظائف المنسق، راجع مقالة التفاعل البشري .

آلية الإلغاء هذه باستخدام نمط متى-أي لا تنهي النشاط الجاري أو تنفيذ التوزيع الفرعي. بل ببساطة يسمح للتوزيع الموسيقي بتجاهل النتيجة والمضي قدما.

الخطوات التالية