Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
SDK службы SignalR поддерживает несколько конечных точек для экземпляров службы SignalR. Эту функцию можно использовать для масштабирования одновременных подключений или для обмена сообщениями между регионами.
Внимание
Необработанные строки подключения приводятся в этой статье только для демонстрации.
Строка подключения включает сведения об авторизации, необходимые для доступа вашего приложения к службе Azure SignalR. Ключ доступа в строке подключения аналогичен паролю привилегированного пользователя для службы. В рабочих средах всегда защищать ключи доступа. Используйте Azure Key Vault для безопасного управления ключами и защиты строки подключения с помощью идентификатора Microsoft Entra и авторизации доступа с помощью идентификатора Microsoft Entra.
Старайтесь не распространять ключи доступа среди других пользователей, жестко программировать их или где-то сохранять в виде обычного текста в открытом доступе для других пользователей. Меняйте свои ключи, если считаете, что они могут быть скомпрометированы.
Для ASP.NET Core
Добавление нескольких конечных точек из конфигурации
Необработанные строки подключения приведены в этой статье только в демонстрационных целях. В рабочих средах всегда защищать ключи доступа. Используйте Azure Key Vault для безопасного управления ключами и защиты строки подключения с помощью Microsoft Entra ID и авторизации доступа с помощью Microsoft Entra ID.
Настройте с ключом Azure:SignalR:ConnectionString или Azure:SignalR:ConnectionString: строку подключения для службы SignalR.
Если ключ начинается с Azure:SignalR:ConnectionString:, он должен находиться в формате Azure:SignalR:ConnectionString:{Name}:{EndpointType}, где Name и EndpointType являются свойствами ServiceEndpoint объекта и доступны из кода.
Вы можете добавить несколько строк подключения для экземпляров, используя следующие команды 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>
Добавление нескольких конечных точек из кода
Класс ServiceEndpoint описывает свойства конечной точки Служба Azure SignalR.
Можно настроить несколько конечных точек экземпляра при использовании пакета SDK для службы Azure SignalR.
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"),
};
});
Настройка маршрутизатора конечной точки
По умолчанию пакет SDK использует DefaultEndpointRouter для выбора конечных точек.
Поведение по умолчанию
Маршрутизация запросов клиента:
Когда клиент
/negotiateподключается к серверу приложений. По умолчанию пакет SDK случайным образом выбирает одну конечную точку из набора доступных конечных точек службы.Маршрутизация сообщений сервера:
При отправке сообщения в определенное подключение, если целевое подключение направляется на текущий сервер, сообщение направляется непосредственно в подключенную конечную точку. В противном случае сообщения будут транслироваться в каждую конечную точку Azure SignalR.
Настройка алгоритма маршрутизации
Вы можете создать собственный маршрутизатор, если вы обладаете специальными знаниями для определения конечных точек, на которые должны отправляться сообщения.
В следующем примере определяется пользовательский маршрутизатор, который направляет сообщения с группой, начинающейся с east-, к конечной точке с именем 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);
}
}
Следующий пример переопределяет поведение согласования по умолчанию и выбирает конечную точку в зависимости от расположения сервера приложений.
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
}
}
Обязательно зарегистрируйте маршрутизатор в контейнере DI с помощью следующего.
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 также поддерживает горячую перезагрузку. В приведенном ниже примере кода показано, как загружать строки подключения из одного раздела конфигурации и общедоступный URL-адрес, предоставляемый из другого обратными прокси-серверами. Если конфигурация поддерживает горячую перезагрузку, конечные точки можно обновлять на лету.
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"))
},
];
});
Для ASP.NET
Добавление нескольких конечных точек из конфигурации
Конфигурация с ключом Azure:SignalR:ConnectionString или Azure:SignalR:ConnectionString: для строки подключения службы SignalR.
Если ключ начинается с Azure:SignalR:ConnectionString:, он должен иметь формат Azure:SignalR:ConnectionString:{Name}:{EndpointType}, где Name и EndpointType являются свойствами объекта ServiceEndpoint и доступны из кода.
В 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>
Добавление нескольких конечных точек из кода
Класс ServiceEndpoint описывает свойства конечной точки Служба Azure SignalR.
При использовании пакета SDK для службы Azure SignalR вы можете настроить несколько конечных точек экземпляра следующим образом.
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>"),
}
});
Настройка маршрутизатора
Единственное различие между ASP.NET SignalR и ASP.NET Core SignalR — это тип контекста HTTP для GetNegotiateEndpoint. Для ASP.NET SignalR его тип IOwinContext.
Следующий код — это пользовательский пример согласования для 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
}
}
Зарегистрируйте маршрутизатор в DI-контейнере с помощью команды:
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>")
};
});
Метрики конечных точек службы
Чтобы включить расширенный маршрутизатор, пакет SDK сервера SignalR предоставляет несколько метрик, помогая серверу принимать интеллектуальные решения. Свойства находятся в разделе ServiceEndpoint.EndpointMetrics.
| Имя метрики | Описание |
|---|---|
ClientConnectionCount |
Общее количество одновременных клиентских подключений ко всем центрам для конечной точки службы |
ServerConnectionCount |
Общее количество одновременных подключений к серверу во всех центрах для конечной точки службы |
ConnectionCapacity |
Общая квота подключения для конечной точки службы, включая подключения клиента и сервера |
Следующий код является примером настройки маршрутизатора в соответствии с 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
С версией SDK 1.5.0 мы сначала включаем динамически масштабируемые конечные точки службы (ServiceEndpoints) для версии ASP.NET Core. Поэтому вам не нужно перезапустить сервер приложений, если необходимо добавить или удалить ServiceEndpoint. Поскольку ASP.NET Core поддерживает конфигурацию по умолчанию, такую как appsettings.json с reloadOnChange: true, вам не нужно изменять код, и это поддерживается по умолчанию. Если вы хотите добавить настраиваемую конфигурацию и работать с горячей перезагрузкой, см. раздел "Конфигурация" в ASP.NET Core.
Примечание.
Учитывая, что время настройки подключения между сервером или службой и клиентом или службой может отличаться, чтобы не было потери сообщений во время процесса масштабирования, у нас есть промежуточный период ожидания готовности подключений к серверу перед открытием нового ServiceEndpoint для клиентов. Обычно требуется несколько секунд, и вы сможете увидеть сообщение журнала, например Succeed in adding endpoint: '{endpoint}' , которое указывает на завершение процесса.
В некоторых ожидаемых ситуациях, таких как сетевые проблемы между регионами или несоответствия конфигурации на различных серверах приложений, этап тестирования может завершиться неправильно. В таких случаях рекомендуется перезапустить сервер приложений, когда процесс масштабирования не работает правильно.
Период времени ожидания по умолчанию для шкалы составляет 5 минут, и его можно настроить, изменив значение в ServiceOptions.ServiceScaleTimeout. Если у вас много серверов приложений, рекомендуется немного расширить значение.
Примечание.
В настоящее время функция нескольких конечных точек поддерживается только в Persistent типе транспорта.
Расширения для функций SignalR
Настройка
Чтобы включить несколько экземпляров службы SignalR, необходимо:
Используйте
Persistentтип транспорта.Тип транспорта по умолчанию —
Transientрежим. В файл или параметр приложения в Azure необходимо добавить следующую записьlocal.settings.json.{ "AzureSignalRServiceTransportType":"Persistent" }Примечание.
При переключении из режима
Transientв режимPersistentможет измениться поведение сериализации JSON, так как в режимеTransientиспользуется библиотекаNewtonsoft.Jsonдля сериализации аргументов методов концентратора, однако в режимеPersistentбиблиотекаSystem.Text.Jsonиспользуется по умолчанию.System.Text.Jsonимеет некоторые ключевые различия в поведении по умолчанию сNewtonsoft.Json. Если вы хотите использоватьNewtonsoft.Jsonв режимеPersistent, можно добавить элемент конфигурации"Azure:SignalR:HubProtocol":"NewtonsoftJson"в файлеlocal.settings.jsonили на портале AzureAzure__SignalR__HubProtocol=NewtonsoftJson.В конфигурации настройте несколько записей конечных точек службы SignalR.
Мы используем
ServiceEndpointобъект для представления экземпляра Службы SignalR. Можно определить конечную точку службы с ее компонентами<EndpointName>и<EndpointType>в ключе записи, а строку подключения в значении записи. Ключи находятся в следующем формате:Azure:SignalR:Endpoints:<EndpointName>:<EndpointType><EndpointType>является необязательным и по умолчанию имеет значениеprimary. См. примеры ниже.{ "Azure:SignalR:Endpoints:EastUs":"<ConnectionString>", "Azure:SignalR:Endpoints:EastUs2:Secondary":"<ConnectionString>", "Azure:SignalR:Endpoints:WestUs:Primary":"<ConnectionString>" }Примечание.
При настройке конечных точек Azure SignalR в Службе приложений на портале Azure не забудьте заменить
":"на"__", то есть двойное подчёркивание в ключах. По причинам см. переменные среды.Строка подключения, настроенная с помощью ключа
{ConnectionStringSetting}(по умолчанию — AzureSignalRConnectionString), также распознается как основная конечная точка службы с пустым именем. Но этот стиль конфигурации не рекомендуется использовать для нескольких конечных точек.
Маршрутизация
Поведение по умолчанию
По умолчанию привязка функций использует DefaultEndpointRouter для сбора конечных точек.
Маршрутизация клиентов: случайным образом выберите одну конечную точку из основных сетевых конечных точек. Если все основные конечные точки находятся в автономном режиме, то случайным образом выберите одну вторичную конечную точку в сети . Если при выборе снова возникнет ошибка, будет выброшено исключение.
Маршрутизация сообщений сервера: возвращены все конечные точки сервиса.
Настройка
Модель внутрипроцессного процесса C#
Ниже приведены шаги.
Реализуйте настраиваемый маршрутизатор. Вы можете использовать информацию, предоставленную из
ServiceEndpoint, для принятия решений о маршрутизации. См. руководство по настройке алгоритма маршрутизации. Обратите внимание, что триггер HTTP необходим в функции согласования, если в настраиваемом методе согласования требуетсяHttpContext.Зарегистрируйте маршрутизатор в контейнер 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>();
}
}
}
Модель изолированного процесса
Для функций, работающих в модели изолированного процесса, мы поддерживаем указание целевых конечных точек в каждом запросе. Вы будете использовать новые типы привязки для получения сведений о конечной точке.
Маршрутизация клиента
SignalRConnectionInfo Привязка выбирает одну конечную точку в соответствии с правилом маршрутизации по умолчанию. Если вы хотите настроить правило маршрутизации, вам следует использовать привязку SignalRNegotiation вместо привязки SignalRConnectionInfo.
SignalRNegotiation свойства конфигурации привязки такие же, как SignalRConnectionInfo. Ниже приведен function.json пример файла:
{
"type": "signalRNegotiation",
"name": "negotiationContext",
"hubName": "<HubName>",
"direction": "in"
}
Вы также можете добавить другие данные привязки, такие как userId, idToken и claimTypeList точно так же SignalRConnectionInfo.
Объект, полученный из SignalRNegotiation привязки, имеет следующий формат:
{
"endpoints": [
{
"endpointType": "Primary",
"name": "<EndpointName>",
"endpoint": "https://****.service.signalr.net",
"online": true,
"connectionInfo": {
"url": "<client-access-url>",
"accessToken": "<client-access-token>"
}
},
{
"...": "..."
}
]
}
Ниже приведен пример использования JavaScript для привязки 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;
}
}
Маршрутизация сообщений
Маршрутизация сообщений или действий требует взаимодействия двух типов привязки. Как правило, сначала вам нужен новый тип SignalREndpoints входной привязки, чтобы получить все доступные сведения о конечной точке. Затем вы отфильтруете конечные точки и получите массив, содержащий все конечные точки, в которые вы хотите отправить. Наконец, вы указываете целевые конечные точки в выходной привязке SignalR .
Ниже приведены SignalREndpoints свойства конфигурации привязки в functions.json файле:
{
"type": "signalREndpoints",
"direction": "in",
"name": "endpoints",
"hubName": "<HubName>"
}
Полученный объект SignalREndpoints представляет собой массив конечных точек, каждый из которых представлен как объект JSON со следующей схемой:
{
"endpointType": "<EndpointType>",
"name": "<EndpointName>",
"endpoint": "https://****.service.signalr.net",
"online": true
}
После того как получите массив целевых конечных точек, добавьте свойство endpoints в объект привязки выхода. Это пример 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();
}
Пакет SDK для управления
Добавление нескольких конечных точек из конфигурации
Настройте с помощью ключа Azure:SignalR:Endpoints строку подключения для службы SignalR. Ключ должен находиться в формате Azure:SignalR:Endpoints:{Name}:{EndpointType}, где Name и EndpointType являются свойствами ServiceEndpoint объекта и доступны из кода.
С помощью следующих команд 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>
Добавление нескольких конечных точек из кода
Класс ServiceEndpoint описывает свойства конечной точки Служба Azure SignalR.
Вы можете настроить несколько конечных точек экземпляров при использовании пакета SDK для управления Azure SignalR с помощью следующего:
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();
Настройка маршрутизатора конечной точки
По умолчанию пакет SDK использует DefaultEndpointRouter для выбора конечных точек.
Поведение по умолчанию
Маршрутизация запросов клиента:
Когда клиент взаимодействует с сервером приложений
/negotiate. По умолчанию пакет SDK случайным образом выбирает одну конечную точку из набора доступных конечных точек службы.Маршрутизация сообщений сервера:
При отправке сообщения на конкретное соединение, если целевое соединение направляется на текущий сервер, сообщение передается непосредственно в эту подключенную конечную точку. В противном случае сообщения будут транслироваться в каждую конечную точку Azure SignalR.
Настройка алгоритма маршрутизации
Вы можете создать собственный маршрутизатор, если вы обладаете специальными знаниями для определения конечных точек, на которые должны отправляться сообщения.
В следующем примере определяется пользовательский маршрутизатор, который направляет сообщения с группой, начинающейся с east-, к конечной точке с именем 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);
}
}
Следующий пример переопределяет поведение согласования по умолчанию и выбирает конечную точку в зависимости от расположения сервера приложений.
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
}
}
Не забудьте зарегистрировать маршрутизатор в контейнере DI, используя предоставленный код.
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();
Настройка в сценариях с разными регионами
Объект ServiceEndpoint имеет свойство EndpointType со значением primary или secondary.
Первичные конечные точки предпочтительнее конечных точек для получения клиентского трафика, так как у них есть более надежные сетевые подключения. Вторичные конечные точки имеют менее надежные сетевые подключения и используются только для сервера к клиентскому трафику. Например, вторичные конечные точки используются для трансляции сообщений вместо трафика клиента на сервер.
В межрегиональных случаях сеть может быть нестабильной. Для сервера приложений, расположенного в восточном регионе США, конечная точка службы SignalR, расположенная в том же восточном регионе США, — это primary, а конечные точки в других регионах помечены как secondary. В этой конфигурации конечные точки службы в других регионах могут получать сообщения от этого сервера приложений восточной части США , но на этот сервер приложений не направляются клиенты между регионами . На следующей схеме представлена архитектура:
При обращении клиента к серверу приложений с маршрутизатором по умолчанию, пакет SDK случайным образом выбирает одну конечную точку из набора доступных конечных точек. Если основная конечная точка недоступна, пакет SDK случайным образом выбирает из всех доступных secondary конечных точек. Конечная точка помечается как доступная, если подключение между сервером и конечной точкой службы активно.
В сценарии между регионами, когда клиент пытается /negotiate использовать сервер приложения, размещенный в восточной части США, по умолчанию всегда возвращает primary конечную точку, расположенную в одном регионе. Если все конечные точки восточной части США недоступны, маршрутизатор перенаправляет клиента на конечные точки в других регионах. В следующем разделе переключения на резервный ресурс подробно описан сценарий.
Резервное переключение
Когда конечная точка primary недоступна, клиент /negotiate выбирает из secondary доступных конечных точек. Этот механизм отработки отказа требует, чтобы каждая конечная точка служила в качестве конечной primary точки по крайней мере одному серверу приложений.
Следующие шаги
В сценариях высокого уровня доступности и аварийного восстановления можно использовать несколько конечных точек.