تنفيذ ميزات مستوى الخدمة في خدمة المستخدم الخاص بك

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

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

استخدام خدمة المستخدم

يمكن لمثيلات المستخدم الوصول إلى خدمة المستخدم التي تعمل فيها. من خلال خدمة المستخدم، يمكن لمثيلات المستخدم الحصول على سياق الخدمة برمجياً. يحتوي سياق الخدمة على معرف القسم واسم الخدمة واسم التطبيق والمعلومات الأخرى الخاصة بالنظام الأساسي لـ Azure Service Fabric.

Task MyActorMethod()
{
    Guid partitionId = this.ActorService.Context.PartitionId;
    string serviceTypeName = this.ActorService.Context.ServiceTypeName;
    Uri serviceInstanceName = this.ActorService.Context.ServiceName;
    string applicationInstanceName = this.ActorService.Context.CodePackageActivationContext.ApplicationName;
}
CompletableFuture<?> MyActorMethod()
{
    UUID partitionId = this.getActorService().getServiceContext().getPartitionId();
    String serviceTypeName = this.getActorService().getServiceContext().getServiceTypeName();
    URI serviceInstanceName = this.getActorService().getServiceContext().getServiceName();
    String applicationInstanceName = this.getActorService().getServiceContext().getCodePackageActivationContext().getApplicationName();
}

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

static class Program
{
    private static void Main()
    {
        ActorRuntime.RegisterActorAsync<MyActor>().GetAwaiter().GetResult();

        Thread.Sleep(Timeout.Infinite);
    }
}

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

static class Program
{
    private static void Main()
    {
        ActorRuntime.RegisterActorAsync<MyActor>(
            (context, actorType) => new ActorService(context, actorType, () => new MyActor()))
            .GetAwaiter().GetResult();

        Thread.Sleep(Timeout.Infinite);
    }
}
static class Program
{
    private static void Main()
    {
      ActorRuntime.registerActorAsync(
              MyActor.class,
              (context, actorTypeInfo) -> new FabricActorService(context, actorTypeInfo),
              timeout);

        Thread.sleep(Long.MAX_VALUE);
    }
}

طرق خدمة المستخدم

تنفذ خدمة المستخدم IActorService (C#) أو ActorService (Java)، والتي بدورها تنفذ IService (C#) أو Service (Java). يتم استخدام هذه الواجهة بواسطة خدمات موثوق بها عن بُعد، ما يسمح باستدعاءات الإجراءات عن بُعد في أساليب الخدمة. تحتوي على أساليب على مستوى الخدمة يمكن استدعاؤها عن بُعد عبر خدمة الاتصال عن بُعد. يمكنك استخدامها في تعداد وحذف المستخدمين.

خدمة المستخدم المخصصة

باستخدام وظيفة lambda لتسجيل المستخدم، يمكنك تسجيل خدمة المستخدم المخصص الخاصة بك والمشتقة من ActorService (C#) وFabricActorService (Java). يمكنك بعد ذلك تنفيذ وظائف مستوى الخدمة الخاصة بك عن طريق كتابة فئة خدمة ترث ActorService (C#) أو FabricActorService (Java). تستورد خدمة المستخدم المخصص جميع وظائف وقت تشغيل المستخدمين من ActorService (C#) أو FabricActorService (Java). يمكن استخدامها لتنفيذ أساليب الخدمة الخاصة بك.

class MyActorService : ActorService
{
    public MyActorService(StatefulServiceContext context, ActorTypeInformation typeInfo, Func<ActorBase> newActor)
        : base(context, typeInfo, newActor)
    { }
}
class MyActorService extends FabricActorService
{
    public MyActorService(StatefulServiceContext context, ActorTypeInformation typeInfo, BiFunction<FabricActorService, ActorId, ActorBase> newActor)
    {
         super(context, typeInfo, newActor);
    }
}
static class Program
{
    private static void Main()
    {
        ActorRuntime.RegisterActorAsync<MyActor>(
            (context, actorType) => new MyActorService(context, actorType, () => new MyActor()))
            .GetAwaiter().GetResult();

        Thread.Sleep(Timeout.Infinite);
    }
}
public class Program
{
    public static void main(String[] args)
    {
        ActorRuntime.registerActorAsync(
                MyActor.class,
                (context, actorTypeInfo) -> new FabricActorService(context, actorTypeInfo),
                timeout);
        Thread.sleep(Long.MAX_VALUE);
    }
}

تنفيذ النسخ الاحتياطي واستعادة المستخدم

يمكن لخدمة المستخدم المخصصة الكشف عن طريقة لإجراء نسخ احتياطي لبيانات المستخدم من خلال الاستفادة من المستمع عن بُعد الموجود بالفعل في ActorService. على سبيل المثال، راجع Backup and restore actors.

المستخدم الذي يستخدم مكدس الذاكرة المؤقتة V2 (متوافق مع الواجهة) عن بعد

يحتوي مكدس الذاكرة المؤقتة V2 (المتوافق مع الواجهة، والمعروف باسم V2_1) عن بُعد على جميع ميزات مكدس الذاكرة المؤقتة للاتصال عن بُعد V2. واجهته متوافقة مع مكدس الذاكرة المؤقتة V1 عن بعد، لكنها غير متوافقة مع الإصدارات السابقة مع V2 وV1. للترقية من V1 إلى V2_1 بدون أي تأثير على توفر الخدمة، اتبع الخطوات الواردة في القسم التالي.

التغييرات التالية مطلوبة لاستخدام مكدس الذاكرة المؤقتة V2_1 للاتصال عن بُعد:

  1. أضف سمة التجميع التالية على واجهات المستخدم.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
    
  2. قم بإنشاء وترقية خدمة المستخدم ومشاريع العميل للممثل لبدء استخدام مكدس V2.

ترقية خدمة المستخدم إلى حزمة V2 (متوافقة مع الواجهة) عن بُعد دون التأثير على توفر الخدمة

هذا التغيير عبارة عن ترقية من خطوتين. اتبع الخطوات بهذا التسلسل.

  1. أضف سمة التجميع التالية على واجهات المستخدم. تبدأ هذه السمة مستمعين لخدمة المستخدم، V1 (موجود) ومستمع V2_1. قم بترقية خدمة المستخدم بهذا التغيير.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
    
  2. قم بترقية عملاء المستخدمين بعد إتمام الترقية السابقة. تتأكد هذه الخطوة من أن الوكيل المستخدم يستخدم مكدس V2_1 للاتصال عن بُعد.

  3. هذه الخطوة اختيارية. قم بتغيير السمة السابقة لإزالة وحدة الاستماع V1.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2_1,RemotingClientVersion = RemotingClientVersion.V2_1)]
    

المستخدم الذي يستخدم مكدس V2 للاتصال عن بعد

مع الإصدار 2.8 من حزمة NuGet، يمكن للمستخدمين الآن استخدام مكدس V2 عن بُعد، والذي يعمل بشكل أفضل ويوفر ميزات مثل التسلسل المخصص. لا يتوافق إصدار الاتصال عن بُعد V2 مع مكدس الاتصال عن بُعد الموجود (يسمى الآن مكدس الاتصال عن بُعد V1).

التغييرات التالية مطلوبة لاستخدام مكدس V2 للاتصال عن بعد.

  1. أضف سمة التجميع التالية على واجهات المستخدم.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
    
  2. قم بإنشاء وترقية خدمة المستخدم ومشاريع العميل للمستخدم لبدء استخدام مكدس V2.

ترقية خدمة المستخدم إلى مكدس V2 عن بُعد دون التأثير على توفر الخدمة

هذا التغيير عبارة عن ترقية من خطوتين. اتبع الخطوات بهذا التسلسل.

  1. أضف سمة التجميع التالية على واجهات المستخدم. تبدأ هذه السمة مستمعين لخدمة المستخدم، V1 (موجود) ومستمع V2. قم بترقية خدمة المستخدم بهذا التغيير.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V1|RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
    
  2. قم بترقية عملاء المستخدمين بعد إتمام الترقية السابقة. تتأكد هذه الخطوة من أن الوكيل المستخدم يستخدم مكدس V2 للاتصال عن بُعد.

  3. هذه الخطوة اختيارية. قم بتغيير السمة السابقة لإزالة وحدة الاستماع V1.

    [assembly:FabricTransportActorRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2,RemotingClientVersion = RemotingClientVersion.V2)]
    

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