إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
استخدم Durable Functions، وهي ميزة في نظام دالات Azure، لكتابة سير عمل بدون خادم ذات حالة في C#. في هذا البدء السريع، تقوم بنسخ وتشغيل تطبيق نموذجي يوضح نمط توزيع السلسلة الدالية:
- تسلسل الدوال: يستدعي الأنشطة بشكل متسلسل (طوكيو → سياتل → لندن).
بحلول النهاية، ستعمل التنسيق محليا باستخدام محاكي Durable Task Scheduler ويمكنك عرض حالته في لوحة التحكم.
- قم باستنساخ وتحضير مشروع العينات لمشروع Hello Cities.
- قم بإعداد محاكي Durable Task Scheduler وAzurite للتطوير المحلي.
- قم ببناء وتشغيل تطبيق الوظائف وتشغيل التنسيق الموسيقي.
- راجع حالة التوزيع والنتائج في لوحة تحكم جدولة المهام الدائمة.
المتطلبات المسبقه
- .NET 8 SDK أو لاحقا.
- دالات Azure Core Tools الإصدار الرابع أو أحدث.
- Docker لتشغيل المحاكي وAzurite.
- قم باستنساخ ><جدولة المهام المتطورة GitHub المستودع لاستخدام عينة البدء السريع.
إعداد محاكي جدولة المهام الدائمة
يوفر محاكي جدولة المهام Durable TasksScheduler بيئة تطوير محلية حتى تتمكن من اختبار التنسيقات الموسيقية دون اشتراك Azure. يتطلب مضيف الوظائف .NET أيضا Azurite للتخزين المحلي.
ابدأ كلا الحاويين:
docker run -d --name dtsemulator -p 8080:8080 -p 8082:8082 \
mcr.microsoft.com/dts/dts-emulator:latest
docker run -d --name azurite -p 10000:10000 -p 10001:10001 -p 10002:10002 \
mcr.microsoft.com/azure-storage/azurite
نصيحة
بمجرد تشغيل المحاكي، يمكنك الوصول إلى لوحة تحكم Durable Task Scheduler لمراقبة http://localhost:8082 التنسيقات.
شغل عينة البدء السريع
انتقل إلى دليل نماذج Hello Cities:
cd samples/durable-functions/dotnet/HelloCities/httpأنشئ ملفا
local.settings.jsonباستخدام تكوين المحاكي:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "DURABLE_TASK_SERVICE_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None", "TASKHUB_NAME": "default" } }بناء المشروع:
dotnet buildشغل تطبيق الوظائف:
func startفي محطة منفصلة، قم بتشغيل التوزيع الموسيقي:
$response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/DurableFunctionsOrchestrationCSharp1_HttpStart $responseتحتوي الاستجابة على روابط الحالة لنسخة التنسيق. انسخ القيمة
statusQueryGetUriوشغلها للتحقق من النتيجة:Invoke-RestMethod -Uri $response.statusQueryGetUri
الإنتاج المتوقع
يعيد طلب POST استجابة JSON مع عناوين الحالة. على سبيل المثال:
{
"id": "<instanceId>",
"statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/<instanceId>?code=...",
"sendEventPostUri": "...",
"terminatePostUri": "...",
"purgeHistoryDeleteUri": "..."
}
عندما تستفسر statusQueryGetUri وتكون نتائج التوزيع runtimeStatus هو Completed، يمكنك العثور على نتائج التحية في output الحقل:
{
"name": "DurableFunctionsOrchestrationCSharp1",
"runtimeStatus": "Completed",
"output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
}
نصيحة
إذا runtimeStatus ظهر Running السؤال أو Pendingانتظر لحظة واسأل statusQueryGetUri مرة أخرى.
افتح لوحة تحكم جدولة المهام الدائمة على ال http://localhost:8082 لعرض حالة التوزيع وسجل التنفيذ.
افهم الشيفرة
يحتوي المشروع النموذجي في DurableFunctionsOrchestrationCSharp1.cs على جميع أنواع الوظائف الثلاثة المطلوبة لتطبيق Durable Functions.
دالة النشاط
يأخذ النشاط SayHello اسم مدينة ويعيد التحية:
[Function(nameof(SayHello))]
public static string SayHello([ActivityTrigger] string name, FunctionContext executionContext)
{
ILogger logger = executionContext.GetLogger("SayHello");
logger.LogInformation("Saying hello to {name}.", name);
return $"Hello {name}!";
}
دالة المنسق
يقوم الموزع بالاتصال SayHello بالتتابع لثلاث مدن:
[Function(nameof(DurableFunctionsOrchestrationCSharp1))]
public static async Task<List<string>> RunOrchestrator(
[OrchestrationTrigger] TaskOrchestrationContext context)
{
ILogger logger = context.CreateReplaySafeLogger(nameof(DurableFunctionsOrchestrationCSharp1));
logger.LogInformation("Saying hello.");
var outputs = new List<string>();
outputs.Add(await context.CallActivityAsync<string>(nameof(SayHello), "Tokyo"));
outputs.Add(await context.CallActivityAsync<string>(nameof(SayHello), "Seattle"));
outputs.Add(await context.CallActivityAsync<string>(nameof(SayHello), "London"));
return outputs;
}
وظيفة العميل
تبدأ دالة العميل التي تفعل عبر HTTP عملية التنسيق:
[Function("DurableFunctionsOrchestrationCSharp1_HttpStart")]
public static async Task<HttpResponseData> HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
[DurableClient] DurableTaskClient client,
FunctionContext executionContext)
{
ILogger logger = executionContext.GetLogger("DurableFunctionsOrchestrationCSharp1_HttpStart");
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(
nameof(DurableFunctionsOrchestrationCSharp1));
logger.LogInformation("Started orchestration with ID = '{instanceId}'.", instanceId);
return await client.CreateCheckStatusResponseAsync(req, instanceId);
}
التكوين
تستخدم العينة محاكي Durable Task Scheduler كخلفية للتخزين. يتم تكوين هذا في host.json:
{
"version": "2.0",
"extensions": {
"durableTask": {
"storageProvider": {
"type": "azureManaged",
"connectionStringName": "DURABLE_TASK_SERVICE_CONNECTION_STRING"
},
"hubName": "%TASKHUB_NAME%"
}
}
}
سلسلة الاتصال المحاكي واسم مركز المهام مضبوطان في local.settings.json:
{
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
"DURABLE_TASK_SERVICE_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None",
"TASKHUB_NAME": "default"
}
}
تنظيف الموارد
أوقف حاويات المحاكي عندما تنتهي:
docker stop dtsemulator azurite && docker rm dtsemulator azurite
الخطوات التالية
- تعرف على أنماط تطبيقات Durable Functions الشائعة.
- تعرف على Durable Functions services storages.