إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
يمكن لوظائف التنسيق الانتظار والاستماع إلى الأحداث الخارجية. هذه الميزة في Durable Functions غالبا ما تكون مفيدة للتعامل مع التفاعل البشري أو محفزات خارجية أخرى.
ملحوظة
الأحداث الخارجية هي عمليات غير متزامنة أحادية الاتجاه. ليست مناسبة للحالات التي يحتاج فيها العميل الذي يرسل الحدث إلى استجابة متزامنة من وظيفة المنسق.
يمكن للتوزيعات الموسيقية الانتظار والاستماع إلى الأحداث الخارجية. غالبا ما تكون هذه الميزة مفيدة للتعامل مع التفاعل البشري أو المحفزات الخارجية الأخرى.
ملحوظة
الأحداث الخارجية هي عمليات غير متزامنة أحادية الاتجاه. ليست مناسبة للمواقف التي يحتاج فيها العميل الذي يرسل الحدث إلى استجابة متزامنة من التنسيق.
مهم
حاليا، حزمة تطوير المهام الدائمة PowerShell غير متوفرة.
انتظر الأحداث
تسمح واجهة برمجة التطبيقات "انتظار حدث خارجي"لربط محفز التنسيق لوظيفة المنسق بالانتظار والاستماع بشكل غير متزامن لحدث يقدمه عميل خارجي. وظيفة المنسق الاستماعي تعلن عن اسم الحدث وشكل البيانات التي يتوقع استلامها.
تسمح واجهة برمجة التطبيقات "انتظار الحدث الخارجي" للتنسيق بالانتظار والاستماع بشكل غير متزامن لحدث يسلمها عميل خارجي. تعلن التوزيع الموسيقي للاستماع اسم الحدث وشكل البيانات التي يتوقع استلامها.
نموذج عامل معزول
using Microsoft.Azure.Functions.Worker;
using Microsoft.DurableTask;
using Microsoft.Extensions.Logging;
public class BudgetApproval
{
private readonly ILogger _logger;
public BudgetApproval(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<BudgetApproval>();
}
[Function("BudgetApproval")]
public async Task Run(
[OrchestrationTrigger] TaskOrchestrationContext context)
{
bool approved = await context.WaitForExternalEventAsync<bool>("Approval");
if (approved)
{
// approval granted - do the approved action
}
else
{
// approval denied - send a notification
}
}
}
نموذج قيد المعالجة
[FunctionName("BudgetApproval")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
bool approved = await context.WaitForExternalEvent<bool>("Approval");
if (approved)
{
// approval granted - do the approved action
}
else
{
// approval denied - send a notification
}
}
ملحوظة
إذا كنت تستخدم Durable Functions 1.x، استخدم DurableOrchestrationContext بدلا من IDurableOrchestrationContext. اطلع على مقال Durable Functions versions لمزيد من التفاصيل المتعلقة بالإصدارات.
public class BudgetApproval : TaskOrchestrator<object?, bool>
{
public override async Task<bool> RunAsync(TaskOrchestrationContext context, object? input)
{
bool approved = await context.WaitForExternalEvent<bool>("Approval");
if (approved)
{
// approval granted - do the approved action
}
else
{
// approval denied - send a notification
}
return approved;
}
}
المثال السابق يستمع لحدث واحد محدد ويتخذ إجراء عند استلام الحدث.
يمكنك الاستماع إلى عدة أحداث في نفس الوقت، كما في المثال التالي، الذي ينتظر أحد ثلاثة إشعارات محتملة للأحداث.
نموذج عامل معزول
[Function("Select")]
public async Task Run(
[OrchestrationTrigger] TaskOrchestrationContext context)
{
Task<float> event1 = context.WaitForExternalEventAsync<float>("Event1");
Task<bool> event2 = context.WaitForExternalEventAsync<bool>("Event2");
Task<int> event3 = context.WaitForExternalEventAsync<int>("Event3");
Task winner = await Task.WhenAny(event1, event2, event3);
if (winner == event1)
{
// ...
}
else if (winner == event2)
{
// ...
}
else if (winner == event3)
{
// ...
}
}
نموذج قيد المعالجة
[FunctionName("Select")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
var event1 = context.WaitForExternalEvent<float>("Event1");
var event2 = context.WaitForExternalEvent<bool>("Event2");
var event3 = context.WaitForExternalEvent<int>("Event3");
var winner = await Task.WhenAny(event1, event2, event3);
if (winner == event1)
{
// ...
}
else if (winner == event2)
{
// ...
}
else if (winner == event3)
{
// ...
}
}
ملحوظة
هل تستخدم Durable Functions 1.x؟ قم DurableOrchestrationContext بالتبديل بدلا من IDurableOrchestrationContext. راجع مقالة Durable Functions versions لتتعرف على اختلافات الإصدارات الأخرى.
public class SelectOrchestrator : TaskOrchestrator<object?, object?>
{
public override async Task<object?> RunAsync(TaskOrchestrationContext context, object? input)
{
Task<float> event1 = context.WaitForExternalEvent<float>("Event1");
Task<bool> event2 = context.WaitForExternalEvent<bool>("Event2");
Task<int> event3 = context.WaitForExternalEvent<int>("Event3");
Task winner = await Task.WhenAny(event1, event2, event3);
if (winner == event1)
{
// ...
}
else if (winner == event2)
{
// ...
}
else if (winner == event3)
{
// ...
}
return null;
}
}
المثال السابق يستمع لأي من الأحداث المتعددة. يمكنك أيضا الانتظار لجميع الفعاليات.
نموذج عامل معزول
[Function("NewBuildingPermit")]
public async Task Run(
[OrchestrationTrigger] TaskOrchestrationContext context)
{
string applicationId = context.GetInput<string>();
Task gate1 = context.WaitForExternalEventAsync<object>("CityPlanningApproval");
Task gate2 = context.WaitForExternalEventAsync<object>("FireDeptApproval");
Task gate3 = context.WaitForExternalEventAsync<object>("BuildingDeptApproval");
// all three departments must grant approval before a permit can be issued
await Task.WhenAll(gate1, gate2, gate3);
await context.CallActivityAsync("IssueBuildingPermit", applicationId);
}
نموذج قيد المعالجة
[FunctionName("NewBuildingPermit")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
string applicationId = context.GetInput<string>();
var gate1 = context.WaitForExternalEvent("CityPlanningApproval");
var gate2 = context.WaitForExternalEvent("FireDeptApproval");
var gate3 = context.WaitForExternalEvent("BuildingDeptApproval");
// all three departments must grant approval before a permit can be issued
await Task.WhenAll(gate1, gate2, gate3);
await context.CallActivityAsync("IssueBuildingPermit", applicationId);
}
ملحوظة
إذا كنت تستخدم Durable Functions 1.x، استخدم DurableOrchestrationContext بدلا من IDurableOrchestrationContext. توجه إلى Durable Functions versions للحصول على شرح كامل لفروقات الإصدارات.
في .NET، إذا لم يكن بالإمكان تحويل حمولة الحدث إلى النوع المتوقع T، يتم إلقاء استثناء.
public class NewBuildingPermit : TaskOrchestrator<string, object?>
{
public override async Task<object?> RunAsync(TaskOrchestrationContext context, string applicationId)
{
Task<object?> gate1 = context.WaitForExternalEvent<object?>("CityPlanningApproval");
Task<object?> gate2 = context.WaitForExternalEvent<object?>("FireDeptApproval");
Task<object?> gate3 = context.WaitForExternalEvent<object?>("BuildingDeptApproval");
// all three departments must grant approval before a permit can be issued
await Task.WhenAll(gate1, gate2, gate3);
await context.CallActivityAsync("IssueBuildingPermit", applicationId);
return null;
}
}
في .NET، إذا لم يكن بالإمكان تحويل حمولة الحدث إلى النوع المتوقع T، يتم إلقاء استثناء.
واجهة برمجة التطبيقات "انتظار الحدث الخارجي" تنتظر إلى أجل غير مسمى بعض المدخلات. يمكنك تفريغ تطبيق الوظائف بأمان أثناء الانتظار. إذا وعندما وصل حدث لهذا المثيل التنسيقي، يتم إيقاظ المثيل تلقائيا ويعالج الحدث فورا.
ملحوظة
إذا كان تطبيق الوظيفة الخاص بك يستخدم خطة الاستهلاك، فلن يتم فرض رسوم فوترة أثناء انتظار وظيفة المنسق مهمة حدث خارجي، بغض النظر عن مدة الانتظار.
كما هو الحال مع وظائف النشاط، تحتوي الأحداث الخارجية على ضمان تسليم مرة واحدة على الأقل . هذا يعني أنه تحت ظروف معينة (مثل إعادة التشغيل، التكبير، الأعطال، إلخ)، قد يتلقى تطبيقك نسخا من نفس الحدث الخارجي. لذلك، نوصي بأن تحتوي الأحداث الخارجية على نوع من معرف يسمح بإزالتها يدويا في المنظمات.
واجهة برمجة التطبيقات "انتظار الحدث الخارجي" تنتظر إلى أجل غير مسمى بعض المدخلات. يمكنك إيقاف العامل بأمان أثناء الانتظار. إذا وعندما وصل حدث لهذا الحدث التنظيمي، يتم إيقاظه تلقائيا ويعالج الحدث فورا.
الفعاليات الخارجية لديها ضمان تسليم مرة واحدة على الأقل . هذا يعني أنه تحت ظروف معينة (مثل إعادة التشغيل، التكبير، الأعطال، إلخ)، قد يتلقى تطبيقك نسخا من نفس الحدث الخارجي. لذلك، نوصي بأن تحتوي الأحداث الخارجية على نوع من معرف يسمح بإزالتها يدويا في التنسيقات.
إرسال الأحداث
يمكنك استخدام واجهة برمجة التطبيقات "raise-event" المعرفة بواسطة ربط عميل التنسيق لإرسال حدث خارجي إلى التنسيق. يمكنك أيضا استخدام واجهة HTTP المدمجة لحدث raise لإرسال حدث خارجي إلى تنسيق التنسيق.
الحدث المرتفع يشمل معلمات instanceIDو a eventNameو eventData as (معلمات). تتعامل وظائف المنسق مع هذه الأحداث باستخدام wait-for-external-event واجهات برمجة التطبيقات (APIs). يجب أن يتطابق كل eventName من جهة الإرسالوالاستقبال لكي يتم معالجة الحدث. يجب أن تكون بيانات الحدث أيضا قابلة للتسلسل عبر JSON.
داخليا، تقوم آليات "الحدث المتزايد" بإدخال رسالة يتم التقاطها من قبل وظيفة المنسق المنتظر. إذا لم يكن المثيل ينتظر اسم الحدث المحدد، تضاف رسالة الحدث إلى قائمة انتظار داخل الذاكرة. إذا بدأ جهاز التنسيق لاحقا بالاستماع لاسم ذلك الحدث، فإنه يتحقق من قائمة الانتظار لرسائل الحدث.
ملحوظة
إذا لم يكن هناك مثيل تنسيق بمعرف النسخة المحدد، يتم تجاهل رسالة الحدث.
فيما يلي مثال على دالة يتم تفعيلها عبر قائمة الانتظار ترسل حدث "موافقة" إلى مثيل دالة المنسق. معرف مثيل التنسيق يأتي من نص رسالة الطابور.
يمكنك استخدام واجهة برمجة التطبيقات "raise-event" على عميل Durable Task لإرسال حدث خارجي إلى تنسيق التنسيق.
يتضمن الحدث المرتفع معرف مثيل، واسم حدث، وبيانات حدث كمعلمات. تتعامل التنسيقات مع هذه الأحداث باستخدام واجهات برمجة التطبيقات "انتظار الحدث الخارجي". يجب أن يتطابق اسم الحدث في كل من جهة الإرسال والاستقبال لكي يتم معالجة الحدث. يجب أن تكون بيانات الحدث أيضا قابلة للتسلسل عبر JSON.
داخليا، آليات "رفع الحدث" تسجل رسالة تلتقطها الفرقة الموسيقية المنتظرة. إذا لم يكن المثيل ينتظر اسم الحدث المحدد، تضاف رسالة الحدث إلى قائمة انتظار داخل الذاكرة. إذا بدأ التوزيع لاحقا بالاستماع لاسم ذلك الحدث، فسيتحقق من قائمة الانتظار لرسائل الحدث.
ملحوظة
إذا لم يكن هناك نسخة تنسيقية ب "، instanceIDيتم التخلص من رسالة الحدث.
فيما يلي مثال يرسل حدث "موافقة" إلى مثيل توزيع أوركستراني.
نموذج عامل معزول
using Microsoft.Azure.Functions.Worker;
using Microsoft.DurableTask.Client;
public class ApprovalQueueProcessor
{
[Function("ApprovalQueueProcessor")]
public async Task Run(
[QueueTrigger("approval-queue")] string instanceId,
[DurableClient] DurableTaskClient client)
{
await client.RaiseEventAsync(instanceId, "Approval", true);
}
}
نموذج قيد المعالجة
[FunctionName("ApprovalQueueProcessor")]
public static async Task Run(
[QueueTrigger("approval-queue")] string instanceId,
[DurableClient] IDurableOrchestrationClient client)
{
await client.RaiseEventAsync(instanceId, "Approval", true);
}
ملحوظة
بالنسبة ل Durable Functions 1.x، استخدم خاصية OrchestrationClient ونوع معامل DurableOrchestrationClient بدلا من ذلك. تحقق من مقالة Durable Functions version لجميع التغييرات الخاصة بالإصدارات.
داخليا، تقوم واجهة "الحدث المتزايد" بإدخال رسالة يتم التقاطها من قبل وظيفة المنسق المنتظرة. إذا لم يكن المثيل ينتظر اسم الحدث المحدد، تضاف رسالة الحدث إلى مخزن مؤقت داخل الذاكرة. إذا بدأ مثيل التنسيق لاحقا بالاستماع لاسم ذلك الحدث، فإنه يتحقق من المخزن المؤقت بحثا عن رسائل الأحداث ويشغل المهمة التي كانت تنتظره.
ملحوظة
إذا لم يكن هناك مثيل تنسيق بمعرف النسخة المحدد، يتم التخلص من رسالة الحدث.
await client.RaiseEventAsync(instanceId, "Approval", true);
داخليا، تقوم واجهة "حدث الرفع" بإدخال رسالة يتم التقاطها من قبل التنسيق المنتظر. إذا لم يكن المثيل ينتظر اسم الحدث المحدد، تضاف رسالة الحدث إلى مخزن مؤقت داخل الذاكرة. إذا بدأ التنسيق لاحقا في الاستماع لاسم ذلك الحدث، فسيتحقق من المخزن المؤقت بحثا عن رسائل الأحداث ويشغل المهمة التي كانت تنتظره.
ملحوظة
إذا لم يكن هناك مثيل تنسيق بمعرف النسخة المحدد، يتم التخلص من رسالة الحدث.
HTTP
فيما يلي مثال على طلب HTTP الذي يرفع حدثا Approval إلى مثيل تنسيق.
POST /runtime/webhooks/durabletask/instances/MyInstanceId/raiseEvent/Approval&code=XXX
Content-Type: application/json
"true"
في هذه الحالة، يتم ترميز معرف النسخة كمعرف MyInstanceId.
أفضل الممارسات للفعاليات الخارجية
احتفظ بأفضل الممارسات التالية في اعتبارك عند العمل مع الفعاليات الخارجية:
استخدم أسماء الأحداث الفريدة لإزالة التكرار
الفعاليات الخارجية لديها ضمان تسليم مرة واحدة على الأقل . في ظروف نادرة معينة (والتي قد تحدث أثناء إعادة التشغيل أو التحجيم أو الأعطال)، قد يتلقى تطبيقك نسخا من نفس الحدث الخارجي. نوصي بأن تحتوي الأحداث الخارجية على معرف فريد يسمح بإزالتها يدويا في المنظمات.
ملحوظة
مزود تخزين MSSQL يستهلك الأحداث الخارجية ويحدث حالة المنسق بشكل معاملاتي، لذا لا يوجد خطر تكرار الأحداث مع تلك الخلفية، على عكس مزود Azure Storage. ومع ذلك، لا يزال ينصح بأن تكون للأحداث الخارجية أسماء فريدة حتى يكون الكود محمولا عبر الخلفية.