Escalado de SignalR Service con varias instancias
El SDK de SignalR Service admite varios puntos de conexión para las instancias de SignalR Service. Puede usar esta característica para escalar las conexiones simultáneas, o usarla para la mensajería entre regiones.
Importante
Las cadenas de conexión sin procesar solo aparecen en este artículo con fines de demostración.
Una cadena de conexión incluye la información de autorización necesaria para que la aplicación acceda al servicio Azure Web PubSub. La clave de acceso dentro de la cadena de conexión es similar a una contraseña raíz para el servicio. En entornos de producción, proteja siempre las claves de acceso. Use Azure Key Vault para administrar y rotar las claves de forma segura y proteger la cadena de conexión mediante el Microsoft Entra ID y autorizar el acceso con el Microsoft Entra ID.
Evite distribuirlas a otros usuarios, codificarlas de forma rígida o guardarlas en un archivo de texto sin formato al que puedan acceder otros usuarios. Rote sus claves si cree que se han puesto en peligro.
Para ASP.NET Core
Adición de varios puntos de conexión desde la configuración
Las cadenas de conexión sin procesar solo aparecen en este artículo con fines de demostración. En entornos de producción, proteja siempre las claves de acceso. Use Azure Key Vault para administrar y rotar las claves de forma segura y proteger la cadena de conexión mediante el Microsoft Entra ID y autorizar el acceso con el Microsoft Entra ID.
Configure con la clave Azure:SignalR:ConnectionString
o Azure:SignalR:ConnectionString:
para la cadena de conexión de SignalR Service.
Si la clave comienza con Azure:SignalR:ConnectionString:
, debe tener el formato Azure:SignalR:ConnectionString:{Name}:{EndpointType}
, donde Name
y EndpointType
son propiedades del objeto ServiceEndpoint
y son accesibles desde el código.
Puede agregar varias cadenas de conexión de instancias con los siguientes comandos dotnet
:
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>
Adición de varios puntos de conexión desde el código
Una clase ServiceEndpoint
describe las propiedades de un punto de conexión de Azure SignalR Service.
Puede configurar varios puntos de conexión de instancia al usar el SDK de Azure SignalR Service mediante:
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"),
};
});
Personalización del enrutador de punto de conexión
De forma predeterminada, el SDK usa DefaultEndpointRouter para seleccionar los puntos de conexión.
Comportamiento predeterminado
Enrutamiento de solicitudes de cliente:
Cuando el cliente negocia (acción
/negotiate
) con el servidor de aplicaciones. De forma predeterminada, el SDK selecciona aleatoriamente un punto de conexión del conjunto de puntos de conexión de servicio disponibles.Enrutamiento de mensajes del servidor:
Cuando se envía un mensaje a una conexión específica y la conexión de destino está enrutada al servidor actual, el mensaje va directamente a ese punto de conexión conectado. En caso contrario, los mensajes se difunden a cada punto de conexión de Azure SignalR.
Personalización del algoritmo de enrutamiento
Puede crear su propio enrutador cuando tenga conocimientos especiales para identificar los puntos de conexión a los que deberían ir los mensajes.
En el ejemplo siguiente se define un enrutador personalizado que enruta los mensajes con un grupo a partir de east-
al punto de conexión denominado 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);
}
}
En el ejemplo siguiente se invalida el comportamiento de negociación predeterminado y se selecciona el punto de conexión en función de la ubicación del servidor de aplicaciones.
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
}
}
No olvide registrar el enrutador en el contenedor de DI mediante:
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
también admite la recarga frecuente. En el código de ejemplo siguiente se muestra cómo cargar cadenas de conexión desde una sección de configuración y una dirección URL pública expuestas por servidores proxy inversos desde otra y, siempre y cuando la configuración admita la recarga frecuente, los puntos de conexión se podrían actualizar sobre la marcha.
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"))
},
];
});
Para ASP.NET
Adición de varios puntos de conexión desde la configuración
Configuración con clave Azure:SignalR:ConnectionString
o Azure:SignalR:ConnectionString:
para la cadena de conexión de SignalR Service.
Si la clave empieza por Azure:SignalR:ConnectionString:
, debe estar en formato Azure:SignalR:ConnectionString:{Name}:{EndpointType}
, donde Name
y EndpointType
son propiedades del objeto ServiceEndpoint
y son accesibles desde el código.
Puede agregar varias cadenas de conexión de instancia a web.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>
Adición de varios puntos de conexión desde el código
Una clase ServiceEndpoint
describe las propiedades de un punto de conexión de Azure SignalR Service.
Puede configurar varios puntos de conexión de instancia al usar el SDK de Azure SignalR Service mediante:
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>"),
}
});
Personalización de un enrutador
La única diferencia entre ASP.NET SignalR y ASP.NET Core SignalR es el tipo de contexto http para GetNegotiateEndpoint
. En ASP.NET SignalR, es de tipo IOwinContext.
El código siguiente es un ejemplo de negociación personalizado para 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
}
}
No olvide registrar el enrutador en el contenedor de DI mediante:
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>")
};
});
Métricas de punto de conexión de servicio
Para habilitar un enrutador avanzado, el SDK del servidor SignalR proporciona varias métricas para ayudar al servidor a tomar decisiones inteligentes. Las propiedades están en ServiceEndpoint.EndpointMetrics
.
Nombre de la métrica | Descripción |
---|---|
ClientConnectionCount |
Recuento total de conexiones de cliente simultáneas en todos los centros para el punto de conexión de servicio |
ServerConnectionCount |
Recuento total de conexiones de servidor simultáneas en todos los centros para el punto de conexión de servicio |
ConnectionCapacity |
Cuota de conexión total para el punto de conexión de servicio, incluidas las conexiones de cliente y servidor |
El código siguiente es un ejemplo de personalización de un enrutador según 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
}
}
ServiceEndpoints de escalado dinámico
Desde la versión 1.5.0 del SDK, habilitamos ServiceEndpoints de escalado dinámico para la primera versión de ASP.NET Core. Por lo tanto, no tiene que reiniciar el servidor de aplicaciones cuando necesite agregar o quitar un ServiceEndpoint. Puesto que ASP.NET Core admite una configuración predeterminada, como appsettings.json
con reloadOnChange: true
, no es necesario cambiar ningún código y es compatible por naturaleza. Y si desea agregar alguna configuración personalizada y trabajar con recarga activa, consulte Configuración en ASP.NET Core.
Nota:
Teniendo en cuenta el tiempo de configuración de la conexión entre el servidor, el servicio y el cliente o el servicio pueden ser diferentes, para garantizar que no se pierda ningún mensaje durante el proceso de escalado, tenemos un período de almacenamiento provisional en espera de que las conexiones del servidor estén listas antes de abrir el nuevo ServiceEndpoint a los clientes. Normalmente, tarda segundos en completarse y podrá ver un mensaje de registro como Succeed in adding endpoint: '{endpoint}'
que indica que el proceso se ha completado.
En algunas situaciones esperadas, como problemas de red entre regiones o incoherencias de configuración en distintos servidores de aplicaciones, es posible que el período de proceso de almacenamiento provisional no finalice correctamente. En estos casos, se recomienda reiniciar el servidor de aplicaciones cuando encuentre que el proceso de escalado no funciona correctamente.
El período de tiempo de espera predeterminado para la escala es de 5 minutos y se puede personalizar cambiando el valor de ServiceOptions.ServiceScaleTimeout
. Si tiene muchos servidores de aplicaciones, se recomienda ampliar el valor un poco más.
Nota:
Actualmente, la característica de varios puntos de conexión solo se admite en el tipo de transporte Persistent
.
Para extensiones de SignalR Functions
Configuración
Para habilitar varias instancias de SignalR Service, debe:
Usar el tipo de transporte
Persistent
.El tipo de transporte predeterminado es el modo
Transient
. Debe agregar la siguiente entrada al archivolocal.settings.json
o la configuración de la aplicación en Azure.{ "AzureSignalRServiceTransportType":"Persistent" }
Nota:
Al cambiar del modo
Transient
al modoPersistent
, puede haber un cambio de comportamiento de serialización JSON, ya que en el modoTransient
, la bibliotecaNewtonsoft.Json
se usa para serializar argumentos de métodos concentradores, sin embargo, en el modoPersistent
, se usa la bibliotecaSystem.Text.Json
como valor predeterminado.System.Text.Json
tiene algunas diferencias clave en el comportamiento predeterminado conNewtonsoft.Json
. Si quiere usarNewtonsoft.Json
en el modoPersistent
, puede agregar un elemento de configuración:"Azure:SignalR:HubProtocol":"NewtonsoftJson"
en el archivolocal.settings.json
oAzure__SignalR__HubProtocol=NewtonsoftJson
en Azure Portal.Configure varias entradas de puntos de conexión de SignalR Service en la configuración.
Usamos un objeto
ServiceEndpoint
para representar una instancia de SignalR Service. Puede definir un punto de conexión de servicio con su<EndpointName>
y<EndpointType>
en la clave de entrada y la cadena de conexión en el valor de entrada. Las claves tienen el siguiente formato:Azure:SignalR:Endpoints:<EndpointName>:<EndpointType>
<EndpointType>
es opcional y el valor predeterminado esprimary
. Consulte los siguientes ejemplos:{ "Azure:SignalR:Endpoints:EastUs":"<ConnectionString>", "Azure:SignalR:Endpoints:EastUs2:Secondary":"<ConnectionString>", "Azure:SignalR:Endpoints:WestUs:Primary":"<ConnectionString>" }
Nota:
Al configurar puntos de conexión de Azure SignalR en App Service en Azure Portal, no olvide reemplazar
":"
por"__"
, el doble guion bajo en las claves. Para obtener más información, consulte Variables de entorno.La cadena de conexión configurada con la clave
{ConnectionStringSetting}
(el valor predeterminado es "AzureSignalRConnectionString") también se reconoce como punto de conexión de servicio principal con el nombre vacío. Pero este estilo de configuración no se recomienda para varios puntos de conexión.
Enrutamiento
Comportamiento predeterminado
De forma predeterminada, el enlace de funciones usa DefaultEndpointRouter para seleccionar puntos de conexión.
Enrutamiento de cliente: seleccione aleatoriamente un punto de conexión de los puntos de conexión en línea principales. Si todos los puntos de conexión principales están sin conexión, seleccione aleatoriamente un punto de conexión en línea secundario. Si se produce un error en la selección de nuevo, se produce una excepción.
Enrutamiento de mensajes del servidor: se devuelven todos los puntos de conexión de servicio.
Personalización
Modelo en proceso de C#
Estos son los pasos que debe realizar:
Implemente un enrutador personalizado. Puede aprovechar la información proporcionada desde
ServiceEndpoint
para tomar la decisión de enrutamiento. Consulte la guía aquí: customize-route-algorithm. Tenga en cuenta que el desencadenador Http es necesario en la función de negociación cuando necesiteHttpContext
en el método de negociación personalizado.Registre el enrutador en el contenedor de inserción de dependencias.
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>();
}
}
}
Modelo de proceso aislado
En el caso de las funciones que se ejecutan en el modelo de proceso aislado, se admite la especificación de puntos de conexión de destino en cada solicitud. Usará nuevos tipos de enlace para obtener información del punto de conexión.
Enrutamiento del cliente
El enlace SignalRConnectionInfo
selecciona un punto de conexión según la regla de enrutamiento predeterminada. Si desea personalizar la regla de enrutamiento, debe usar el enlace SignalRNegotiation
en lugar del enlace SignalRConnectionInfo
.
Las propiedades de configuración de enlace SignalRNegotiation
son las mismas que SignalRConnectionInfo
. Este es un ejemplo de archivo function.json
:
{
"type": "signalRNegotiation",
"name": "negotiationContext",
"hubName": "<HubName>",
"direction": "in"
}
También puede agregar otros datos de enlace, como userId
, idToken
y claimTypeList
al igual que SignalRConnectionInfo
.
El objeto que obtiene del enlace SignalRNegotiation
tiene el siguiente formato:
{
"endpoints": [
{
"endpointType": "Primary",
"name": "<EndpointName>",
"endpoint": "https://****.service.signalr.net",
"online": true,
"connectionInfo": {
"url": "<client-access-url>",
"accessToken": "<client-access-token>"
}
},
{
"...": "..."
}
]
}
Este es un ejemplo de uso de JavaScript de enlace 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;
}
}
Enrutamiento de mensajes
El enrutamiento de mensajes o acciones necesita que cooperen dos tipos de enlace. En general, primero necesita un nuevo tipo de enlace de entrada SignalREndpoints
para obtener toda la información del punto de conexión disponible. A continuación, filtre los puntos de conexión y obtenga una matriz que contenga todos los puntos de conexión a los que desea enviar. Por último, especifique los puntos de conexión de destino en el enlace de salida SignalR
.
Estas son las propiedades de configuración de enlace SignalREndpoints
del archivo functions.json
:
{
"type": "signalREndpoints",
"direction": "in",
"name": "endpoints",
"hubName": "<HubName>"
}
El objeto que obtiene de SignalREndpoints
es una matriz de puntos de conexión, cada uno de los cuales se representa como un objeto JSON con el esquema siguiente:
{
"endpointType": "<EndpointType>",
"name": "<EndpointName>",
"endpoint": "https://****.service.signalr.net",
"online": true
}
Después de obtener la matriz de puntos de conexión de destino, agregue una propiedad endpoints
al objeto de enlace de salida. Este es un ejemplo de JavaScript:
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();
}
Para Administración del SDK
Adición de varios puntos de conexión desde la configuración
Configure con la clave Azure:SignalR:Endpoints
para la cadena de conexión de SignalR Service. La clave debe tener el formato Azure:SignalR:Endpoints:{Name}:{EndpointType}
, donde Name
y EndpointType
son propiedades del objeto ServiceEndpoint
y son accesibles desde el código.
Puede agregar varias cadenas de conexión de instancias con los siguientes comandos dotnet
:
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>
Adición de varios puntos de conexión desde el código
Una clase ServiceEndpoint
describe las propiedades de un punto de conexión de Azure SignalR Service.
Puede configurar varios puntos de conexión de instancia al usar el SDK de administración de Azure SignalR mediante:
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();
Personalización del enrutador de punto de conexión
De forma predeterminada, el SDK usa DefaultEndpointRouter para seleccionar los puntos de conexión.
Comportamiento predeterminado
Enrutamiento de solicitudes de cliente:
Cuando el cliente negocia (acción
/negotiate
) con el servidor de aplicaciones. De forma predeterminada, el SDK selecciona aleatoriamente un punto de conexión del conjunto de puntos de conexión de servicio disponibles.Enrutamiento de mensajes del servidor:
Cuando se envía un mensaje a una conexión específica y la conexión de destino está enrutada al servidor actual, el mensaje va directamente a ese punto de conexión conectado. En caso contrario, los mensajes se difunden a cada punto de conexión de Azure SignalR.
Personalización del algoritmo de enrutamiento
Puede crear su propio enrutador cuando tenga conocimientos especiales para identificar los puntos de conexión a los que deberían ir los mensajes.
En el ejemplo siguiente se define un enrutador personalizado que enruta los mensajes con un grupo a partir de east-
al punto de conexión denominado 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);
}
}
En el ejemplo siguiente se invalida el comportamiento de negociación predeterminado y se selecciona el punto de conexión en función de la ubicación del servidor de aplicaciones.
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
}
}
No olvide registrar el enrutador en el contenedor de DI mediante:
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();
Configuración en escenarios entre regiones
El objeto ServiceEndpoint
tiene una propiedad EndpointType
con valor primary
o secondary
.
Los puntos de conexión principales son puntos de conexión preferidos para recibir tráfico de cliente porque tienen conexiones de red más confiables. Los puntos de conexión secundarios tienen conexiones de red menos confiables y solo se usan para el tráfico del servidor al cliente. Por ejemplo, los puntos de conexión secundarios se usan para difundir mensajes en lugar de para el tráfico de cliente al servidor.
En casos entre regiones, la red puede ser inestable. Para un servidor de aplicaciones ubicado en Este de EE. UU., el punto de conexión de SignalR Service ubicado en la misma región Este de EE. UU. es primary
y los puntos de conexión de otras regiones marcadas como secondary
. En esta configuración, los puntos de conexión de servicio de otras regiones pueden recibir mensajes de este servidor de aplicaciones de Este de EE. UU., pero no habrá ningún cliente entre regiones enrutado a este servidor de aplicaciones. En el siguiente diagrama se muestra la arquitectura:
Cuando un cliente intenta /negotiate
con el servidor de aplicaciones con un enrutador predeterminado, el SDK selecciona aleatoriamente un punto de conexión del conjunto de puntos de conexión de primary
disponibles. Cuando el punto de conexión principal no está disponible, el SDK selecciona aleatoriamente de todos los puntos de conexión de secondary
disponibles. El punto de conexión se marca como disponible cuando la conexión entre el servidor y el punto de conexión de servicio está activa.
En un escenario entre regiones, cuando un cliente intenta /negotiate
con el servidor de aplicaciones hospedado en Este de EE. UU., de manera predeterminada siempre devuelve el punto de conexión de primary
ubicado en la misma región. Cuando todos los puntos de conexión de Este de EE. UU. no están disponibles, el enrutador redirige el cliente a los puntos de conexión de otras regiones. En la siguiente sección de conmutación por error se describe el escenario en detalle.
Conmutación por error
Cuando no hay ningún punto de conexión primary
disponible, el cliente /negotiate
elige entre los puntos de conexión de secondary
disponibles. Este mecanismo de conmutación por error requiere que cada punto de conexión actúe como un punto de conexión primary
para al menos un servidor de aplicaciones.
Pasos siguientes
Puede usar varios puntos de conexión en escenarios de alta disponibilidad y recuperación ante desastres.