إيقاف تشغيل الخادم بأمان
توفر خدمة Microsoft Azure SignalR وضعين لإيقاف تشغيل خادم SignalR Hub بأمان عند تكوين خدمة Azure SignalR كوضع افتراضي تعمل خدمة Azure SignalR كوكيل بين عملاء SignalR وخادم SignalR Hub.
تتمثل الميزة الرئيسية لاستخدام هذه الميزة في منع العميل من مواجهة انخفاضات الاتصال بشكل غير متوقع.
بدلا من ذلك، يمكنك إما انتظار اتصالات العميل لإغلاق نفسها فيما يتعلق بمنطق عملك، أو حتى ترحيل اتصال العميل إلى خادم آخر دون فقدان البيانات.
كيفية عمله
بشكل عام، ستكون هناك أربع مراحل في عملية إيقاف التشغيل بأمان:
تعيين الخادم دون اتصال
وهذا يعني أنه لن يتم توجيه المزيد من اتصالات العميل إلى هذا الخادم.
خطافات المشغل
OnShutdown
يمكنك تسجيل خطافات إيقاف التشغيل لكل مركز تملكه في الخادم الخاص بك. سيتم استدعاؤها فيما يتعلق بالطلب المسجل مباشرة بعد حصولنا على استجابة FINACK من خدمة Azure SignalR، ما يعني أنه تم تعيين هذا الخادم دون اتصال في خدمة Azure SignalR.
يمكنك بث الرسائل أو القيام ببعض مهام التنظيف في هذه المرحلة، بمجرد تنفيذ جميع خطافات إيقاف التشغيل، سننتقل إلى المرحلة التالية.
انتظر حتى تنتهي جميع اتصالات العميل، اعتمادا على الوضع الذي تختاره، فقد يكون:
تعيين الوضع إلى WaitForClientsToClose
ستحتفظ خدمة Azure SignalR بالعملاء الحاليين.
قد تضطر إلى تصميم طريقة، مثل بث رسالة إغلاق لجميع العملاء، ثم السماح لعملائك بتحديد وقت إغلاق/إعادة الاتصال نفسه.
اقرأ ChatSample لعينة الاستخدام، والتي نبث رسالة "خروج" لتشغيل إغلاق العميل في خطاف إيقاف التشغيل.
تعيين الوضع إلى MigrateClients
ستحاول خدمة Azure SignalR إعادة توجيه اتصال العميل على هذا الخادم إلى خادم صالح آخر.
في هذا السيناريو،
OnConnectedAsync
سيتم تشغيل وOnDisconnectedAsync
على الخادم الجديد والخادم القديم على التوالي مع مجموعةIConnectionMigrationFeature
فيContext
، والتي يمكن استخدامها لتحديد ما إذا كان يتم ترحيل اتصال العميل أو ترحيله. قد تكون هذه الميزة مفيدة خاصة للسيناريوهات ذات الحالة.سيتم ترحيل اتصال العميل على الفور بعد تسليم الرسالة الحالية، مما يعني أنه سيتم توجيه الرسالة التالية إلى الخادم الجديد.
إيقاف اتصالات الخادم
بعد إغلاق/ترحيل كافة اتصالات العميل، أو تجاوز المهلة (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);
}
}