إيقاف تشغيل الخادم بأمان

توفر خدمة Microsoft Azure SignalR وضعين لإيقاف تشغيل خادم SignalR Hub بأمان عند تكوين خدمة Azure SignalR كوضع افتراضي تعمل خدمة Azure SignalR كوكيل بين عملاء SignalR وخادم SignalR Hub.

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

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

كيفية عمله

بشكل عام، ستكون هناك أربع مراحل في عملية إيقاف التشغيل بأمان:

  1. تعيين الخادم دون اتصال

    وهذا يعني أنه لن يتم توجيه المزيد من اتصالات العميل إلى هذا الخادم.

  2. خطافات المشغل OnShutdown

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

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

  3. انتظر حتى تنتهي جميع اتصالات العميل، اعتمادا على الوضع الذي تختاره، فقد يكون:

    تعيين الوضع إلى WaitForClientsToClose

    ستحتفظ خدمة Azure SignalR بالعملاء الحاليين.

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

    اقرأ ChatSample لعينة الاستخدام، والتي نبث رسالة "خروج" لتشغيل إغلاق العميل في خطاف إيقاف التشغيل.

    تعيين الوضع إلى MigrateClients

    ستحاول خدمة Azure SignalR إعادة توجيه اتصال العميل على هذا الخادم إلى خادم صالح آخر.

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

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

  4. إيقاف اتصالات الخادم

    بعد إغلاق/ترحيل كافة اتصالات العميل، أو تجاوز المهلة (30s افتراضيا)،

    سيتابع SignalR Server SDK عملية إيقاف التشغيل إلى هذه المرحلة، ويغلق جميع اتصالات الخادم.

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

نماذج التعليمات البرمجية.

أضف الخيارات التالية عند AddAzureSignalR:

services.AddSignalR().AddAzureSignalR(option =>
{
    option.GracefulShutdown.Mode = GracefulShutdownMode.WaitForClientsClose;
    // option.GracefulShutdown.Mode = GracefulShutdownMode.MigrateClients;
    option.GracefulShutdown.Timeout = TimeSpan.FromSeconds(30);

    option.GracefulShutdown.Add<Chat>(async (c) =>
    {
        await c.Clients.All.SendAsync("exit");
    });
});

قم بتكوين OnConnected وأثناء OnDisconnected تعيين وضع إيقاف التشغيل الآمن إلى MigrateClients.

لقد قدمنا "I الاتصال ionMigrationFeature" للإشارة إلى ما إذا كان يتم ترحيل اتصال داخل/خارج.

public class Chat : Hub {

    public override async Task OnConnectedAsync()
    {
        Console.WriteLine($"{Context.ConnectionId} connected.");

        var feature = Context.Features.Get<IConnectionMigrationFeature>();
        if (feature != null)
        {
            Console.WriteLine($"[{feature.MigrateTo}] {Context.ConnectionId} is migrated from {feature.MigrateFrom}.");
            // Your business logic.
        }

        await base.OnConnectedAsync();
    }

    public override async Task OnDisconnectedAsync(Exception e)
    {
        Console.WriteLine($"{Context.ConnectionId} disconnected.");

        var feature = Context.Features.Get<IConnectionMigrationFeature>();
        if (feature != null)
        {
            Console.WriteLine($"[{feature.MigrateFrom}] {Context.ConnectionId} will be migrated to {feature.MigrateTo}.");
            // Your business logic.
        }

        await base.OnDisconnectedAsync(e);
    }
}