Serverns respitkänsliga avstängning
Microsoft Azure SignalR Service tillhandahåller två lägen för att på ett smidigt sätt stänga av en SignalR Hub-server när Azure SignalR Service har konfigurerats som standardläge som Azure SignalR Service fungerar som en proxy mellan SignalR-klienterna och SignalR Hub-servern.
Den största fördelen med att använda den här funktionen är att förhindra att kunden oväntat får avbrott i anslutningen.
I stället kan du antingen vänta på att klientanslutningarna stänger sig med avseende på din affärslogik eller till och med migrera klientanslutningen till en annan server utan att förlora data.
Så här fungerar det
I allmänhet kommer det att finnas fyra steg i en graciös avstängningsprocess:
Ställ in servern offline
Det innebär att inga fler klientanslutningar dirigeras till den här servern.
Utlösarkrokar
OnShutdown
Du kan registrera avstängningskrokar för varje hubb som du har ägt på servern. De kommer att anropas med avseende på den registrerade ordern direkt efter att vi fick ett FINACK-svar från vår Azure SignalR Service, vilket innebär att den här servern har ställts in offline i Azure SignalR Service.
Du kan sända meddelanden eller göra några rengöringsjobb i det här steget, när alla avstängningskrokar har körts går vi vidare till nästa steg.
Vänta tills alla klientanslutningar har slutförts, beroende på vilket läge du väljer, det kan vara:
Läge inställt på WaitForClientsToClose
Azure SignalR Service kommer att innehålla befintliga klienter.
Du kan behöva utforma ett sätt, till exempel att sända ett avslutande meddelande till alla klienter, och sedan låta dina klienter bestämma när de ska stänga/återansluta sig själv.
Läs ChatSample för exempelanvändning, som vi sänder ett "exit"-meddelande för att utlösa klientens stängning i avstängningskroken.
Läge inställt på MigrateClients
Azure SignalR Service försöker omdirigera klientanslutningen på den här servern till en annan giltig server.
I det här scenariot
OnConnectedAsync
utlöses ochOnDisconnectedAsync
på den nya servern respektive den gamla servern med enIConnectionMigrationFeature
uppsättning iContext
, som kan användas för att identifiera om klientanslutningen migrerades in eller migrerades ut. Den här funktionen kan vara användbar särskilt för tillståndskänsliga scenarier.Klientanslutningen migreras omedelbart efter att det aktuella meddelandet har levererats, vilket innebär att nästa meddelande dirigeras till den nya servern.
Stoppa serveranslutningar
När alla klientanslutningar har stängts/migrerats eller tidsgränsen (30-talet som standard) har överskridits,
SignalR Server SDK fortsätter avstängningsprocessen till det här steget och stänger alla serveranslutningar.
Klientanslutningar tas fortfarande bort om det inte kunde stängas/migreras. Till exempel har inget lämpligt målserver/aktuellt klient-till-server-meddelande inte slutförts.
Exempelkoder.
Lägg till följande alternativ när 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");
});
});
konfigurera OnConnected
och OnDisconnected
när du ställer in ett graciöst avstängningsläge på MigrateClients
.
Vi har introducerat en "I Anslut ionMigrationFeature" för att ange om en anslutning migrerades in/ut.
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);
}
}