Frage

sind wir einen Kunden haben, die interaktiven Nachrichten von einem Server erhalten muss, von Kunden, die auf der ganzen Welt hinter allen Arten von Firewalls mit allen Arten von Ports geschlossen verteilt sind. Das einzige, was wir uns verlassen können, ist HTTP-Port 80 (und HTTPS 443).

Das Design ist im Grunde nach XMPP (Jabber-Protokoll), mit unseren Kunden und IIS modelliert. Die Client-Probleme GET-Anfragen an einen .NET-Handler; der Handler hält die Anforderung offen für eine Weile nach Nachrichten suchen. Wenn alle Nachrichten ankommen, werden sie sofort an den Client gesendet; Wenn nicht, dann nach einer Zeitüberschreitung wird die Verbindung mit einem „no-Daten“ -Antwort geschlossen. Der Kunde sofort wieder öffnet die Kommunikation.

Nun, theoretisch.

Was tatsächlich passiert zuerst, kann IIS Griff nicht mehr als etwa 100 gleichzeitige Anfragen - andere alle anstehen, und es kann eine mehr Minuten Verzögerung zwischen „verbunden“ sein und IIS zu erkennen, dass der Client in genanntem Zweiter, über. die Hälfte der Zeit die Client-Timeout ohne Antwort vom Server (der Client-Timeout ist fünf Minuten länger als die des Servers).

POST immer funktioniert. Andere Daten dienten auf dem gleichen Web-Server funktioniert. Web-Services auf demselben Server zu arbeiten. Dies ist eine Out-of-the-Box-Installation unter Windows 2K3 Server.

Gibt es eine Konfigurationsoption uns fehlt, oder gibt es etwas, das ich an zu adressieren aussehen sollte?

Danke.

War es hilfreich?

Lösung

Ich glaube, Sie ASP.NET-Thread-Pool Grenzen treffen sind, anstatt IIS diejenigen. Schauen in einen asynchronen HTTP-Handler zu schaffen (IHttpAsyncHandler) als wenn sie blockieren / wait sie binden nicht den Thread-Pool (sie verwenden Completion Ports statt).

Aktualisieren : über das kam vor kurzem, die mit meinem Denken zu stimmen scheint: Codeproject: Scalable COMET In Kombination mit ASP.NET

Andere Tipps

Wenn IIS nicht Ihren Anforderungen passt, sollten Sie einen anderen Web-Server wählen, wie Apache (mit mod_mono ) oder LightTPD .

BTW, können Sie Tunnel XMPP über HTTP mit XMPP über BOSH . Keine Notwendigkeit, ein eigenes Protokoll zu erfinden.

Aus dem Kasten heraus, benötigt Fenster einige tweeking. Ich hatte einen Kometen Server in asp.net zu implementieren und lief in einige dumme Standardwerte. Nach dem Lesen dieser Links:

Ich kam mit den folgenden Änderungen auf, die an unseren Fenstern 2k8 Server vorgenommen wurden.

  • reg add HKLM \ System \ CurrentControlSet \ Services \ HTTP \ Parameters / v MaxConnections / t REG_DWORD / d 1000000 / f
  • reg add HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters / v TcpTimedWaitDelay / t REG_DWORD / d 30 / f
  • reg HKLM \ SOFTWARE \ Microsoft \ ASP.NET hinzufügen \ 2.0.50727.0 / v MaxConcurrentThreadsPerCPU / t REG_DWORD / d 0 / f
  • reg HKLM \ SOFTWARE \ Microsoft \ ASP.NET hinzufügen \ 2.0.50727.0 / v maxConcurrentRequestsPerCPU / t REG_DWORD / d 30000 / f
  • appcmd.exe Satz AppPool "[App-Pool-Name]" / QueueLength: 65535
  • appcmd.exe set config / section: serverRuntime / appConcurrentRequestLimit: 100000
  • reg add HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters / v MaxUserPort / t REG_DWORD / d 65534 / f
  • reg add HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters / v MaxFreeTcbs / t REG_DWORD / d 2000 / f
  • reg add HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters / v MaxHashTableSize / t REG_DWORD / d 2048 / f reg HKLM \ System hinzufügen \ CurrentControlSet \ Services \ InetInfo \ Parameters / v MaxPoolThreads / t REG_DWORD / d 80 / f
  • appcmd set config / section: Process / requestqueue: 100000 / commit: MACHINE

Ich weiß nicht, ob alle Änderungen erforderlich waren oder optimal, aber mit etwas Quik Tesing vor einem Test-Server, wir achived über 30k Ausführung Verbindungen und 5k Anfragen pro Sekunde. Kann nicht weiter gehen, weil ich aus Client-Rechnern lief aus, die Tests ausgeführt werden.

XMPP wurde nie für Hochleistungsanwendungen ausgelegt. Die Meldungen müssen den gesamten Stapel auf der Anwendungsschicht durchqueren, und es gibt eine Menge von XML-Parsing. Haben Sie darüber nachgedacht einen anderen Standard neben XMPP mit?

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