Frage

Ich benutze die neueste Version von SignalR und es ist großartig.Ich bin jedoch kürzlich auf ein interessantes Skalierungsproblem gestoßen:es scheint, dass SignalR alle Gruppen des Clients vom Client in der Abfragezeichenfolge sendet.Mein System erfordert, dass eine Person zahlreichen Gruppen beitritt, die alle Projekte repräsentieren, die der Benutzer abonniert hat, und Benachrichtigungen zu jedem von ihnen erhält.

diese große Anzahl von Gruppen (und ich, die GUIDs für IDs verwenden) hat dazu geführt, dass die Abfragezeichenfolge ihre maximale Größe erreicht hat und SignalR nicht mehr funktioniert.

Dies ist, was Fiddler im Anforderungs-Webformular anzeigt (unter Verwendung einer langen Abfrage für den Azure-Fehler):

transport   longPolling
connectionId    bbed6f35-8379-4be3-ac28-ef3e618382ae
connectionData  [{"name":"jethub"}]
messageId   85
groups  ["JetHub.f9f81bcc-8417-46bd-bae5-c4134972601d","JetHub.5139a8de-04c2-48da-9427-39666e52fabd","JetHub.6b12e333-4d22-47c3-8587-7a9ad5026184","JetHub.252ea279-7a71-40e7-b03c-7d63e69f07ab","JetHub.a4843a77-1e6d-4693-b3de-b392ef465410","JetHub.27feb53a-3c2d-4b11-92f7-dbdffb874b25","JetHub.8840dfcf-e6be-4b72-965b-b282a60446e8","JetHub.bf7d3301-6fc0-4499-bee8-fe22f1bc2281","JetHub.655cba0e-7f72-402c-b80b-dcb740546163","JetHub.85d817e2-67a3-4291-b564-5320598339f6","JetHub.e3079263-3f6e-4a54-ad88-0dfc5dd2ce18","JetHub.33f00a67-9b05-4293-8119-4617e2fed9b0","JetHub.6323cfe8-fb81-4716-b553-79b9d72641a5","JetHub.b4359f8a-030a-4ac9-aacd-c05b42163bcc", ... many more]

Ich weiß, dass ich die Abfragezeichenfolgengröße in IIS erhöhen kann, aber gibt es eine bessere Möglichkeit, Gruppen zu verwalten, oder sollte ich versuchen, mein serverseitiges Gruppierungsschema zu erstellen und separat an jeden Client zu senden?können PersistenConnections in dieser Hinsicht helfen?

Danke.

War es hilfreich?

Lösung

Da Gruppen über die Abfragezeichenfolge in Signalr 0.5.3 abgerundet werden, haben Sie folgende Optionen: a) Erhöhen Sie die maximale Abfragezeichengröße b) Verwenden Sie kürzere Gruppennamen c) Griff, die sich auf dem Server gruppieren und jeden Benutzer separat sendet

PersistentConnections hilft hier nicht, da die Hub-API auf ihnen aufgebaut ist, so dass Sie in das gleiche Problem laufen.

Andere Tipps

Ich weiß, dass dies bereits zu Ihrer Zufriedenheit beantwortet wurde, aber es gibt eine Möglichkeit, Gruppen auf dem Server zu verwalten, ohne Nachrichten einzeln an jeden Client zu senden.Sie können Ihren eigenen HubDispatcher implementieren:

using System.Collections.Generic;
using SignalR;
using SignalR.Hubs;

namespace My.Hubs
{
    public class MyHubDispatcher : HubDispatcher
    {
        public MyHubDispatcher() : base("/myhubs") { }

        protected override Connection CreateConnection(string connectionId, IEnumerable<string> signals, IEnumerable<string> groups)
        {
            //ex: IEnumerable<string> myGroups = new string[] { "MyHub.MyGroup", "MyHub.MyOtherGroup", "MyOtherHub.MyGroup" };
            IEnumerable<string> myGroups = GetGroups(connectionId);
            return base.CreateConnection(connectionId, signals, myGroups);
        }
    }
}

Sie können dann das Routing wie jede andere PersistentConnection einrichten:

using System.Web;
using System.Web.Routing;
using SignalR;

namespace My
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class Application : HttpApplication
    {
        protected void Application_Start()
        {
            RouteTable.Routes.MapConnection<Hubs.MyHubDispatcher>("myhubs", "myhubs/{*operation}");
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }
}

Dann können Sie Gruppen auf Ihren Hubs wie gewohnt verwenden:

using SignalR.Hubs;

namespace My.Hubs
{
    public class MyHub : Hub
    {
        public void AlertClients(string id, int duration)
        {
            Clients["MyGroup"].Alert("MyGroup");
            Clients["MyOtherGroup"].Alert("MyOtherGroup");
        }
    }
}

Wenn Sie den JS-Client verwenden, können Sie das Skript einfach unter einfügen ~/myhubs/hubs statt ~/signalr/hubs.Wenn Sie den .NET-Client verwenden, verwenden Sie einfach new Client.Hubs.HubConnection("http://foo/myhubs", useDefaultUrl: false);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top