2016-08-29 1 views
2

Wenn ich viele Client-Verbindungen habe, die Teil meines Hubs sind Hub_X, aber derzeit nicht Teil einer bestimmten Gruppe Group_Y, ist es schlechte Praxis, broadcast() bis Group_Y? Sollte ich im Auge behalten, ob jemand in meiner Group_Y ist, und prüfen Sie es entsprechend, bevor Sie es nur senden?Führt die Übertragung zu einer ASP.NET SignalR-Gruppe, die leer ist, zu Ressourcenverschwendung?

Oder funktioniert signalR im Wesentlichen keine Arbeit, wenn es erkennt, dass niemand in der Group_Y ist, und daher eine vernachlässigbare Menge an Ressourcen verwenden (im Vergleich zu sagen, zu verfolgen, wer in einer Gruppe ist). ?

Antwort

4

Broadcasting zu leeren Gruppen wie Sie beschreiben, hat einige Overhead, aber es ist wahrscheinlich vernachlässigbar je nach Anwendungsfall.

Nehmen wir an, Sie haben 100.000 Nachrichten in einer Warteschlange zu verarbeiten. Wenn Sie eine dieser Nachrichten verarbeiten, müssen Sie möglicherweise eine SignalR-Nachricht an Clients senden, die diese Daten überwachen, aber die große Mehrheit der Nachrichten enthält keine Beobachter.

Sie konnten die Nachricht/Einheit-ID als Namen der Gruppe nutzen und Code wie folgt ausführen für jeden der 100.000 Nachrichten:

var hub = GlobalHost.ConnectionManager.GetHubContext(hubName); 
var group = hub.Clients.Group(groupName) as GroupProxy; 
if (group != null) 
{ 
    group.Invoke(actionName, messageData); 
} 

Alternativ, wenn Sie irgendwie in der Lage waren zu verwalten HashSet von Gruppen, die tatsächlich Kunden (oder wahrscheinlich Kunden haben), dann können Sie Ihren Code ändern, wie so haben:

var activeGroups = new HashSet<string>(); 
... 
if (activeGroups.Contains(groupName)) 
{ 
    var hub = GlobalHost.ConnectionManager.GetHubContext(hubName); 
    var group = hub.Clients.Group(groupName) as GroupProxy; 
    if (group != null) 
    { 
     group.Invoke(actionName, messageData); 
    } 
} 

Dieses zweite Beispiel scheint übertrieben und führt die Komplexität der Verwaltung activeGroups (die probab in einer benutzerdefinierten Unterklasse von Hub durchgeführt werden). Außerdem hätte ich erwartet, dass intern SignalR bereits etwas genau so macht. Wenn ich dies jedoch mit 100.000 Nachrichten und Null-Clients vergleiche (dh: jede Gruppe ist leer), erhalte ich beim ersten Beispiel 2,5 Sekunden und beim zweiten Beispiel 0,006 Sekunden. Was auch immer SignalR intern tut, um leere Gruppen zu behandeln, ist sicherlich weniger effizient als ein HashSet Lookup.

den ersten Test Running (die langsame) im Visual Profiler Studio Leistung bestätigt, dass die meiste Arbeit im internen SignalR Funktionen ist, die unerwartet zu einem HashSet verglichen langsam sind:

Profiler results

Verwandte Themen