الموسيقيون السينغلتون في مهمة الدوام

بالنسبة للمهام الخلفية، غالبا ما تحتاج إلى التأكد من تشغيل نسخة واحدة فقط من الأوركستراتور في نفس الوقت، مما يمنع تكرار التوزيع الموسيقي في نفس الوقت. يمكنك تنفيذ هذا النمط المفرد في Durable Functions أو Durable Task SDKs عن طريق تعيين معرف مثيل محدد للمنسق عند إنشائه، ثم التحقق مما إذا كان المثيل بهذا المعرف يعمل بالفعل قبل بدء نسخة جديدة.

توضح هذه المقالة كيفية تنفيذ التنسيقات الفردية مع أمثلة على الكود لكل لغة مدعومة.

المتطلبات

ملحوظة

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

مهم

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

مثال على أوركستراتور سينجلتون

مهم

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

المثال التالي يظهر دالة HTTP-trigger تنشئ تنسيق وظيفة خلفية مفردة. يحاول الكود التأكد من وجود مثيل نشط واحد فقط لمعرف مثيل محدد.

[Function("HttpStartSingle")]
public static async Task<HttpResponseData> RunSingle(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "orchestrators/{functionName}/{instanceId}")] HttpRequestData req,
    [DurableClient] DurableTaskClient starter,
    string functionName,
    string instanceId,
    FunctionContext executionContext)
{
    ILogger logger = executionContext.GetLogger("HttpStartSingle");

    // Check if an instance with the specified ID already exists or an existing one stopped running(completed/failed/terminated).
    OrchestrationMetadata? existingInstance = await starter.GetInstanceAsync(instanceId, getInputsAndOutputs: false);
    if (existingInstance == null 
    || existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Completed 
    || existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Failed 
    || existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Terminated)
    {
        // An instance with the specified ID doesn't exist or an existing one stopped running, create one.
        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        await starter.ScheduleNewOrchestrationInstanceAsync(functionName, requestBody, new StartOrchestrationOptions { InstanceId = instanceId });
        logger.LogInformation($"Started orchestration with ID = '{instanceId}'.");
        return await starter.CreateCheckStatusResponseAsync(req, instanceId);
    }
    else
    {
        // An instance with the specified ID exists or an existing one still running, don't create one.
        var response = req.CreateResponse(HttpStatusCode.Conflict);
        await response.WriteStringAsync($"An instance with ID '{instanceId}' already exists.");
        return response;
    }
}

ملحوظة

الكود السابق C# كان لنموذج العامل المعزول، وهو النموذج الموصى به لتطبيقات .NET. لمزيد من المعلومات حول الفروقات بين نماذج العمال أثناء العملية ونماذج العامل المعزول، راجع مقالة Durable Functions النسخ.

يوضح المثال التالي كيفية إنشاء تنسيق أوركسترالي واحد باستخدام مجموعات تطوير المهام الدائمة. يحاول الكود التأكد من وجود مثيل نشط واحد فقط لمعرف مثيل محدد.

using Microsoft.DurableTask.Client;

// Check if an instance with the specified ID already exists
string instanceId = "singleton-job";
OrchestrationMetadata? existingInstance = await client.GetInstanceAsync(instanceId, getInputsAndOutputs: false);

if (existingInstance == null ||
    existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Completed ||
    existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Failed ||
    existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Terminated)
{
    // An instance with the specified ID doesn't exist or an existing one stopped running, create one.
    await client.ScheduleNewOrchestrationInstanceAsync("MyOrchestration", input, new StartOrchestrationOptions(instanceId));
    Console.WriteLine($"Started orchestration with ID = '{instanceId}'.");
}
else
{
    // An instance with the specified ID exists or an existing one still running.
    Console.WriteLine($"An instance with ID '{instanceId}' already exists.");
}

كيف يعمل نمط السينغلتون

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

وظيفة الموزع نفسها يمكن أن تستخدم أي نمط — وظيفة قياسية تبدأ وتنتهي، أو أوركسترا أبدي يعمل باستمرار. نمط الشخص المفرد يتحكم فقط في عدد المثيلات التي تعمل في نفس الوقت.

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