Kiszolgáló kecses leállítása
A Microsoft Azure SignalR Service két módot biztosít a SignalR Hub-kiszolgáló kecses leállításához, ha az Azure SignalR Service alapértelmezett módként van konfigurálva, amelyet az Azure SignalR Szolgáltatás proxyként használ a SignalR-ügyfelek és a SignalR Hub-kiszolgáló között.
A funkció használatának fő előnye, hogy megakadályozza, hogy az ügyfél váratlan kapcsolatcsökkenést tapasztaljon.
Ehelyett megvárhatja, amíg az ügyfélkapcsolatok bezárulnak az üzleti logikával kapcsolatban, vagy akár át is migrálhatja az ügyfélkapcsolatot egy másik kiszolgálóra adatok elvesztése nélkül.
How it works
Egy kecses leállítási folyamatnak általában négy szakasza lesz:
A kiszolgáló offline beállítása
Ez azt jelenti, hogy nem lesz több ügyfélkapcsolat erre a kiszolgálóra irányítva.
Triggerhook
OnShutdown
A leállítási horgokat regisztrálhatja minden olyan központhoz, amely a kiszolgálón található. A rendszer közvetlenül azután hívja meg őket a regisztrált megrendeléssel kapcsolatban, hogy finACK-választ kaptunk az Azure SignalR szolgáltatástól, ami azt jelenti, hogy ez a kiszolgáló offline állapotba lett állítva az Azure SignalR szolgáltatásban.
Küldhet üzeneteket, vagy elvégezhet néhány tisztítási feladatot ebben a szakaszban, ha az összes leállítási horog végrehajtása megtörtént, a következő szakaszra lépünk.
Várjon, amíg az összes ügyfélkapcsolat befejeződik, a választott módtól függően a következő lehet:
Mode set to WaitForClientsToClose
Az Azure SignalR szolgáltatás meglévő ügyfeleket fog tárolni.
Előfordulhat, hogy meg kell terveznie egy módszert, például egy záró üzenetet kell elküldenie az összes ügyfélnek, majd hagyhatja, hogy az ügyfelek eldöntsék, mikor zárják be/kapcsolják újra.
Olvassa el a ChatSample-et a mintahasználathoz, amelyet egy kilépési üzenetet küldünk az ügyfél bezárásának aktiválásához a leállítási horogban.
A MigrateClients mód beállítása
Az Azure SignalR Service megpróbálja átirányítani a kiszolgáló ügyfélkapcsolatát egy másik érvényes kiszolgálóra.
Ebben a forgatókönyvben
OnConnectedAsync
OnDisconnectedAsync
a rendszer aktiválódik az új kiszolgálón és a régi kiszolgálón egyIConnectionMigrationFeature
készlettelContext
, amely alapján megállapítható, hogy az ügyfélkapcsolat migrálva vagy migrálva lett-e. Ez a funkció különösen állapotalapú forgatókönyvek esetén lehet hasznos.Az ügyfélkapcsolat az aktuális üzenet kézbesítése után azonnal át lesz migrálva, ami azt jelenti, hogy a következő üzenet az új kiszolgálóra lesz irányítva.
Kiszolgálókapcsolatok leállítása
Miután az összes ügyfélkapcsolatot bezárták/migrálták, vagy túllépték az időtúllépést (alapértelmezés szerint 30-at),
A SignalR Server SDK ebben a szakaszban folytatja a leállítási folyamatot, és bezárja az összes kiszolgálókapcsolatot.
Az ügyfélkapcsolatok továbbra is megszakadnak, ha nem sikerült bezárni/migrálni. Nincs például megfelelő célkiszolgáló/aktuális ügyfél-kiszolgáló üzenet, amely nem fejeződött be.
Mintakódok.
Adja hozzá a következő beállításokat, amikor 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");
});
});
konfigurálja OnConnected
és OnDisconnected
miközben a kecses leállítási módot a értékre állítja MigrateClients
.
Bevezettünk egy "I Csatlakozás ionMigrationFeature"-t, amely jelzi, hogy a kapcsolat migrálása folyamatban van-e.
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);
}
}