إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
توفر إضافة Durable Functions روابط للتشغيل والإخراج تربط كودك بوقت تشغيل Durable Functions لتنسيق سير العمل. استخدم هذه الروابط لتعريف وظائف المنسق، دوال النشاط، دوال الكيان، ووظائف العميل التي تبدأ وتدير سير عمل دائم.
تشرح هذه المقالة كيفية تكوين واستخدام كل ربط (محفز التنسيق، مشغل النشاط، مشغل الكيان، وعميل التنسيق) مع عينات كود لكل لغة مدعومة.
تأكد من اختيار لغة تطوير Durable Functions في أعلى المقال.
يدعم Durable Functions كلا النسختين من نموذج البرمجة بلغة بايثون لتطبيقات Azure. نظرا لأن Python v2 هو النسخة الموصى بها، فإن الأمثلة في هذا المقال تركز حصريا على هذا الإصدار.
المتطلبات المسبقه
- Durable Functions SDK، وهو حزمة فهرس الحزم Python (PyPI)
azure-functions-durable، الإصدار1.2.2أو إصدار أحدث - حزمة الملحق الإصدار 4.x (أو إصدار أحدث)، والذي يتم تعيينه في ملف المشروعhost.json
يمكنك تقديم ملاحظات واقتراحات في Durable Functions SDK لمستودع Python.
مشغل التنسيق
يمكنك استخدام مشغل التنسيق لتطوير وظائف المنسق الدائمة. يتم تنفيذ هذا المشغل عند جدولة مثيل تزامن جديد وعندما يتلقى مثيل تزامن موجود حدثا. تتضمن أمثلة الأحداث التي يمكن أن تؤدي إلى وظائف المنسق انتهاء صلاحية المؤقت الدائم واستجابات دالة النشاط والأحداث التي يرفعها العملاء الخارجيون.
عندما تطور الوظائف في .NET، تستخدم خاصية OrchestrationTriggerAttribute .NET لتكوين مشغل التنسيق.
بالنسبة ل Java، تستخدم تعليق @DurableOrchestrationTrigger لتكوين مشغل التوزيع الأوركسترالي.
عند استخدام الإصدار 4 من نموذج البرمجة Node.js لتطوير الوظائف ، فإنك تقوم باستيراد الكائن app من الوحدة @azure/functions npm النمطية. ثم تستدعي طريقة app.orchestration من واجهة برمجة التطبيقات Durable Functions مباشرة في كود الدالة الخاص بك. تقوم هذه الطريقة بتسجيل وظيفة المنسق الخاص بك باستخدام إطار Durable Functions.
عند كتابة وظائف المنسق، يمكنك تحديد مشغل التنسيق باستخدام كائن JSON التالي في bindings صفيف ملف function.json :
{
"name": "<name-of-input-parameter-in-function-signature>",
"orchestration": "<optional-name-of-orchestration>",
"type": "orchestrationTrigger",
"direction": "in"
}
orchestration القيمة هي اسم التنسيق الذي يجب على العملاء استخدامه عندما يريدون بدء مثيلات جديدة لوظيفة المنسق. هذه الخاصية اختيارية. إذا لم تحدده، استخدام اسم الدالة.
عند استخدام نموذج البرمجة Python v2، يمكنك تعريف مشغل تنسيق باستخدام orchestration_trigger ديكور مباشرة في كود دالة Python الخاص بك.
في نموذج v2، تصل إلى Durable Functions المشغلات والروابط من نسخة DFApp. يمكنك استخدام هذا التخصص الفرعي من FunctionApp لتصدير الديكوريين الخاصين ب Durable Functions.
داخليا، يقوم ربط المشغل هذا باستطلاع المخزن الدائم الذي تم تكوينه لأحداث التنسيق الجديدة. أمثلة على الفعاليات تشمل:
- فعاليات بدء التوزيع الموسيقي
- أحداث انتهاء صلاحية المؤقت الدائم
- أحداث استجابة دالة النشاط
- الأحداث الخارجية التي أثارتها وظائف أخرى
سلوك محفز التوزيع الموسيقي
فيما يلي بعض الملاحظات حول مشغل التنسيق:
- مؤشر ترابط أحادي: يتم استخدام مؤشر ترابط مرسل واحد لجميع تنفيذ وظائف المنسق على مثيل مضيف واحد. لهذا السبب، من المهم التأكد من أن التعليمات البرمجية لوظيفة المنسق فعالة ولا تقوم بأي عمليات إدخال/إخراج. من المهم أيضا التأكد من أن هذا الموضوع لا يقوم بأي عمل غير متزامن إلا عند انتظار أنواع المهام الخاصة ب Durable Functions.
- معالجة الرسائل السامة: لا يوجد دعم للرسائل السامة في مشغلات التنسيق.
- رؤية الرسالة: يتم إلغاء قائمة الانتظار من رسائل مشغل التنسيق وإبقائها غير مرئية لمدة قابلة للتكوين. يتم تجديد رؤية هذه الرسائل تلقائيا طالما أن تطبيق الوظائف قيد التشغيل وصحية.
- Return values: يتم تسلسل قيم الإرجاع إلى JSON وتبقى في جدول تاريخ التنسيق في مساحة تخزين Azure Table. يمكنك الاستعلام عن هذه القيم المرتجعة من خلال ربط عميل التنسيق، الذي سيتم شرحه لاحقا.
تحذير
يجب ألا تستخدم دالات المنسق أي روابط إدخال أو إخراج بخلاف ربط مشغل التنسيق. يمكن أن يتسبب استخدام الروابط الأخرى في حدوث مشكلات في ملحق المهمة الدائمة، لأن هذه الروابط قد لا تمتثل لقواعد الخيط الفردي والإدخال/الإخراج. إذا كنت ترغب في استخدام روابط أخرى، فقم بإضافتها إلى دالة نشاط يتم استدعاؤها من وظيفة المنسق. لمزيد من المعلومات حول قيود الترميز لوظائف المنسق، راجع قيود التعليمات البرمجية لوظيفة المنسق.
تحذير
يجب عدم الإعلان asyncعن دالات المنسق مطلقا .
استخدام مشغلات التوزيع الموسيقي
يدعم ربط مشغل التزامن كلا من المدخلات والمخرجات. فيما يلي بعض الملاحظات حول معالجة الإدخال والمخرجات:
- الإدخالات: يمكنك استدعاء مشغلات التنسيق التي تحتوي على إدخالات. يتم الوصول إلى المدخلات من خلال كائن إدخال السياق. يجب أن تكون جميع المدخلات قابلة للتسلسل JSON.
- المخرجات: تدعم مشغلات التنسيق قيم الإخراج والإدخال. يتم استخدام قيمة الإرجاع للدالة لتعيين قيمة الإخراج. يجب أن تكون قيمة الإرجاع قابلة للتسلسل.
عينة من مشغل التوزيع الموسيقي
يوفر الكود التالي مثالا على وظيفة التنسيق الأساسية مرحبًا بالعالم. لا يقوم منسق المثال هذا بجدولة أي مهام.
السمة التي تستخدمها لتعريف الزناد تعتمد على ما إذا كنت تشغل دوال C# الخاصة بك:
[FunctionName("HelloWorld")]
public static string RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
string name = context.GetInput<string>();
return $"Hello {name}!";
}
ملحوظة
الكود السابق هو ل Durable Functions 2.x. بالنسبة ل Durable Functions 1.x، يجب استخدام DurableOrchestrationContext بدلا من IDurableOrchestrationContext. لمزيد من المعلومات حول الفروقات بين الإصدارات، راجع نظرة عامة على Durable Functions الإصدارات.
const { app } = require('@azure/functions');
const df = require('durable-functions');
df.app.orchestration('helloOrchestrator', function* (context) {
const name = context.df.getInput();
return `Hello ${name}`;
});
ملحوظة
durable-functions تستدعي المكتبة الطريقة المتزامنة context.done عند خروج وظيفة المولد.
import azure.functions as func
import azure.durable_functions as df
myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.orchestration_trigger(context_name="context")
def my_orchestrator(context):
result = yield context.call_activity("Hello", "Tokyo")
return result
param($Context)
$InputData = $Context.Input
$InputData
@FunctionName("HelloWorldOrchestration")
public String helloWorldOrchestration(
@DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
return String.format("Hello %s!", ctx.getInput(String.class));
}
تستدعي معظم وظائف المنسق وظائف النشاط. يوفر الكود التالي مثالا مرحبًا بالعالم يوضح كيفية استدعاء دالة النشاط:
[FunctionName("HelloWorld")]
public static async Task<string> RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
string name = context.GetInput<string>();
string result = await context.CallActivityAsync<string>("SayHello", name);
return result;
}
ملحوظة
الكود السابق هو ل Durable Functions 2.x. بالنسبة ل Durable Functions 1.x، يجب استخدام DurableOrchestrationContext بدلا من IDurableOrchestrationContext. لمزيد من المعلومات حول الفروقات بين الإصدارات، راجع نظرة عامة على Durable Functions الإصدارات.
const { app } = require('@azure/functions');
const df = require('durable-functions');
const activityName = 'hello';
df.app.orchestration('helloOrchestrator', function* (context) {
const name = context.df.getInput();
const result = yield context.df.callActivity(activityName, name);
return result;
});
@FunctionName("HelloWorld")
public String helloWorldOrchestration(
@DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
String input = ctx.getInput(String.class);
String result = ctx.callActivity("SayHello", input, String.class).await();
return result;
}
مشغل النشاط
يمكنك استخدام مشغل النشاط لتطوير وظائف تعرف باسم وظائف النشاط التي يتم استدعاؤها بواسطة وظائف المنسق.
تستخدم خاصية ActivityTriggerAttribute .NET لتكوين مشغل النشاط.
يمكنك استخدام التعليق التوضيحي @DurableActivityTrigger لتكوين مشغل النشاط.
لتسجيل وظيفة النشاط الخاصة بك، يمكنك استيراد الكائن app من الوحدة النمطية @azure/functions npm . ثم تستدعي طريقة app.activity من واجهة برمجة التطبيقات Durable Functions مباشرة في كود الدالة الخاص بك.
لتحديد مشغل النشاط، يمكنك استخدام كائن JSON التالي في bindings صفيف function.json:
{
"name": "<name-of-input-parameter-in-function-signature>",
"activity": "<optional-name-of-activity>",
"type": "activityTrigger",
"direction": "in"
}
activity القيمة هي اسم النشاط. هذه القيمة هي الاسم الذي تستخدمه دالات المنسق لاستدعاء دالة النشاط هذه. هذه الخاصية اختيارية. إذا لم تحدده، استخدام اسم الدالة.
يمكنك تعريف مشغل النشاط باستخدام activity_trigger decorator مباشرة في كود وظيفة Python الخاص بك.
داخليا، يقوم ربط المشغل هذا باستطلاع المخزن الدائم المكون لأحداث تنفيذ النشاط الجديدة.
سلوك المشغل
فيما يلي بعض الملاحظات حول مشغل النشاط:
- الخيوط: على عكس مشغل التنسيق ، لا تحتوي مشغلات النشاط على أي قيود على الخيوط أو عمليات الإدخال / الإخراج. ويمكن التعامل معها مثل الوظائف العادية.
- معالجة الرسائل السامة: لا يوجد دعم للرسائل السامة في مشغلات النشاط.
- رؤية الرسالة: يتم إلغاء قائمة الانتظار لرسائل مشغل النشاط وإبقائها غير مرئية لمدة قابلة للتكوين. يتم تجديد رؤية هذه الرسائل تلقائيا طالما أن تطبيق الوظائف قيد التشغيل وصحية.
- قيم الإرجاع: يتم تسلسل قيم الإرجاع إلى JSON وتستمر في المخزن الدائم الذي تم تكوينه.
استخدام المشغل
يدعم ربط مشغل النشاط كلا من المدخلات والمخرجات، تماما مثل مشغل التزامن. فيما يلي بعض الملاحظات حول معالجة الإدخال والمخرجات:
- المدخلات: يمكن استدعاء مشغلات النشاط بمدخلات من وظيفة المنسق. يجب أن تكون جميع المدخلات قابلة للتسلسل JSON.
- المخرجات: تدعم وظائف النشاط قيم الإخراج والإدخال. يتم استخدام القيمة المرجعة للدالة لتعيين قيمة الإخراج ويجب أن تكون JSON قابلة للتسلسل.
-
Metadata: يمكن .NET دوال النشاط الارتباط بمعامل
string instanceIdللحصول على معرف الحالة لتنسيق الاتصال.
عينة الزناد
يوفر الكود التالي مثالا على دالة نشاط أساسية مرحبًا بالعالم.
[FunctionName("SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext helloContext)
{
string name = helloContext.GetInput<string>();
return $"Hello {name}!";
}
نوع المعلمة الافتراضي لربط .NET ActivityTriggerAttribute هو IDurableActivityContext (أو DurableActivityContext ل Durable Functions 1.x). ومع ذلك، تدعم محفزات نشاط .NET أيضا الربط المباشر بالأنواع القابلة للتسلسل ب JSON (بما في ذلك الأنواع الأولية)، لذا يمكنك أيضا استخدام النسخة المبسطة التالية من الدالة:
[FunctionName("SayHello")]
public static string SayHello([ActivityTrigger] string name)
{
return $"Hello {name}!";
}
const { app } = require('@azure/functions');
const df = require('durable-functions');
const activityName = 'hello';
df.app.activity(activityName, {
handler: (input) => {
return `Hello, ${input}`;
},
});
import azure.functions as func
import azure.durable_functions as df
myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.activity_trigger(input_name="myInput")
def my_activity(myInput: str):
return "Hello " + myInput
param($name)
"Hello $name!"
@FunctionName("SayHello")
public String sayHello(@DurableActivityTrigger(name = "name") String name) {
return String.format("Hello %s!", name);
}
استخدم روابط إدخال وإخراج النشاط
إلى جانب ربط مشغل النشاط ، يمكنك أيضا استخدام روابط الإدخال والإخراج العادية.
على سبيل المثال، يمكن أن تتلقى دالة النشاط مدخلات من دالة المنسق. يمكن لوظيفة النشاط بعد ذلك إرسال تلك الإدخال كرسالة إلى مراكز أحداث Azure.
const { app } = require('@azure/functions');
const df = require('durable-functions');
df.app.orchestration('helloOrchestrator', function* (context) {
const input = context.df.getInput();
yield context.df.callActivity('sendToEventHub', input);
return `Message sent: ${input}`;
});
const { EventHubProducerClient } = require("@azure/event-hubs");
const connectionString = process.env.EVENT_HUB_CONNECTION_STRING;
const eventHubName = process.env.EVENT_HUB_NAME;
df.app.activity("sendToEventHub", {
handler: async (message, context) => {
const producer = new EventHubProducerClient(connectionString, eventHubName);
try {
const batch = await producer.createBatch();
batch.tryAdd({ body: message });
await producer.sendBatch(batch);
context.log(`Message sent to Event Hubs: ${message}`);
} catch (err) {
context.log.error("Failed to send message to Event Hubs:", err);
throw err;
} finally {
await producer.close();
}
},
});
app.storageQueue('helloQueueStart', {
queueName: 'start-orchestration',
extraInputs: [df.input.durableClient()],
handler: async (message, context) => {
const client = df.getClient(context);
const orchestratorName = message.orchestratorName || 'helloOrchestrator';
const input = message.input || null;
const instanceId = await client.startNew(orchestratorName, { input });
context.log(`Started orchestration with ID = '${instanceId}'`);
},
});
عميل التنسيق
يمكنك استخدام ربط عميل التزامن لكتابة الوظائف التي تتفاعل مع وظائف المنسق. غالبا ما يشار إلى هذه الوظائف باسم وظائف العميل. على سبيل المثال، يمكنك العمل على مثيلات التنسيق بالطرق التالية:
- ابدأ بهم.
- الاستعلام عن حالتها.
- إنهائها.
- أرسل الأحداث إليهم أثناء تشغيلها.
- إزالة محفوظات المثيل.
يمكنك الربط بعميل تنسيق باستخدام خاصية DurableClientAttribute (OrchestrationClientAttribute في Durable Functions 1.x).
يمكنك الربط بعميل التزامن باستخدام التعليق التوضيحي @DurableClientInput .
لتسجيل وظيفة العميل الخاصة بك، يمكنك استيراد الكائن app من الوحدة النمطية @azure/functions npm . ثم تستدعي طريقة API Durable Functions الخاصة بنوع الزناد الخاص بك. على سبيل المثال ، بالنسبة لمشغل HTTP ، يمكنك استدعاء الطريقة app.http . بالنسبة لمشغل قائمة الانتظار، يمكنك استدعاء الطريقة app.storageQueue .
لتحديد مشغل العميل الدائم، يمكنك استخدام كائن JSON التالي في bindings مصفوفة function.json:
{
"name": "<name-of-input-parameter-in-function-signature>",
"taskHub": "<optional-name-of-task-hub>",
"connectionName": "<optional-name-of-connection-string-app-setting>",
"type": "orchestrationClient",
"direction": "in"
}
- يتم استخدام الخاصية
taskHubعندما تشترك تطبيقات الوظائف المتعددة في نفس حساب التخزين ولكن يجب عزلها عن بعضها البعض. إذا لم تحدد هذه الخاصية، استخدام القيمة الافتراضية من host.json . يجب أن تتطابق هذه القيمة مع القيمة التي تستخدمها وظائف المنسق الهدف. - قيمة
connectionNameهي اسم إعداد التطبيق الذي يحتوي على حساب تخزين سلسلة الاتصال. يجب أن يكون حساب التخزين الممثل بهذه السلسلة سلسلة الاتصال هو نفسه الذي تستخدمه وظائف التنسيق المستهدف. إذا لم تحدد هذه الخاصية، يتم استخدام سلسلة الاتصال الافتراضي لحساب التخزين لتطبيق الوظيفة.
ملحوظة
في معظم الحالات، نوصي بحذف هذه الخصائص والاعتماد على السلوك الافتراضي.
يمكنك تعريف زناد عميل دائم باستخدام durable_client_input ديكوريتور مباشرة في كود وظيفة Python الخاص بك.
استخدام العميل
عادة ما ترتبط بتنفيذ IDurableClient (DurableOrchestrationClient في Durable Functions 1.x)، مما يمنحك وصولا كاملا إلى جميع واجهات برمجة تطبيقات عميل التنسيق التي تدعمها Durable Functions.
عادة ما تقوم بالربط بالفئة DurableClientContext .
يجب استخدام SDK الخاصة باللغة للوصول إلى كائن عميل.
يوفر الكود التالي مثالا على دالة يتم تفعيلها في الطابور وتبدأ تنسيق مرحبًا بالعالم.
[FunctionName("QueueStart")]
public static Task Run(
[QueueTrigger("durable-function-trigger")] string input,
[DurableClient] IDurableOrchestrationClient starter)
{
// Orchestration input comes from the queue message content.
return starter.StartNewAsync<string>("HelloWorld", input);
}
ملحوظة
الكود C# السابق هو Durable Functions 2.x. بالنسبة Durable Functions 1.x، يجب استخدام خاصية OrchestrationClient بدلا من DurableClient، ويجب عليك استخدام نوع معامل DurableOrchestrationClient بدلا من IDurableOrchestrationClient. لمزيد من المعلومات حول الفروقات بين الإصدارات، راجع نظرة عامة على Durable Functions الإصدارات.
const { app } = require('@azure/functions');
const df = require('durable-functions');
app.storageQueue('helloQueueStart', {
queueName: 'start-orchestration',
extraInputs: [df.input.durableClient()],
handler: async (message, context) => {
const client = df.getClient(context);
const orchestratorName = message.orchestratorName || 'helloOrchestrator';
const input = message.input || null;
const instanceId = await client.startNew(orchestratorName, { input });
context.log(`Started orchestration with ID = '${instanceId}' from queue message.`);
},
});
import azure.functions as func
import azure.durable_functions as df
myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.queue_trigger(
arg_name="msg",
queue_name="start-orchestration",
connection="AzureWebJobsStorage"
)
@myApp.durable_client_input(client_name="client")
async def client_function(msg: func.QueueMessage, client: df.DurableOrchestrationClient):
input_data = msg.get_body().decode("utf-8")
await client.start_new("my_orchestrator", None, input_data)
return None
function.json
{
"bindings": [
{
"name": "InputData",
"type": "queueTrigger",
"queueName": "durable-function-trigger",
"direction": "in"
},
{
"name": "starter",
"type": "durableClient",
"direction": "in"
}
]
}
run.ps1
param([string]$InputData, $TriggerMetadata)
$InstanceId = Start-DurableOrchestration -FunctionName 'HelloWorld' -Input $InputData
@FunctionName("QueueStart")
public void queueStart(
@QueueTrigger(name = "input", queueName = "durable-function-trigger", connection = "Storage") String input,
@DurableClientInput(name = "durableContext") DurableClientContext durableContext) {
// Orchestration input comes from the queue message content.
durableContext.getClient().scheduleNewOrchestrationInstance("HelloWorld", input);
}
للحصول على معلومات مفصلة حول الأمثلة البدائية، راجع إدارة المثيلات في Durable Functions في Azure.
مشغل الكيان
يمكنك استخدام مشغل الكيان لتطوير دالة كيان. يدعم هذا المشغل معالجة الأحداث لمثيل كيان معين.
ملحوظة
يتوفر محفز الكيانات بدءا من Durable Functions 2.x.
داخليا، يقوم ربط المشغل هذا باستطلاع المخزن الدائم المكون لعمليات الكيان الجديدة التي تحتاج إلى التنفيذ.
تستخدم خاصية EntityTriggerAttribute .NET لتكوين مشغل الكيان.
لتسجيل مشغل الكيان، يمكنك استيراد الكائن app من الوحدة @azure/functions npm النمطية. ثم تستدعي طريقة app.entity من واجهة برمجة التطبيقات Durable Functions مباشرة في كود الدالة الخاص بك.
const df = require('durable-functions');
df.app.entity('counter', (context) => {
const currentValue = context.df.getState(() => 0);
switch (context.df.operationName) {
case 'add':
context.df.setState(currentValue + context.df.getInput());
break;
case 'reset':
context.df.setState(0);
break;
case 'get':
context.df.return(currentValue);
break;
}
});
يمكنك تعريف محفز الكيان باستخدام التعليق التوضيحي @DurableEntityTrigger . استخدمها EntityRunner.loadAndRun لإرسال العمليات إلى فئة الكيان الخاصة بك.
import com.microsoft.durabletask.AbstractTaskEntity;
import com.microsoft.durabletask.TaskEntityOperation;
import com.microsoft.durabletask.azurefunctions.DurableEntityTrigger;
import com.microsoft.durabletask.EntityRunner;
public class CounterEntity extends AbstractTaskEntity<Integer> {
public void add(int value) {
this.state += value;
}
public int get() {
return this.state;
}
public void reset() {
this.state = 0;
}
@Override
protected Integer initializeState(TaskEntityOperation operation) {
return 0;
}
@Override
protected Class<Integer> getStateType() {
return Integer.class;
}
}
// Entity function
@FunctionName("Counter")
public String counterEntity(
@DurableEntityTrigger(name = "req") String req) {
return EntityRunner.loadAndRun(req, CounterEntity::new);
}
ملحوظة
مشغلات الكيان غير مدعومة بعد ل PowerShell.
يمكنك تعريف مشغل الكيان باستخدام entity_trigger ديكور مباشرة في كود وظيفة Python الخاص بك.
سلوك المشغل
فيما يلي بعض الملاحظات حول مشغل الكيان:
- مؤشر ترابط أحادي: يتم استخدام مؤشر ترابط مرسل واحد لمعالجة العمليات لكيان معين. إذا تم إرسال رسائل متعددة إلى كيان واحد في وقت واحد، تتم معالجة العمليات واحدة تلو الأخرى.
- معالجة الرسائل السامة: لا يوجد دعم للرسائل السامة في مشغلات الكيان.
- رؤية الرسالة: يتم إلغاء قائمة انتظار رسائل مشغل الكيان وإبقائها غير مرئية لمدة قابلة للتكوين. يتم تجديد رؤية هذه الرسائل تلقائيا طالما أن تطبيق الوظائف قيد التشغيل وصحية.
- قيم الإرجاع: لا تدعم دالات الكيان قيم الإرجاع. هناك واجهات برمجة تطبيقات محددة يمكنك استخدامها لحفظ الحالة أو تمرير القيم مرة أخرى إلى التنسيقات.
تستمر أي تغييرات في الحالة يتم إجراؤها على كيان أثناء تنفيذه تلقائيا بعد اكتمال التنفيذ.
لمزيد من المعلومات والأمثلة حول تحديد مشغلات الكيانات والتفاعل معها، راجع وظائف الكيان.
عميل الكيان
يمكنك استخدام ربط عميل الكيان لتشغيل وظائف الكيان بشكل غير متزامن. يشار إلى هذه الوظائف أحيانا باسم وظائف العميل.
يمكنك الربط بعميل الكيان باستخدام خاصية DurableClientAttribute .NET في دوال مكتبة .NET الفئات.
ملحوظة
يمكنك أيضا استخدام الزر [DurableClientAttribute] للربط بعميل التنسيق.
بدلا من تسجيل عميل كيان، يمكنك استخدام signalEntity أو callEntity استدعاء أسلوب مشغل كيان من أي دالة مسجلة.
من وظيفة يتم تشغيلها في قائمة الانتظار، يمكنك استخدام
client.signalEntity:const { app } = require('@azure/functions'); const df = require('durable-functions'); app.storageQueue('helloQueueStart', { queueName: 'start-orchestration', extraInputs: [df.input.durableClient()], handler: async (message, context) => { const client = df.getClient(context); const entityId = new df.EntityId('counter', 'myCounter'); await client.signalEntity(entityId, 'add', 5); }, });من وظيفة المنسق ، يمكنك استخدام
context.df.callEntity:const { app } = require('@azure/functions'); const df = require('durable-functions'); df.app.orchestration('entityCaller', function* (context) { const entityId = new df.EntityId('counter', 'myCounter'); yield context.df.callEntity(entityId, 'add', 5); yield context.df.callEntity(entityId, 'add', 5); const result = yield context.df.callEntity(entityId, 'get'); return result; });
يمكنك تعريف عميل الكيان باستخدام durable_client_input ديكور مباشرة في كود دالة Python الخاص بك.
يمكنك استخدام @DurableClientInput التعليق للربط ب DurableClientContext، الذي يوفر طرقا لإرسال الكيانات وقراءة حالة الكيان.
إشارة إلى كيان من دالة يتم تفعيلها بواسطة HTTP:
@FunctionName("SignalCounter") public HttpResponseMessage signalCounter( @HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Void> request, @DurableClientInput(name = "durableContext") DurableClientContext durableContext) { EntityInstanceId entityId = new EntityInstanceId("Counter", "myCounter"); durableContext.signalEntity(entityId, "add", 5); return request.createResponseBuilder(HttpStatus.ACCEPTED) .body("Signal sent") .build(); }اقرأ حالة الكيان من دالة يتم تفعيلها بواسطة HTTP:
@FunctionName("GetCounter") public HttpResponseMessage getCounter( @HttpTrigger(name = "req", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Void> request, @DurableClientInput(name = "durableContext") DurableClientContext durableContext) { EntityInstanceId entityId = new EntityInstanceId("Counter", "myCounter"); EntityMetadata metadata = durableContext.getEntityMetadata(entityId, true); if (metadata == null) { return request.createResponseBuilder(HttpStatus.NOT_FOUND).build(); } Integer state = metadata.readStateAs(Integer.class); return request.createResponseBuilder(HttpStatus.OK) .body(state) .build(); }
ملحوظة
عملاء الكيانات غير مدعومين حتى الآن ل PowerShell.
لمزيد من المعلومات والأمثلة على التفاعل مع الكيانات كعميل، راجع كيانات الوصول.