Aracılığıyla paylaş


birden çok örnekle SignalR Hizmeti ölçeklendirme

SignalR Hizmeti SDK, SignalR Hizmeti örnekleri için birden çok uç noktayı destekler. Bu özelliği eşzamanlı bağlantıları ölçeklendirmek için veya bölgeler arası mesajlaşma için kullanabilirsiniz.

Önemli

Ham bağlantı dizesi yalnızca tanıtım amacıyla bu makalede görünür.

bağlantı dizesi, uygulamanızın Azure SignalR Hizmeti erişmesi için gereken yetkilendirme bilgilerini içerir. bağlantı dizesi içindeki erişim anahtarı, hizmetinizin kök parolasına benzer. Üretim ortamlarında erişim anahtarlarınızı her zaman koruyun. Anahtarlarınızı güvenli bir şekilde yönetmek ve döndürmek ve Microsoft Entra Id kullanarak bağlantı dizesi güvenliğini sağlamak ve Microsoft Entra ID ile erişimi yetkilendirmek için Azure Key Vault'u kullanın.

Erişim anahtarlarını diğer kullanıcılara dağıtmaktan, sabit kodlamaktan veya başkalarının erişebileceği herhangi bir yerde düz metin olarak kaydetmekten kaçının. Ele geçirilmiş olabileceklerini düşünüyorsanız anahtarlarınızı döndürün.

ASP.NET Core için

Yapılandırmadan birden çok uç nokta ekleme

Ham bağlantı dizesi yalnızca tanıtım amacıyla bu makalede görünür. Üretim ortamlarında erişim anahtarlarınızı her zaman koruyun. Anahtarlarınızı güvenli bir şekilde yönetmek ve döndürmek ve Microsoft Entra Id kullanarak bağlantı dizesi güvenliğini sağlamak ve Microsoft Entra ID ile erişimi yetkilendirmek için Azure Key Vault'u kullanın.

Anahtarla Azure:SignalR:ConnectionString veya Azure:SignalR:ConnectionString: SignalR Hizmeti bağlantı dizesi için yapılandırın.

Anahtar ile Azure:SignalR:ConnectionString:başlıyorsa, biçiminde olmalıdır Azure:SignalR:ConnectionString:{Name}:{EndpointType}; burada Name ve EndpointType nesnenin ServiceEndpoint özellikleridir ve koddan erişilebilir.

Aşağıdaki dotnet komutları kullanarak birden çok örnek bağlantı dizesi ekleyebilirsiniz:

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>

Koddan birden çok uç nokta ekleme

SınıfServiceEndpoint, Azure SignalR Hizmeti uç noktasının özelliklerini açıklar. Azure SignalR Hizmeti SDK'sı kullanırken aşağıdakiler aracılığıyla birden çok örnek uç noktası yapılandırabilirsiniz:

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"),
            };
        });

Uç nokta yönlendiriciyi özelleştirme

Varsayılan olarak SDK, uç noktaları almak için DefaultEndpointRouter kullanır.

Varsayılan davranış

  1. İstemci isteği yönlendirme:

    Uygulama sunucusu ile istemci /negotiate olduğunda. Varsayılan olarak SDK , kullanılabilir hizmet uç noktaları kümesinden rastgele bir uç nokta seçer .

  2. Sunucu iletisi yönlendirme:

    Belirli bir bağlantıya ileti gönderirken ve hedef bağlantı geçerli sunucuya yönlendirilirken, ileti doğrudan bu bağlı uç noktaya gider. Aksi takdirde iletiler her Azure SignalR uç noktasına yayınlanır.

Yönlendirme algoritmalarını özelleştirme

İletilerin hangi uç noktalara gitmesi gerektiğini belirlemek için özel bilginiz olduğunda kendi yönlendiricinizi oluşturabilirsiniz.

Aşağıdaki örnek, ile başlayan east- bir grupla iletileri adlı eastuç noktaya yönlendiren özel bir yönlendirici tanımlar:

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);
    }
}

Aşağıdaki örnek, varsayılan anlaşma davranışını geçersiz kılar ve uygulama sunucusunun konumuna bağlı olarak uç noktayı seçer.

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
    }
}

Aşağıdakileri kullanarak yönlendiriciyi DI kapsayıcısına kaydetmeyi unutmayın:

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 ayrıca çalışırken yeniden yüklemeyi de destekler. Aşağıdaki örnek kod, bir yapılandırma bölümünden bağlantı dizesi yükleme ve diğerinden ters proxy'ler tarafından kullanıma sunulan genel URL'yi gösterir ve yapılandırma çalışırken yeniden yüklemeyi desteklediği sürece uç noktalar anında güncelleştirilebilir.

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 için

Yapılandırmadan birden çok uç nokta ekleme

Anahtarla Azure:SignalR:ConnectionString veya Azure:SignalR:ConnectionString: SignalR Hizmeti bağlantı dizesi için yapılandırma.

Anahtar ile Azure:SignalR:ConnectionString:başlıyorsa, biçiminde olmalıdır Azure:SignalR:ConnectionString:{Name}:{EndpointType}; burada Name ve EndpointType nesnenin ServiceEndpoint özellikleridir ve koddan erişilebilir.

içine birden çok örnek bağlantı dizesi web.configekleyebilirsiniz:

<?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>

Koddan birden çok uç nokta ekleme

SınıfServiceEndpoint, Azure SignalR Hizmeti uç noktasının özelliklerini açıklar. Azure SignalR Hizmeti SDK'sı kullanırken aşağıdakiler aracılığıyla birden çok örnek uç noktası yapılandırabilirsiniz:

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>"),
            }
        });

Yönlendiriciyi özelleştirme

ASP.NET SignalR ile ASP.NET Core SignalR arasındaki tek fark için GetNegotiateEndpointhttp bağlam türüdür. ASP.NET SignalR için IOwinContext türündedir.

Aşağıdaki kod, ASP.NET SignalR için özel bir anlaşma örneğidir:

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
    }
}

Aşağıdakileri kullanarak yönlendiriciyi DI kapsayıcısına kaydetmeyi unutmayın:

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>")
                };
});

Hizmet Uç Noktası Ölçümleri

Gelişmiş yönlendiriciyi etkinleştirmek için SignalR sunucu SDK'sı, sunucunun akıllı kararlar vermesine yardımcı olmak için birden çok ölçüm sağlar. Özellikler altındadır ServiceEndpoint.EndpointMetrics.

Ölçüm Adı Açıklama
ClientConnectionCount Hizmet uç noktası için tüm hub'lardaki eş zamanlı istemci bağlantılarının toplam sayısı
ServerConnectionCount Hizmet uç noktası için tüm hub'lardaki eş zamanlı sunucu bağlantılarının toplam sayısı
ConnectionCapacity İstemci ve sunucu bağlantıları dahil olmak üzere hizmet uç noktası için toplam bağlantı kotası

Aşağıdaki kod, yönlendiriciyi öğesine göre özelleştirme örneğidir 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
    }
}

Dinamik Ölçek ServiceEndpoints

SDK sürüm 1.5.0'dan önce ASP.NET Core sürümü için dinamik ölçekli ServiceEndpoint'leri etkinleştiriyoruz. Bu nedenle, ServiceEndpoint eklemeniz/kaldırmanız gerektiğinde uygulama sunucusunu yeniden başlatmanız gerekmez. ASP.NET Core ile gibi varsayılan bir yapılandırmayı desteklediği için appsettings.jsonreloadOnChange: truekodu değiştirmeniz gerekmez ve bu yapılandırma doğası gereği desteklenir. Ayrıca bazı özelleştirilmiş yapılandırmalar eklemek ve sık erişimli yeniden yükleme ile çalışmak istiyorsanız ASP.NET Core'da yapılandırma bölümüne bakın.

Not

Ölçek işlemi sırasında ileti kaybı olmaması için sunucu/hizmet ile istemci/hizmet arasındaki bağlantı ayarlama süresinin farklı olabileceğini göz önünde bulundurarak, istemcilere yeni ServiceEndpoint'i açmadan önce sunucu bağlantılarının hazır olmasını bekleyen bir hazırlama dönemimiz vardır. Genellikle tamamlanması saniyeler sürer ve işlemin tamamlandığına işaret eden bir günlük iletisi Succeed in adding endpoint: '{endpoint}' görebilirsiniz.

Bölgeler arası ağ sorunları veya farklı uygulama sunucularındaki yapılandırma tutarsızlıkları gibi bazı beklenen durumlarda, hazırlama süresi doğru şekilde bitmeyebilir. Bu gibi durumlarda, ölçeklendirme işleminin düzgün çalışmadığını gördüğünüzde uygulama sunucusunu yeniden başlatmanız önerilir.

Ölçek için varsayılan zaman aşımı süresi 5 dakikadır ve içindeki ServiceOptions.ServiceScaleTimeoutdeğer değiştirilerek özelleştirilebilir. Çok fazla uygulama sunucunuz varsa değeri biraz daha genişletmeniz önerilir.

Not

Şu anda birden çok uç nokta özelliği yalnızca aktarım türünde desteklenmektedir Persistent .

SignalR İşlevleri uzantıları için

Yapılandırma

Birden çok SignalR Hizmeti örneğini etkinleştirmek için şunları yapmalısınız:

  1. Aktarım türünü kullanın Persistent .

    Varsayılan aktarım türü moddur Transient . Dosyanıza local.settings.json veya Azure'da uygulama ayarına aşağıdaki girdiyi eklemelisiniz.

    {
        "AzureSignalRServiceTransportType":"Persistent"
    }
    

    Not

    Moddan Transient moda Persistent geçiş yaparken JSON serileştirme davranışı değişikliği olabilir, çünkü mod Newtonsoft.Json altında Transient kitaplık hub yöntemlerinin bağımsız değişkenlerini serileştirmek için kullanılır, ancak mod System.Text.Json altında Persistent kitaplık varsayılan olarak kullanılır. System.Text.Json ile Newtonsoft.Jsonvarsayılan davranışta bazı önemli farklılıklar vardır. Modun altında kullanmak Newtonsoft.Json istiyorsanız, dosyaya veya Azure__SignalR__HubProtocol=NewtonsoftJson Azure portalına local.settings.json bir yapılandırma öğesi "Azure:SignalR:HubProtocol":"NewtonsoftJson" ekleyebilirsinizPersistent.

  2. Yapılandırmanızda birden çok SignalR Hizmeti uç noktası girdisi yapılandırın.

    bir SignalR Hizmeti örneğini temsil etmek için bir nesnesi kullanırızServiceEndpoint. Giriş anahtarında ve <EndpointType> giriş değerindeki bağlantı dizesi ile <EndpointName> bir hizmet uç noktası tanımlayabilirsiniz. Anahtarlar aşağıdaki biçimdedir:

    Azure:SignalR:Endpoints:<EndpointName>:<EndpointType>
    

    <EndpointType> isteğe bağlıdır ve varsayılan olarak olarak primaryayarlanır. Aşağıdaki örneklere bakın:

    {
        "Azure:SignalR:Endpoints:EastUs":"<ConnectionString>",
    
        "Azure:SignalR:Endpoints:EastUs2:Secondary":"<ConnectionString>",
    
        "Azure:SignalR:Endpoints:WestUs:Primary":"<ConnectionString>"
    }
    

    Not

    • Azure portalında App Service'te Azure SignalR uç noktalarını yapılandırdığınızda, anahtarlardaki çift alt çizgi ile "__"değiştirmeyi ":" unutmayın. Nedenlerden dolayı bkz . Ortam değişkenleri.

    • Anahtarla {ConnectionStringSetting} yapılandırılan bağlantı dizesi ("AzureSignalRConnectionString" varsayılanıdır) ayrıca boş ada sahip bir birincil hizmet uç noktası olarak da kabul edilir. Ancak bu yapılandırma stili birden çok uç nokta için önerilmez.

Yönlendirme

Varsayılan davranış

varsayılan olarak, işlev bağlaması uç noktaları almak için DefaultEndpointRouter kullanır.

  • İstemci yönlendirme: Birincil çevrimiçi uç noktalardan rastgele bir uç nokta seçin. Tüm birincil uç noktalar çevrimdışıysa, rastgele bir ikincil çevrimiçi uç nokta seçin. Seçim yeniden başarısız olursa, özel durum oluşturulur.

  • Sunucu iletisi yönlendirme: Tüm hizmet uç noktaları döndürülür.

Özelleştirme

C# işlem içi modeli

Adımlar aşağıdaki gibidir:

  1. Özelleştirilmiş bir yönlendirici uygulayın. Yönlendirme kararı almak için kimden sağlanan bilgilerden ServiceEndpoint yararlanabilirsiniz. Buradaki kılavuza bakın: customize-route-algorithm. Özel anlaşma yöntemine ihtiyacınız HttpContext olduğunda anlaşma işlevinde HTTP tetikleyicisinin gerekli olduğunu lütfen unutmayın.

  2. Yönlendiriciyi DI kapsayıcısına kaydedin.

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>();
        }
    }
}
Yalıtılmış işlem modeli

Yalıtılmış işlem modelinde çalışan işlevler için her istekte hedef uç noktaların belirtilmesi desteklenir. Uç nokta bilgilerini almak için yeni bağlama türleri kullanacaksınız.

İstemci yönlendirme

Bağlama, SignalRConnectionInfo varsayılan yönlendirme kuralına göre bir uç nokta seçer. Yönlendirme kuralını özelleştirmek istiyorsanız bağlama yerine SignalRConnectionInfo bağlama kullanmalısınızSignalRNegotiation.

SignalRNegotiation bağlama yapılandırma özellikleri ile aynıdır SignalRConnectionInfo. İşte bir function.json dosya örneği:

{
    "type": "signalRNegotiation",
    "name": "negotiationContext",
    "hubName": "<HubName>",
    "direction": "in"
}

gibi diğer bağlama verilerini userIdidTokenclaimTypeListSignalRConnectionInfode ekleyebilirsiniz.

Bağlamadan SignalRNegotiation edindiğiniz nesne aşağıdaki biçimdedir:

{
    "endpoints": [
        {
            "endpointType": "Primary",
            "name": "<EndpointName>",
            "endpoint": "https://****.service.signalr.net",
            "online": true,
            "connectionInfo": {
                "url": "<client-access-url>",
                "accessToken": "<client-access-token>"
            }
        },
        {
            "...": "..."
        }
    ]
}

Bağlamanın JavaScript kullanım örneği aşağıda verilmiştir 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;
    }
}
İleti yönlendirme

İletilerin veya eylemlerin yönlendirilmesi için işbirliği yapmak için iki bağlama türü gerekir. Genel olarak, öncelikle tüm kullanılabilir uç nokta bilgilerini almak için yeni bir giriş bağlama türüne SignalREndpoints ihtiyacınız vardır. Ardından uç noktaları filtreleyip göndermek istediğiniz tüm uç noktaları içeren bir dizi alırsınız. Son olarak çıkış bağlamasında SignalR hedef uç noktaları belirtirsiniz.

Dosyadaki SignalREndpoints bağlama yapılandırma özellikleri functions.json şunlardır:

{
      "type": "signalREndpoints",
      "direction": "in",
      "name": "endpoints",
      "hubName": "<HubName>"
}

Elde ettiğiniz SignalREndpoints nesne, her biri aşağıdaki şemaya sahip bir JSON nesnesi olarak temsil edilen bir uç nokta dizisidir:

{
    "endpointType": "<EndpointType>",
    "name": "<EndpointName>",
    "endpoint": "https://****.service.signalr.net",
    "online": true
}

Hedef uç nokta dizisini aldıktan sonra çıkış bağlama nesnesine bir endpoints özellik ekleyin. Bu bir JavaScript örneğidir:

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();
}

Yönetim SDK'sı için

Yapılandırmadan birden çok uç nokta ekleme

SignalR Hizmeti bağlantı dizesi anahtarıyla Azure:SignalR:Endpoints yapılandırın. Anahtar biçiminde olmalıdır Azure:SignalR:Endpoints:{Name}:{EndpointType}; burada Name ve EndpointType nesnenin ServiceEndpoint özellikleridir ve koddan erişilebilir.

Aşağıdaki dotnet komutları kullanarak birden çok örnek bağlantı dizesi ekleyebilirsiniz:

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>

Koddan birden çok uç nokta ekleme

SınıfServiceEndpoint, Azure SignalR Hizmeti uç noktasının özelliklerini açıklar. Azure SignalR Yönetim SDK'sı kullanırken aşağıdakiler aracılığıyla birden çok örnek uç noktası yapılandırabilirsiniz:

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();

Uç nokta yönlendiriciyi özelleştirme

Varsayılan olarak SDK, uç noktaları almak için DefaultEndpointRouter kullanır.

Varsayılan davranış

  • İstemci isteği yönlendirme:

    Uygulama sunucusu ile istemci /negotiate olduğunda. Varsayılan olarak SDK , kullanılabilir hizmet uç noktaları kümesinden rastgele bir uç nokta seçer .

  • Sunucu iletisi yönlendirme:

    Belirli bir bağlantıya ileti gönderirken ve hedef bağlantı geçerli sunucuya yönlendirilirken, ileti doğrudan bu bağlı uç noktaya gider. Aksi takdirde iletiler her Azure SignalR uç noktasına yayınlanır.

Yönlendirme algoritmalarını özelleştirme

İletilerin hangi uç noktalara gitmesi gerektiğini belirlemek için özel bilginiz olduğunda kendi yönlendiricinizi oluşturabilirsiniz.

Aşağıdaki örnek, ile başlayan east- bir grupla iletileri adlı eastuç noktaya yönlendiren özel bir yönlendirici tanımlar:

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);
    }
}

Aşağıdaki örnek, varsayılan anlaşma davranışını geçersiz kılar ve uygulama sunucusunun konumuna bağlı olarak uç noktayı seçer.

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
    }
}

Aşağıdakileri kullanarak yönlendiriciyi DI kapsayıcısına kaydetmeyi unutmayın:

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();

Bölgeler arası senaryolarda yapılandırma

nesnesinin ServiceEndpoint veya secondarydeğerine primary sahip bir EndpointType özelliği vardır.

Birincil uç noktalar, daha güvenilir ağ bağlantıları olduğundan istemci trafiğini almak için tercih edilen uç noktalardır. İkincil uç noktalar daha az güvenilir ağ bağlantılarına sahiptir ve yalnızca sunucudan istemciye trafik için kullanılır. Örneğin, istemciden sunucuya trafik yerine iletileri yayınlamak için ikincil uç noktalar kullanılır.

Bölgeler arası durumlarda ağ kararsız olabilir. Doğu ABD'de bulunan bir uygulama sunucusu için, aynı Doğu ABD bölgesinde bulunan SignalR Hizmeti uç noktası ve olarak secondaryişaretlenen diğer bölgelerdeki uç noktalardırprimary. Bu yapılandırmada, diğer bölgelerdeki hizmet uç noktaları bu Doğu ABD uygulama sunucusundan ileti alabilir, ancak bu uygulama sunucusuna bölgeler arası istemciler yönlendirilmemiştir. Aşağıdaki diyagramda mimari gösterilmektedir:

Cross-Geo Infra

bir istemci varsayılan yönlendiriciye sahip uygulama sunucusuyla çalıştığında /negotiate SDK, kullanılabilir primary uç noktalar kümesinden rastgele bir uç nokta seçer. Birincil uç nokta kullanılabilir olmadığında, SDK kullanılabilir secondary tüm uç noktalardan rastgele seçim yapın. Sunucu ile hizmet uç noktası arasındaki bağlantı etkin olduğunda uç nokta kullanılabilir olarak işaretlenir.

Bölgeler arası bir senaryoda, bir istemci Doğu ABD'de barındırılan uygulama sunucusuyla çalıştığında/negotiate, varsayılan olarak her zaman aynı bölgede bulunan uç noktayı döndürürprimary. Tüm Doğu ABD uç noktaları kullanılamadığında, yönlendirici istemciyi diğer bölgelerdeki uç noktalara yönlendirir. Aşağıdaki yük devretme bölümünde senaryo ayrıntılı olarak açıklanmaktadır.

Normal Anlaşma

Yük devretme

Kullanılabilir uç nokta olmadığında primary , istemcinin /negotiate kullanılabilir secondary uç noktalardan seçim yapma. Bu yük devretme mekanizması, her uç noktanın en az bir primary uygulama sunucusuna uç nokta olarak hizmet vermesini gerektirir.

Yük devretme mekanizması işlemini gösteren diyagram.

Sonraki adımlar

Yüksek kullanılabilirlik ve olağanüstü durum kurtarma senaryolarında birden çok uç nokta kullanabilirsiniz.