إدارة حالة المستخدمين الموثوقين

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

استمرار الحالة والنسخ المتماثل

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

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

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

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

حالة مستمرة

[StatePersistence(StatePersistence.Persisted)]
class MyActor : Actor, IMyActor
{
}
@StatePersistenceAttribute(statePersistence = StatePersistence.Persisted)
class MyActorImpl  extends FabricActor implements MyActor
{
}

يستخدم هذا الإعداد موفر حالة يقوم بتخزين البيانات على القرص ويقوم بتعيين عدد النسخ المتماثلة للخدمة إلى 3 تلقائياً.

حالة متقلبة

[StatePersistence(StatePersistence.Volatile)]
class MyActor : Actor, IMyActor
{
}
@StatePersistenceAttribute(statePersistence = StatePersistence.Volatile)
class MyActorImpl extends FabricActor implements MyActor
{
}

يستخدم هذا الإعداد موفر حالة في الذاكرة فقط ويعين عدد النسخ المتماثلة إلى 3.

لا توجد حالة مستمرة

[StatePersistence(StatePersistence.None)]
class MyActor : Actor, IMyActor
{
}
@StatePersistenceAttribute(statePersistence = StatePersistence.None)
class MyActorImpl extends FabricActor implements MyActor
{
}

يستخدم هذا الإعداد موفر حالة في الذاكرة فقط ويعين عدد النسخ المتماثلة إلى 1.

الإعدادات الافتراضية والإعدادات التي تم إنشاؤها

عندما تستخدم السمة StatePersistence، يتم تحديد موفر الحالة تلقائياً لك في وقت التشغيل عند بدء خدمة المستخدم. ومع ذلك، يتم تعيين عدد النسخ المتماثلة في وقت الترجمة بواسطة أدوات إنشاء مستخدم Visual Studio. تنشئ أدوات الإنشاء تلقائياً خدمة افتراضية لخدمة المستخدم في Application Manifest.xml. يتم إنشاء المعلمات لـ الحد الأدنى لحجم مجموعة النسخ المتماثلة وحجم مجموعة النسخ المتماثلة المستهدفة.

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

<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="Application12Type" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
   <Parameters>
      <Parameter Name="MyActorService_PartitionCount" DefaultValue="10" />
      <Parameter Name="MyActorService_MinReplicaSetSize" DefaultValue="3" />
      <Parameter Name="MyActorService_TargetReplicaSetSize" DefaultValue="3" />
   </Parameters>
   <ServiceManifestImport>
      <ServiceManifestRef ServiceManifestName="MyActorPkg" ServiceManifestVersion="1.0.0" />
   </ServiceManifestImport>
   <DefaultServices>
      <Service Name="MyActorService" GeneratedIdRef="77d965dc-85fb-488c-bd06-c6c1fe29d593|Persisted">
         <StatefulService ServiceTypeName="MyActorServiceType" TargetReplicaSetSize="[MyActorService_TargetReplicaSetSize]" MinReplicaSetSize="[MyActorService_MinReplicaSetSize]">
            <UniformInt64Partition PartitionCount="[MyActorService_PartitionCount]" LowKey="-9223372036854775808" HighKey="9223372036854775807" />
         </StatefulService>
      </Service>
   </DefaultServices>
</ApplicationManifest>

مدير الحالة

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

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

يكشف مدير الحالة عن طرق القاموس الشائعة لإدارة الحالة، على غرار تلك الموجودة في Reliable Dictionary.

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

أفضل الممارسات

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

جعل حالة المستخدم متعدد المستويات قدر الإمكان

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

إدارة دورة حياة المستخدم بشكل صحيح

يجب أن يكون لديك نهج واضح حول إدارة حجم الحالة في كل قسم من خدمة المستخدم. يجب أن يكون لخدمة المستخدم الخاص بك عدد ثابت من المستخدمين وإعادة استخدامها قدر الإمكان. إذا كنت تنشئ مستخدمين جددًا باستمرار، فيجب حذفهم بمجرد الانتهاء من عملهم. يقوم إطار عمل المستخدم بتخزين بعض بيانات التعريف حول كل مستخدم موجود. لا يؤدي حذف جميع حالات المستخدم إلى إزالة بيانات التعريف الخاصة بهذا المستخدم. يجب حذف المستخدم (راجع deleting actors and their state) لإزالة جميع المعلومات المتعلقة به والمخزنة في النظام. يجب عليك الاستعلام عن خدمة المستخدم (راجع enumerating actors) من حين لآخر للتأكد من أن عدد المستخدمين ضمن النطاق المتوقع كفحص إضافي.

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

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

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

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