وظيفة بالسلاسل في دوال متينة - مرحبًا نموذج تسلسل

يُشير تسلسل الدالة إلى نمط تنفيذ تسلسل الدالات بترتيبِ معين. في هذا النمط، يتم تطبيق إخراج دالة واحدة على إدخال دالةٍ أخرى. توضح هذه المقالة تسلسل التسلسل الذي تقوم بإنشائه عند إكمال التشغيل السريع ل Durable Functions (C#‎ أو JavaScript أو TypeScript أو Python أو PowerShell أو Java). لمزيدٍ من المعلومات عن الدوال المتينة يُرجى إلقاء نظرة عامة على الدوال المتينة.

المتطلبات الأساسية

إشعار

يتوفر الإصدار 4 من نموذج البرمجة Node.js ل Azure Functions بشكل عام. تم تصميم نموذج v4 الجديد للحصول على تجربة أكثر مرونة وبديهية لمطوري JavaScript وTypeScript. تعرف على المزيد حول الاختلافات بين v3 وv4 في دليل الترحيل.

في القصاصات البرمجية التالية، يشير JavaScript (PM4) إلى نموذج البرمجة V4، التجربة الجديدة.

الدوال

توضح هذه المقالة الدوال التالية في تطبيق العينة:

  • E1_HelloSequenceدالة منسق التي تستدعي E1_SayHello عدة مرات في تسلسل. فإنه يخزن المخرجات من E1_SayHello المكالمات ويسجل النتائج.
  • E1_SayHelloدالة نشاط التي تضيف سلسلة مع "مرحبا".
  • HttpStartتشغيل HTTP دالة عميل دائم الذي يبدأ على الفور من المنسق.

E1_ مرحبًا تعاقب دالة المنسق

[FunctionName("E1_HelloSequence")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Tokyo"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Seattle"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello_DirectInput", "London"));

    // returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
    return outputs;
}

يجب أن يكون لكافة دالات التزامن C# معلمة من النوع DurableOrchestrationContext، موجودة في Microsoft.Azure.WebJobs.Extensions.DurableTask التجميع. يتيح لك هذا السياق استدعاء وظائف نشاط أخرى وتمرير معلمات الإدخال باستخدام CallActivityAsync أسلوبها.

استدعاء التعليمات البرمجية E1_SayHello ثلاث مرات في تسلسل مع قيم معلمة مختلفة. تتم إضافة قيمة الإرجاع لكل استدعاء إلى outputs القائمة التي يتم إرجاعها في نهاية الدالة.

دالة نشاط E1_SayHello

[FunctionName("E1_SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext context)
{
    string name = context.GetInput<string>();
    return $"Hello {name}!";
}

تستخدم الأنشطة ActivityTrigger السمة. استخدم المقدم IDurableActivityContext لتنفيذ الإجراءات المتعلقة بالنشاط، مثل الوصول إلى قيمة الإدخال باستخدام GetInput<T>.

تنفيذ E1_SayHello عملية تنسيق سلسلة بسيطة نسبيًا.

بدلاً من الربط إلى IDurableActivityContext، يمكنك الربط مباشرةً إلى النوع الذي يتم تمريره إلى دالة النشاط. على سبيل المثال:

[FunctionName("E1_SayHello_DirectInput")]
public static string SayHelloDirectInput([ActivityTrigger] string name)
{
    return $"Hello {name}!";
}

وظيفة عميل HttpStart

يمكنك بدء تشغيل مثيل دالة التزامن باستخدام دالة عميل. ستستخدم HttpStart الدالة HTTP المشغلة لبدء مثيلات E1_HelloSequence.

public static class HttpStart
{
    [FunctionName("HttpStart")]
    public static async Task<HttpResponseMessage> Run(
        [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}")] HttpRequestMessage req,
        [DurableClient] IDurableClient 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}'.");

        return starter.CreateCheckStatusResponse(req, instanceId);
    }
}

للتفاعل مع المنسقين، يجب أن تتضمن الوظيفة ارتباط إدخال DurableClient. يمكنك استخدام العميل لبدء تشغيل التزامن. كما يمكن أن يساعدك في إرجاع استجابة HTTP تحتوي على عناوين "URL" للتحقق من حالة التزامن الجديد.

تشغيل تطبيق العرض التوضيحي

لتنفيذ E1_HelloSequence التزامن، إرسال طلب HTTP POST التالي إلى HttpStart الدالة.

POST http://{host}/orchestrators/E1_HelloSequence

إشعار

يفترض قصاصة محتوى HTTP السابق وجود إدخال في host.json الملف الذي يزيل api/ البادئة الافتراضية من كافة عناوين URLدوال تشغيل HTTP. يمكنك العثور على علامات هذا التكوين في host.json الملف في العينات.

على سبيل المثال، إذا كنت تقوم بتشغيل العينة في تطبيق دالة يسمى "myfunctionapp"، استبدل "{host}" ب "myfunctionapp.azurewebsites.net".

والنتيجة هي استجابة HTTP 202، مثل هذا (قلصت للإيجاز) :

HTTP/1.1 202 Accepted
Content-Length: 719
Content-Type: application/json; charset=utf-8
Location: http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

(...trimmed...)

عند هذه النقطة، التزامن في قائمة الانتظار ويبدأ التشغيل مباشرة. يمكن استخدام عنوان موقع ويب في Location الرأس للتحقق من حالة التنفيذ.

GET http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

والنتيجة هي حالة التزامن. يتم تشغيله وإكماله بسرعة، بحيث تراه في الحالة المكتملة مع استجابة تبدو هكذا (تم اقتطاعها للإيجاز):

HTTP/1.1 200 OK
Content-Length: 179
Content-Type: application/json; charset=utf-8

{"runtimeStatus":"Completed","input":null,"output":["Hello Tokyo!","Hello Seattle!","Hello London!"],"createdTime":"2017-06-29T05:24:57Z","lastUpdatedTime":"2017-06-29T05:24:59Z"}

كما ترى، runtimeStatus للمثيل مكتمل ويحتوي output على نتيجة تسلسل JSON تنفيذ دالة المنسق.

إشعار

يمكنك تنفيذ منطق بداية مشابه لأنواع المشغلات الأخرى، مثل queueTrigger أو eventHubTrigger أو timerTrigger.

انظر إلى سجلات تنفيذ الدالة. E1_HelloSequenceبدأت الدالة واكتملت عدة مرات بسبب سلوك إعادة وصفها في موضوع موثوقية التزامن. ومن ناحية أخرى، لم تنفذ سوى ثلاث عمليات E1_SayHello لأن هذه التنفيذات للدالة لا تعاد.

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

وقد أظهرت هذه العينة البسيطة دالة سلسلة التزامن. تظهر العينة التالية كيفية تنفيذ نمط fan-out\fan-in.