مقدمة في خدمة النسيج الجهات الفاعلة الموثوقة

الجهات الفاعلة الموثوقة هي إطار تطبيق Service Fabric يعتمد على نمط الممثل الافتراضي . توفر واجهة برمجة تطبيقات الجهات الفاعلة الموثوقة نموذج برمجة أحادي الخيوط مبني على ضمانات قابلية التوسع والموثوقية التي توفرها Service Fabric.

ما هي الجهات الفاعلة؟

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

متى تستخدم الجهات الفاعلة الموثوقة

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

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

  • تتضمن مساحة المشكلة الخاصة بك عددا كبيرا (الآلاف أو أكثر) من الوحدات الصغيرة والمستقلة والمعزولة من الحالة والمنطق.
  • تريد العمل مع كائنات أحادية مؤشر ترابط لا تتطلب تفاعلا كبيرا من المكونات الخارجية، بما في ذلك حالة الاستعلام عبر مجموعة من الجهات الفاعلة.
  • لن تقوم مثيلات الممثلين بحظر المتصلين الذين يعانون من تأخيرات لا يمكن التنبؤ بها عن طريق إصدار عمليات الإدخال/الإخراج.

الجهات الفاعلة في النسيج الخدمي

في Service Fabric ، يتم تنفيذ الجهات الفاعلة في إطار الجهات الفاعلة الموثوقة: إطار تطبيق قائم على نمط الممثل مبني على رأس الخدمات الموثوقة لنسيج الخدمة. كل خدمة ممثل موثوق بها تكتبها هي في الواقع خدمة موثوقة مقسمة وذات حالة.

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

ممثل مدى الحياة

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

يحمل تجريد الممثل الافتراضي هذا بعض المحاذير نتيجة لنموذج الممثل الافتراضي ، وفي الواقع ينحرف تنفيذ الممثلين الموثوقين في بعض الأحيان عن هذا النموذج.

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

التوزيع وتجاوز الفشل

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

يتم توزيع الجهات الفاعلة عبر أقسام خدمة الممثلين، ويتم توزيع هذه الأقسام عبر العقد في مجموعة نسيج الخدمة. يحتوي كل قسم خدمة على مجموعة من الجهات الفاعلة. يقوم Service Fabric بإدارة توزيع أقسام الخدمة وتجاوزها من الفشل.

على سبيل المثال، سيتم توزيع خدمة ممثل تحتوي على تسعة أقسام تم نشرها على ثلاث عقد باستخدام موضع قسم الفاعل الافتراضي على النحو التالي:

Reliable Actors distribution

يدير Actor Framework نظام الأقسام وإعدادات النطاق الرئيسي نيابة عنك. هذا يبسط بعض الخيارات ولكنه يحمل أيضا بعض الاعتبار:

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

لمزيد من المعلومات حول كيفية تقسيم خدمات الجهات الفاعلة، راجع مفاهيم التقسيم للجهات الفاعلة.

التواصل مع الممثلين

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

تؤدي استدعاءات الأسلوب واستجاباتها في النهاية إلى طلبات الشبكة عبر المجموعة، لذلك يجب أن تكون الوسيطات وأنواع نتائج المهام التي تقوم بإرجاعها قابلة للتسلسل بواسطة النظام الأساسي. على وجه الخصوص ، يجب أن تكون عقد البيانات قابلة للتسلسل.

وكيل الممثل

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

// Create a randomly distributed actor ID
ActorId actorId = ActorId.CreateRandom();

// This only creates a proxy object, it does not activate an actor or invoke any methods yet.
IMyActor myActor = ActorProxy.Create<IMyActor>(actorId, new Uri("fabric:/MyApp/MyActorService"));

// This will invoke a method on the actor. If an actor with the given ID does not exist, it will be activated by this method call.
await myActor.DoWorkAsync();
// Create actor ID with some name
ActorId actorId = new ActorId("Actor1");

// This only creates a proxy object, it does not activate an actor or invoke any methods yet.
MyActor myActor = ActorProxyBase.create(actorId, new URI("fabric:/MyApp/MyActorService"), MyActor.class);

// This will invoke a method on the actor. If an actor with the given ID does not exist, it will be activated by this method call.
myActor.DoWorkAsync().get();

لاحظ أن المعلومتين المستخدمتين لإنشاء كائن وكيل الممثل هما معرف الممثل واسم التطبيق. يحدد معرف الممثل الممثل بشكل فريد، بينما يحدد اسم التطبيق تطبيق Service Fabric حيث يتم نشر الممثل.

تقوم ActorProxyفئة (C #) / ActorProxyBase(Java) على جانب العميل بتنفيذ الدقة اللازمة لتحديد موقع الممثل بواسطة ID وفتح قناة اتصال معه. كما أنه يعيد محاولة تحديد موقع الممثل في حالات فشل الاتصالات وتجاوزات الفشل. ونتيجة لذلك، يتميز تسليم الرسائل بالخصائص التالية:

  • تسليم الرسائل هو أفضل جهد.
  • قد يتلقى الممثلون رسائل مكررة من نفس العميل.

التزامن

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

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

Reliable Actors communication

الوصول القائم على الأدوار

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

يفرض وقت تشغيل الممثلين التزامن القائم على الأدوار من خلال الحصول على قفل لكل ممثل في بداية المنعطف وتحرير القفل في نهاية المنعطف. وبالتالي، يتم فرض التزامن القائم على الأدوار على أساس كل جهة فاعلة وليس عبر الجهات الفاعلة. يمكن تنفيذ أساليب الممثل وعمليات رد الاتصال بالمؤقت / التذكير في وقت واحد نيابة عن الجهات الفاعلة المختلفة.

يوضح المثال التالي المفاهيم المذكورة أعلاه. فكر في نوع ممثل ينفذ طريقتين غير متزامنتين (على سبيل المثال ، Method1 و Method2) ، ومؤقت ، وتذكير. يوضح الرسم البياني أدناه مثالا على جدول زمني لتنفيذ هذه الأساليب وعمليات رد الاتصال نيابة عن اثنين من الممثلين (ActorId1 و ActorId2) اللذين ينتميان إلى هذا النوع من الممثلين.

Reliable Actors runtime turn-based concurrency and access

يتبع هذا الرسم البياني هذه الاتفاقيات:

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

بعض النقاط المهمة التي يجب مراعاتها:

  • أثناء تنفيذ Method1 نيابة عن ActorId2 استجابة لطلب العميل xyz789 ، يصل طلب عميل آخر (abc123) يتطلب أيضا تنفيذ Method1 بواسطة ActorId2. ومع ذلك، لا يبدأ التنفيذ الثاني من Method1 حتى ينتهي التنفيذ السابق. وبالمثل ، يتم إطلاق تذكير مسجل بواسطة ActorId2 أثناء تنفيذ Method1 استجابة لطلب العميل xyz789. يتم تنفيذ معاودة الاتصال تذكير فقط بعد اكتمال كل من عمليات تنفيذ Method1 . كل هذا يرجع إلى التزامن القائم على الأدوار الذي يتم فرضه على ActorId2.
  • وبالمثل ، يتم أيضا فرض التزامن القائم على الأدوار ل ActorId1 ، كما يتضح من تنفيذ Method1 و Method2 و Callback المؤقت نيابة عن ActorId1 الذي يحدث بطريقة تسلسلية.
  • يتداخل تنفيذ Method1 نيابة عن ActorId1 مع تنفيذه نيابة عن ActorId2. وذلك لأن التزامن القائم على الأدوار يتم فرضه فقط داخل الجهة الفاعلة وليس عبر الجهات الفاعلة.
  • في بعض عمليات تنفيذ الطريقة/معاودة الاتصال، Taskينتهي (C#) / (Java) الذي يتم إرجاعه بواسطة الطريقة/ CompletableFutureمعاودة الاتصال بعد عودة الطريقة. في بعض الحالات الأخرى ، تكون العملية غير المتزامنة قد انتهت بالفعل بحلول الوقت الذي تعود فيه الطريقة / معاودة الاتصال. في كلتا الحالتين ، يتم تحرير القفل لكل ممثل فقط بعد إرجاع كل من الطريقة / رد الاتصال وانتهاء العملية غير المتزامنة.

إعادة الدخول

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

نطاق ضمانات التزامن

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

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

ابدأ من خلال إنشاء أول خدمة للممثلين الموثوقين: