Škálování služby SignalR s několika instancemi
Sada SIGNALR Service SDK podporuje více koncových bodů pro instance služby SignalR. Pomocí této funkce můžete škálovat souběžná připojení nebo ji použít pro zasílání zpráv mezi oblastmi.
Důležité
Nezpracované připojovací řetězec se v tomto článku zobrazují jenom pro demonstrační účely.
Připojovací řetězec obsahuje informace o autorizaci vyžadované pro vaši aplikaci pro přístup ke službě Azure Web PubSub. Přístupový klíč uvnitř připojovací řetězec je podobný kořenovému heslu pro vaši službu. V produkčních prostředích vždy chraňte přístupové klíče. Pomocí služby Azure Key Vault můžete bezpečně spravovat a obměňovat klíče a zabezpečit připojovací řetězec pomocí ID Microsoft Entra a autorizovat přístup pomocí Microsoft Entra ID.
Vyhněte se distribuci přístupových klíčů ostatním uživatelům, jejich pevnému kódování nebo jejich uložení kdekoli ve formátu prostého textu, který je přístupný ostatním uživatelům. Otočte klíče, pokud se domníváte, že mohly být ohroženy.
Pro ASP.NET Core
Přidání několika koncových bodů z konfigurace
Nezpracované připojovací řetězec se v tomto článku zobrazují jenom pro demonstrační účely. V produkčních prostředích vždy chraňte přístupové klíče. Pomocí služby Azure Key Vault můžete bezpečně spravovat a obměňovat klíče a zabezpečit připojovací řetězec pomocí ID Microsoft Entra a autorizovat přístup pomocí Microsoft Entra ID.
Nakonfigurujte klíč Azure:SignalR:ConnectionString
nebo Azure:SignalR:ConnectionString:
pro službu SignalR Service připojovací řetězec.
Pokud klíč začíná Azure:SignalR:ConnectionString:
, měl by být ve formátu Azure:SignalR:ConnectionString:{Name}:{EndpointType}
, kde Name
a EndpointType
jsou vlastnosti objektu ServiceEndpoint
a jsou přístupné z kódu.
Pomocí následujících dotnet
příkazů můžete přidat více připojovací řetězec instancí:
dotnet user-secrets set Azure:SignalR:ConnectionString:east-region-a <ConnectionString1>
dotnet user-secrets set Azure:SignalR:ConnectionString:east-region-b:primary <ConnectionString2>
dotnet user-secrets set Azure:SignalR:ConnectionString:backup:secondary <ConnectionString3>
Přidání několika koncových bodů z kódu
Třída ServiceEndpoint
popisuje vlastnosti koncového bodu služby Azure SignalR.
Při použití sady SDK služby Azure SignalR můžete nakonfigurovat více koncových bodů instance prostřednictvím:
services.AddSignalR()
.AddAzureSignalR(options =>
{
options.Endpoints = new ServiceEndpoint[]
{
// Note: this is just a demonstration of how to set options.Endpoints
// Having ConnectionStrings explicitly set inside the code is not encouraged
// You can fetch it from a safe place such as Azure KeyVault
new ServiceEndpoint("<ConnectionString0>"),
new ServiceEndpoint("<ConnectionString1>", type: EndpointType.Primary, name: "east-region-a"),
new ServiceEndpoint("<ConnectionString2>", type: EndpointType.Primary, name: "east-region-b"),
new ServiceEndpoint("<ConnectionString3>", type: EndpointType.Secondary, name: "backup"),
};
});
Přizpůsobení směrovače koncových bodů
Ve výchozím nastavení sada SDK k vyzvednutí koncových bodů používá DefaultEndpointRouter .
Výchozí chování
Směrování požadavků klienta:
Když klient
/negotiate
se serverem aplikace. Sada SDK ve výchozím nastavení náhodně vybere jeden koncový bod ze sady dostupných koncových bodů služby.Směrování zpráv serveru:
Při odesílání zprávy do konkrétního připojení a cílové připojení je směrováno na aktuální server, zpráva přejde přímo do daného připojeného koncového bodu. Jinak se zprávy vysílají do každého koncového bodu Azure SignalR.
Přizpůsobení algoritmu směrování
Vlastní směrovač můžete vytvořit, když máte speciální znalosti, abyste zjistili, na které koncové body mají zprávy přejít.
Následující příklad definuje vlastní směrovač, který směruje zprávy se skupinou začínající east-
na koncový bod s názvem east
:
private class CustomRouter : EndpointRouterDecorator
{
public override IEnumerable<ServiceEndpoint> GetEndpointsForGroup(string groupName, IEnumerable<ServiceEndpoint> endpoints)
{
// Override the group broadcast behavior, if the group name starts with "east-", only send messages to endpoints inside east
if (groupName.StartsWith("east-"))
{
return endpoints.Where(e => e.Name.StartsWith("east-"));
}
return base.GetEndpointsForGroup(groupName, endpoints);
}
}
Následující příklad přepíše výchozí chování vyjednávání a vybere koncový bod v závislosti na umístění aplikačního serveru.
private class CustomRouter : EndpointRouterDecorator
{ public override ServiceEndpoint GetNegotiateEndpoint(HttpContext context, IEnumerable<ServiceEndpoint> endpoints)
{
// Sample code showing how to choose endpoints based on the incoming request endpoint query
var endpointName = context.Request.Query["endpoint"].FirstOrDefault() ?? "";
// Select from the available endpoints, don't construct a new ServiceEndpoint object here
return endpoints.FirstOrDefault(s => s.Name == endpointName && s.Online) // Get the endpoint with name matching the incoming request
?? base.GetNegotiateEndpoint(context, endpoints); // Or fallback to the default behavior to randomly select one from primary endpoints, or fallback to secondary when no primary ones are online
}
}
Nezapomeňte zaregistrovat směrovač do kontejneru DI pomocí:
services.AddSingleton(typeof(IEndpointRouter), typeof(CustomRouter));
services.AddSignalR()
.AddAzureSignalR(
options =>
{
options.Endpoints = new ServiceEndpoint[]
{
new ServiceEndpoint(name: "east", connectionString: "<connectionString1>"),
new ServiceEndpoint(name: "west", connectionString: "<connectionString2>"),
new ServiceEndpoint("<connectionString3>")
};
});
ServiceOptions.Endpoints
podporuje také opětovné načítání za provozu. Následující ukázkový kód ukazuje, jak načíst připojovací řetězec z jedné konfigurační části a veřejné adresy URL vystavené reverzními proxy servery z jiného a pokud konfigurace podporuje opětovné načítání za provozu, můžou se koncové body průběžně aktualizovat.
services.Configure<ServiceOptions>(o =>
{
o.Endpoints = [
new ServiceEndpoint(Configuration["ConnectionStrings:AzureSignalR:East"], name: "east")
{
ClientEndpoint = new Uri(Configuration.GetValue<string>("PublicClientEndpoints:East"))
},
new ServiceEndpoint(Configuration["ConnectionStrings:AzureSignalR:West"], name: "west")
{
ClientEndpoint = new Uri(Configuration.GetValue<string>("PublicClientEndpoints:West"))
},
];
});
Pro ASP.NET
Přidání několika koncových bodů z konfigurace
Konfigurace s klíčem Azure:SignalR:ConnectionString
nebo Azure:SignalR:ConnectionString:
pro službu SignalR Service připojovací řetězec
Pokud klíč začíná Azure:SignalR:ConnectionString:
, měl by být ve formátu Azure:SignalR:ConnectionString:{Name}:{EndpointType}
, kde Name
a EndpointType
jsou vlastnosti objektu ServiceEndpoint
a jsou přístupné z kódu.
Můžete přidat více instancí připojovací řetězec doweb.config
:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="Azure:SignalR:ConnectionString" connectionString="<ConnectionString1>"/>
<add name="Azure:SignalR:ConnectionString:en-us" connectionString="<ConnectionString2>"/>
<add name="Azure:SignalR:ConnectionString:zh-cn:secondary" connectionString="<ConnectionString3>"/>
<add name="Azure:SignalR:ConnectionString:Backup:secondary" connectionString="<ConnectionString4>"/>
</connectionStrings>
...
</configuration>
Přidání několika koncových bodů z kódu
Třída ServiceEndpoint
popisuje vlastnosti koncového bodu služby Azure SignalR.
Při použití sady SDK služby Azure SignalR můžete nakonfigurovat více koncových bodů instance prostřednictvím:
app.MapAzureSignalR(
this.GetType().FullName,
options => {
options.Endpoints = new ServiceEndpoint[]
{
// Note: this is just a demonstration of how to set options. Endpoints
// Having ConnectionStrings explicitly set inside the code is not encouraged.
// You can fetch it from a safe place such as Azure KeyVault
new ServiceEndpoint("<ConnectionString1>"),
new ServiceEndpoint("<ConnectionString2>"),
new ServiceEndpoint("<ConnectionString3>"),
}
});
Přizpůsobení směrovače
Jediný rozdíl mezi ASP.NET SignalR a ASP.NET Core SignalR je typ kontextu http pro GetNegotiateEndpoint
. Pro ASP.NET SignalR se jedná o typ IOwinContext .
Následující kód je vlastní příklad vyjednávání pro ASP.NET SignalR:
private class CustomRouter : EndpointRouterDecorator
{
public override ServiceEndpoint GetNegotiateEndpoint(IOwinContext context, IEnumerable<ServiceEndpoint> endpoints)
{
// Sample code showing how to choose endpoints based on the incoming request endpoint query
var endpointName = context.Request.Query["endpoint"] ?? "";
// Select from the available endpoints, don't construct a new ServiceEndpoint object here
return endpoints.FirstOrDefault(s => s.Name == endpointName && s.Online) // Get the endpoint with name matching the incoming request
?? base.GetNegotiateEndpoint(context, endpoints); // Or fallback to the default behavior to randomly select one from primary endpoints, or fallback to secondary when no primary ones are online
}
}
Nezapomeňte zaregistrovat směrovač do kontejneru DI pomocí:
var hub = new HubConfiguration();
var router = new CustomRouter();
hub.Resolver.Register(typeof(IEndpointRouter), () => router);
app.MapAzureSignalR(GetType().FullName, hub, options => {
options.Endpoints = new ServiceEndpoint[]
{
new ServiceEndpoint(name: "east", connectionString: "<connectionString1>"),
new ServiceEndpoint(name: "west", connectionString: "<connectionString2>"),
new ServiceEndpoint("<connectionString3>")
};
});
Metriky koncového bodu služby
Pokud chcete povolit pokročilý směrovač, sada SDK serveru SignalR poskytuje více metrik, které serveru pomáhají při inteligentních rozhodnutích. Vlastnosti jsou pod položkou ServiceEndpoint.EndpointMetrics
.
Název metriky | Popis |
---|---|
ClientConnectionCount |
Celkový počet souběžných klientských připojení ve všech centrech pro koncový bod služby |
ServerConnectionCount |
Celkový počet souběžných připojení k serveru ve všech centrech koncového bodu služby |
ConnectionCapacity |
Celková kvóta připojení pro koncový bod služby, včetně připojení klienta a serveru |
Následující kód je příkladem přizpůsobení směrovače podle ClientConnectionCount
.
private class CustomRouter : EndpointRouterDecorator
{
public override ServiceEndpoint GetNegotiateEndpoint(HttpContext context, IEnumerable<ServiceEndpoint> endpoints)
{
return endpoints.OrderBy(x => x.EndpointMetrics.ClientConnectionCount).FirstOrDefault(x => x.Online) // Get the available endpoint with minimal clients load
?? base.GetNegotiateEndpoint(context, endpoints); // Or fallback to the default behavior to randomly select one from primary endpoints, or fallback to secondary when no primary ones are online
}
}
Dynamické škálovací body ServiceEndpoints
Ze sady SDK verze 1.5.0 nejprve povolujeme dynamické škálování ServiceEndpoints pro verzi ASP.NET Core. Proto nemusíte restartovat aplikační server, když potřebujete přidat nebo odebrat ServiceEndpoint. Vzhledem k tomu, že ASP.NET Core podporuje výchozí konfiguraci, jako je tomu appsettings.json
u reloadOnChange: true
, nemusíte měnit kód a podporuje ho příroda. A pokud chcete přidat vlastní konfiguraci a pracovat s opětovným načítáním za provozu, přečtěte si informace o konfiguraci v ASP.NET Core.
Poznámka:
Vzhledem k tomu, že doba nastavení připojení mezi serverem, službou a klientem nebo službou se může lišit, abychom zajistili, že během procesu škálování nedojde ke ztrátě zpráv, čekáme na přípravu připojení k serveru před otevřením nového serviceEndpointu klientům. Dokončení obvykle trvá několik sekund a uvidíte zprávu protokolu, jako Succeed in adding endpoint: '{endpoint}'
je zpráva o dokončení procesu.
V některýchočekávaných V těchto případech se doporučuje restartovat aplikační server, když zjistíte, že proces škálování nefunguje správně.
Výchozí časový limit pro měřítko je 5 minut a dá se přizpůsobit změnou hodnoty v ServiceOptions.ServiceScaleTimeout
. Pokud máte hodně aplikačních serverů, doporučujeme o něco více rozšířit hodnotu.
Poznámka:
Funkce více koncových bodů je v současné době podporována pouze u Persistent
typu přenosu.
Pro rozšíření SignalR Functions
Konfigurace
Pokud chcete povolit více instancí služby SignalR, měli byste:
Použijte
Persistent
typ přenosu.Výchozí typ přenosu je
Transient
režim. Do souboru nebo nastavení aplikace vlocal.settings.json
Azure byste měli přidat následující položku.{ "AzureSignalRServiceTransportType":"Persistent" }
Poznámka:
Při přechodu z
Transient
režimu do režimu může dojít kePersistent
změně chování serializace JSON, protože vTransient
režimu seNewtonsoft.Json
knihovna používá k serializaci argumentů metod centra, ale v režimuPersistent
seSystem.Text.Json
knihovna používá jako výchozí.System.Text.Json
má některé klíčové rozdíly ve výchozím chování sNewtonsoft.Json
. Pokud chcete použítNewtonsoft.Json
režimPersistent
, můžete přidat položku konfigurace:"Azure:SignalR:HubProtocol":"NewtonsoftJson"
vlocal.settings.json
souboru neboAzure__SignalR__HubProtocol=NewtonsoftJson
na webu Azure Portal.Nakonfigurujte několik položek koncových bodů služby SignalR v konfiguraci.
Objekt používáme
ServiceEndpoint
k reprezentaci instance služby SignalR. Koncový bod služby můžete definovat pomocí jejího<EndpointName>
a<EndpointType>
vstupního klíče a připojovací řetězec v hodnotě položky. Klíče jsou v následujícím formátu:Azure:SignalR:Endpoints:<EndpointName>:<EndpointType>
<EndpointType>
je nepovinný a výchozí hodnotaprimary
je . Projděte si následující ukázky:{ "Azure:SignalR:Endpoints:EastUs":"<ConnectionString>", "Azure:SignalR:Endpoints:EastUs2:Secondary":"<ConnectionString>", "Azure:SignalR:Endpoints:WestUs:Primary":"<ConnectionString>" }
Poznámka:
Při konfiguraci koncových bodů Azure SignalR ve službě App Service na webu Azure Portal nezapomeňte nahradit
":"
"__"
dvojitým podtržítkem v klíčích. Z důvodů se podívejte na proměnné prostředí.Připojovací řetězec nakonfigurovaný s klíčem
{ConnectionStringSetting}
(výchozí hodnota je AzureSignalRConnectionString) se také rozpozná jako primární koncový bod služby s prázdným názvem. Tento styl konfigurace se ale nedoporučuje pro více koncových bodů.
Směrování
Výchozí chování
Vazba funkcí ve výchozím nastavení používá k vyzvednutí koncových bodů defaultEndpointRouter .
Směrování klientů: Náhodně vyberte jeden koncový bod z primárních online koncových bodů. Pokud jsou všechny primární koncové body offline, náhodně vyberte jeden sekundární online koncový bod. Pokud se výběr znovu nezdaří, vyvolá se výjimka.
Směrování zpráv serveru: Vrátí se všechny koncové body služby.
Vlastní nastavení
Model v procesu jazyka C#
Postup je následující:
Implementujte přizpůsobený směrovač. K rozhodování o směrování můžete využít informace, které
ServiceEndpoint
jsou k dispozici. Průvodce najdete tady: customize-route-algorithm. Mějte na paměti, že trigger HTTP je vyžadován ve funkci vyjednávání, pokud potřebujeteHttpContext
ve vlastní metodě vyjednávání.Zaregistrujte směrovač do kontejneru DI.
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Azure.SignalR;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(SimpleChatV3.Startup))]
namespace SimpleChatV3
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSingleton<IEndpointRouter, CustomizedRouter>();
}
}
}
Model izolovaného procesu
Pro funkce spuštěné v izolovaném modelu procesu podporujeme zadávání cílových koncových bodů v jednotlivých žádostech. K získání informací o koncovém bodu použijete nové typy vazeb.
Směrování z klienta
Vazba SignalRConnectionInfo
vybere jeden koncový bod podle výchozího pravidla směrování. Pokud chcete přizpůsobit pravidlo směrování, měli byste místo vazby SignalRConnectionInfo
použít SignalRNegotiation
vazbu.
SignalRNegotiation
vlastnosti konfigurace vazby jsou stejné jako SignalRConnectionInfo
vlastnosti . Tady je function.json
ukázka souboru:
{
"type": "signalRNegotiation",
"name": "negotiationContext",
"hubName": "<HubName>",
"direction": "in"
}
Můžete také přidat další data vazby, například userId
idToken
, a claimTypeList
stejně jako SignalRConnectionInfo
.
Objekt, který získáte z SignalRNegotiation
vazby, je v následujícím formátu:
{
"endpoints": [
{
"endpointType": "Primary",
"name": "<EndpointName>",
"endpoint": "https://****.service.signalr.net",
"online": true,
"connectionInfo": {
"url": "<client-access-url>",
"accessToken": "<client-access-token>"
}
},
{
"...": "..."
}
]
}
Tady je ukázka použití JavaScriptu vazby SignalRNegotiation
:
module.exports = function (context, req, negotiationContext) {
var userId = req.query.userId;
if (userId.startsWith("east-")) {
//return the first endpoint whose name starts with "east-" and status is online.
context.res.body = negotiationContext.endpoints.find(endpoint => endpoint.name.startsWith("east-") && endpoint.online).connectionInfo;
}
else {
//return the first online endpoint
context.res.body = negotiationContext.endpoints.filter(endpoint => endpoint.online)[0].connectionInfo;
}
}
Směrování zpráv
Směrování zpráv nebo akcí potřebuje ke spolupráci dva typy vazeb. Obecně platí, že nejprve potřebujete nový typ SignalREndpoints
vstupní vazby, abyste získali všechny dostupné informace o koncovém bodu. Potom vyfiltrujete koncové body a získáte pole obsahující všechny koncové body, na které chcete odeslat. Nakonec zadáte cílové koncové body ve SignalR
výstupní vazbě.
Tady jsou vlastnosti konfigurace vazby SignalREndpoints
v functions.json
souboru:
{
"type": "signalREndpoints",
"direction": "in",
"name": "endpoints",
"hubName": "<HubName>"
}
Objekt, ze SignalREndpoints
kterého získáte, je pole koncových bodů, z nichž každý je reprezentován jako objekt JSON s následujícím schématem:
{
"endpointType": "<EndpointType>",
"name": "<EndpointName>",
"endpoint": "https://****.service.signalr.net",
"online": true
}
Po získání pole cílového koncového bodu přidejte do výstupního endpoints
objektu vazby vlastnost. Toto je příklad JavaScriptu:
module.exports = function (context, req, endpoints) {
var targetEndpoints = endpoints.filter(endpoint => endpoint.name.startsWith("east-"));
context.bindings.signalRMessages = [{
"target": "chat",
"arguments": ["hello-world"],
"endpoints": targetEndpoints,
}];
context.done();
}
Sada SDK pro správu
Přidání několika koncových bodů z konfigurace
Nakonfigurujte klíč Azure:SignalR:Endpoints
pro službu SignalR Service připojovací řetězec. Klíč by měl být ve formátu Azure:SignalR:Endpoints:{Name}:{EndpointType}
, kde Name
a EndpointType
jsou vlastnosti objektu ServiceEndpoint
a jsou přístupné z kódu.
Pomocí následujících dotnet
příkazů můžete přidat více připojovací řetězec instancí:
dotnet user-secrets set Azure:SignalR:Endpoints:east-region-a <ConnectionString1>
dotnet user-secrets set Azure:SignalR:Endpoints:east-region-b:primary <ConnectionString2>
dotnet user-secrets set Azure:SignalR:Endpoints:backup:secondary <ConnectionString3>
Přidání několika koncových bodů z kódu
Třída ServiceEndpoint
popisuje vlastnosti koncového bodu služby Azure SignalR.
Při použití sady SDK pro správu Azure SignalR můžete nakonfigurovat více koncových bodů instance prostřednictvím:
var serviceManager = new ServiceManagerBuilder()
.WithOptions(option =>
{
options.Endpoints = new ServiceEndpoint[]
{
// Note: this is just a demonstration of how to set options.Endpoints
// Having ConnectionStrings explicitly set inside the code is not encouraged
// You can fetch it from a safe place such as Azure KeyVault
new ServiceEndpoint("<ConnectionString0>"),
new ServiceEndpoint("<ConnectionString1>", type: EndpointType.Primary, name: "east-region-a"),
new ServiceEndpoint("<ConnectionString2>", type: EndpointType.Primary, name: "east-region-b"),
new ServiceEndpoint("<ConnectionString3>", type: EndpointType.Secondary, name: "backup"),
};
})
.BuildServiceManager();
Přizpůsobení směrovače koncových bodů
Ve výchozím nastavení sada SDK k vyzvednutí koncových bodů používá DefaultEndpointRouter .
Výchozí chování
Směrování požadavků klienta:
Když klient
/negotiate
se serverem aplikace. Sada SDK ve výchozím nastavení náhodně vybere jeden koncový bod ze sady dostupných koncových bodů služby.Směrování zpráv serveru:
Při odesílání zprávy do konkrétního připojení a cílové připojení je směrováno na aktuální server, zpráva přejde přímo do daného připojeného koncového bodu. Jinak se zprávy vysílají do každého koncového bodu Azure SignalR.
Přizpůsobení algoritmu směrování
Vlastní směrovač můžete vytvořit, když máte speciální znalosti, abyste zjistili, na které koncové body mají zprávy přejít.
Následující příklad definuje vlastní směrovač, který směruje zprávy se skupinou začínající east-
na koncový bod s názvem east
:
private class CustomRouter : EndpointRouterDecorator
{
public override IEnumerable<ServiceEndpoint> GetEndpointsForGroup(string groupName, IEnumerable<ServiceEndpoint> endpoints)
{
// Override the group broadcast behavior, if the group name starts with "east-", only send messages to endpoints inside east
if (groupName.StartsWith("east-"))
{
return endpoints.Where(e => e.Name.StartsWith("east-"));
}
return base.GetEndpointsForGroup(groupName, endpoints);
}
}
Následující příklad přepíše výchozí chování vyjednávání a vybere koncový bod v závislosti na umístění aplikačního serveru.
private class CustomRouter : EndpointRouterDecorator
{ public override ServiceEndpoint GetNegotiateEndpoint(HttpContext context, IEnumerable<ServiceEndpoint> endpoints)
{
// Override the negotiate behavior to get the endpoint from query string
var endpointName = context.Request.Query["endpoint"];
if (endpointName.Count == 0)
{
context.Response.StatusCode = 400;
var response = Encoding.UTF8.GetBytes("Invalid request");
context.Response.Body.Write(response, 0, response.Length);
return null;
}
return endpoints.FirstOrDefault(s => s.Name == endpointName && s.Online) // Get the endpoint with name matching the incoming request
?? base.GetNegotiateEndpoint(context, endpoints); // Or fallback to the default behavior to randomly select one from primary endpoints, or fallback to secondary when no primary ones are online
}
}
Nezapomeňte zaregistrovat směrovač do kontejneru DI pomocí:
var serviceManager = new ServiceManagerBuilder()
.WithOptions(option =>
{
options.Endpoints = new ServiceEndpoint[]
{
// Note: this is just a demonstration of how to set options.Endpoints
// Having ConnectionStrings explicitly set inside the code is not encouraged
// You can fetch it from a safe place such as Azure KeyVault
new ServiceEndpoint("<ConnectionString0>"),
new ServiceEndpoint("<ConnectionString1>", type: EndpointType.Primary, name: "east-region-a"),
new ServiceEndpoint("<ConnectionString2>", type: EndpointType.Primary, name: "east-region-b"),
new ServiceEndpoint("<ConnectionString3>", type: EndpointType.Secondary, name: "backup"),
};
})
.WithRouter(new CustomRouter())
.BuildServiceManager();
Konfigurace ve scénářích napříč oblastmi
Objekt ServiceEndpoint
má EndpointType
vlastnost s hodnotou primary
nebo secondary
.
Primární koncové body jsou upřednostňované koncové body pro příjem provozu klientů, protože mají spolehlivější síťová připojení. Sekundární koncové body mají méně spolehlivá síťová připojení a používají se jenom pro přenosy mezi servery a klienty. Sekundární koncové body se například používají pro vysílání zpráv místo provozu klienta na server.
V případech mezi oblastmi může být síť nestabilní. Pro aplikační server umístěný v oblasti USA – východ je koncový bod služby SignalR umístěný ve stejné oblasti primary
USA – východ a koncové body v jiných oblastech označených jako secondary
. V této konfiguraci můžou koncové body služby v jiných oblastech přijímat zprávy z tohoto aplikačního serveru USA – východ, ale na tento aplikační server se nesměrují žádní klienti mezi oblastmi . Následující diagram znázorňuje architekturu:
Když se klient pokusí použít /negotiate
aplikační server s výchozím směrovačem, sada SDK náhodně vybere jeden koncový bod ze sady dostupných primary
koncových bodů. Pokud primární koncový bod není dostupný, sada SDK pak náhodně vybere ze všech dostupných secondary
koncových bodů. Koncový bod se označí jako dostupný , když je připojení mezi serverem a koncovým bodem služby aktivní.
Ve scénáři mezi oblastmi se klient pokusí použít /negotiate
aplikační server hostovaný v oblasti USA – východ, ve výchozím nastavení vždy vrátí primary
koncový bod umístěný ve stejné oblasti. Pokud nejsou dostupné všechny koncové body USA – východ, směrovač přesměruje klienta na koncové body v jiných oblastech. Následující část převzetí služeb při selhání podrobně popisuje scénář.
Převzetí služeb při selhání
Pokud není k dispozici žádný primary
koncový bod, vybere klient /negotiate
z dostupných secondary
koncových bodů. Tento mechanismus převzetí služeb při selhání vyžaduje, aby každý koncový bod sloužil jako koncový bod alespoň k jednomu aplikačnímu primary
serveru.
Další kroky
Ve scénářích s vysokou dostupností a zotavením po havárii můžete použít několik koncových bodů.