2016-05-09 4 views
2

Ich habe versucht, unsere periodische Abrufwebseite durch ServiceStack Serverereignisse zu ersetzen, aber bei der Betrachtung des Verhaltens ist der Serverereignismechanismus tatsächlich viel mehr Aufwand als das, was wir getan haben - Rückmeldung In unserem Fall sind es ein paar hundert Bytes, die nur alle fünf Sekunden abgefragt werden - im Vergleich zu einem Herzschlag von 496 Bytes alle paar Sekunden, und die Ereignisstrom-Umfrage sieht im Durchschnitt sogar mehr aus. Kombiniert vielleicht 2-3 Kbps pro Client.Wie kann ich die Effizienz von ServiceStack Server Events verbessern?

Ich kümmere mich nicht zu viel um Latenz, aber ich interessiere mich für die Anzahl der Verbindungen und Bytes übertragen. Gibt es irgendeine Konfiguration, die den JavaScript-basierten Client ein wenig effizienter macht?

var source = new EventSource(
     '/event-stream?channel=someUpdate&t=' + new Date().getTime()); 
    $(source).handleServerEvents({ 
     receivers: { 

      some: { 
       Update: function(id) { 
        alert(id); 
       } 

      } 
     }, 
    }); 
+0

Haben Sie Probleme mit der Skalierbarkeit oder der Reaktionszeit bei SSE festgestellt oder sehen Sie sich nur die Bandbreite an? – mythz

+0

Meine Kunden bemerken ihre Mobilfunkrechnungen. :) – kevinc

Antwort

2

Die SSE Server Events Verbindung verwendet nur eine einzelne langlebige HTTP-Verbindung pro Abonnement und die Ereignisse sich wesentlich effizienter als Polling sind, da es nur die Daten Ereignis sendet anstelle des Overhead eines neuen HTTP Request und wiederholte HTTP Header jedes Mal.

Es klingt wie Sie die Herzschläge sind die Messung verwendet, um festzustellen, ob die SSE-Verbindung noch am Leben ist, die uses the following defaults:

IdleTimeout = TimeSpan.FromSeconds(30); 
HeartbeatInterval = TimeSpan.FromSeconds(10); 

Notieren Sie die Anzahl der Herzschläge pro Client konstant bleiben, das heißt, sie ändern sich nicht, ob Verbundene Clients erhalten mehrere Ereignisse pro Sekunde - Clients senden nur alle 10 Sekunden einen Herzschlag.

Wir haben Kunden mehrere tausend gleichzeitige Verbindungen mit diesen Voreinstellungen Handhabung aber Sie können die Herzschlagintervalle ändern, wenn Sie die ServerEventsFeature registrieren, zum Beispiel, um die Intervalle mit verdoppeln:

Plugins.Add(new ServerEventsFeature { 
    IdleTimeout = TimeSpan.FromSeconds(60), 
    HeartbeatInterval = TimeSpan.FromSeconds(20), 
}); 
+0

Vielen Dank, das scheint mir sehr geholfen zu haben. – kevinc

2

die Bandbreite ein reduzieren Bit vom Herzschlag, könnten Sie die ServerEventsFeatureOnCreated Methode überschreiben, um den Standard profileUrl zu strippen, da dies wahrscheinlich ein anständiges Stück des Heartbeat-Ereignisses in Bezug auf die Bandbreite pro Herzschlag ist, vorausgesetzt, Sie verwenden es nicht. Zum Beispiel:

Plugins.Add(new ServerEventsFeature 
{ 
    StreamPath = "/event-stream", 
    HeartbeatPath = "/event-heartbeat", 
    UnRegisterPath = "/event-unregister", 
    SubscribersPath = null, 
    LimitToAuthenticatedUsers = false, 
    NotifyChannelOfSubscriptions = false, 
    OnCreated = (subscription, request) => 
    { 
     subscription.Meta.Remove(AuthMetadataProvider.ProfileUrlKey); 
    } 
}); 
Verwandte Themen