Irgendwelche Vorschläge für Komponenten als Basis für einen skalierbaren TCP-Server? Ich habe derzeit eine Implementierung, die Indy verwendet, die gut für etwa 100 relativ aktive Verbindungen oder 1.000 relativ inaktive Verbindungen funktioniert, aber der eine Thread pro Verbindungsmodell begrenzt die Anzahl der gleichzeitig aktiven Verbindungen, die gehandhabt werden können.
Sagen wir, mein Ziel könnten 1000 Verbindungen sein, die jeweils 10 Nachrichten pro Sekunde oder 10.000 Verbindungen verarbeiten, die jeweils 1 Nachricht pro Sekunde auf einem guten Server (8-16 Kerne) verarbeiten. Ist das realistisch? Ich würde wirklich gerne von realistischen Implementierungen hören, weil ich herausgefunden habe, dass das, was theoretisch funktionieren könnte, nicht unbedingt in der Praxis funktioniert und ich nicht einer vorgeschlagenen Lösung nachjagen will, die nicht funktionieren wird.
Bearbeiten: IOCP wäre gut, aber ich möchte nur kommerzielle Klassen / Komponenten verwenden, also müssen sie so "professionell" wie Indy oder IP * funktionieren, bevor ich daran denke benutze sie. Darüber hinaus habe ich nicht die Absicht, meine eigene Lösung zu "rollen" - es würde zu viel Zeit brauchen, um sie kommerziell zu machen. Schließlich suche ich nach einer deutlichen Verbesserung gegenüber dem, was ich bereits habe. Ich bin mir sicher, dass ich mindestens 20-50% mehr von dem, was ich habe, herauspressen kann (basierend auf Indy), aber ich werde nie in der Lage sein, 10.000 gleichzeitige Clients oder 10.000 Nachrichten pro Sekunde zu handhaben, egal wie sehr ich es versuche . Ob es etwas gibt, das diese Bedingungen erfüllt, ist eine andere Sache.
Ich habe mich entschieden, die Antwort auf die IOCP-Klassen zu akzeptieren, obwohl ich sie nicht benutzt habe, weil sie in dieser Phase den besten Weg für eine Untersuchung darstellen.
Es gibt ein Projekt unter Ссылка , die auf dem früheren Projekt iopclasses basiert.
Es behauptet, Tausende gleichzeitige Verbindungen :
zu behandelnIOCP-Engine besteht aus Klassen, Komponenten und Routinen für Rapid Erstellung hoch skalierbarer und leistungsfähiger TCP / UDP-Anwendungen. Anwendungen, die mit IOCP-Klassen erstellt wurden, können tausende verarbeiten gleichzeitige Verbindungen.
Bibliothek ist in Delphi geschrieben - Delphi 7 - 2010 werden unterstützt.
Bibliothek verwendet IO-Completion-Ports-Technologie. Es ist am mächtigsten Technologie in Win32 World für die Erstellung hoch skalierbar und Leistung TCP / UDP-Anwendungen. Diese Technologie wird auf allen Desktops unterstützt Windows-Betriebssysteme außer alten Win9x / WinME-Versionen.
Diese Bibliothek ist unter MPL1.1 lizenziert. Es enthält auch einige Dateien von Jedi-Projekt (Winsock2-Header-Übersetzung).
Meine bevorzugte Delphi-Netzwerkebene ist ICS von Francois Piette . Es ist fantastisch einfach zu verstehen, sehr skalierbar und extrem hohe Leistung. Kostenlos und Open Source. Wird wahrscheinlich für die meisten Leute auf 1000 Clients skalieren, ohne großen Aufwand und ohne die Komplexität, die mir Probleme bereitet, wenn ich Indy benutze.
Ich habe einen 20% igen Skalierbarkeits- / Leistungsschub bekommen, indem ich all meine Sachen von Indy auf ICS umgestellt habe.
Die wirklich entscheidende Tatsache ist, was Sie bei jeder dieser Transaktionen vorhaben.
Ich verwende Indy mit Netzwerklastenausgleich-Windows-Servern. Eine dieser Delphi-Anwendungen wird von drei physischen Servern bedient, die eine öffentliche IP-Adresse abhören, für die wir seit gestern Millionen von Anfragen mit null Fehlern erhalten haben. Laden über Nacht ist ziemlich ungenutzt, so dass die tatsächlichen Anforderungen während des Tages rund 350 / Sekunde / Server sind und es gibt viel Platz für Wachstum.
Wenn pro Transaktion nicht viel CPU / Speicher benötigt wird, kommt man mit Indy auf einer Box davon. Alles hängt von der Last ab, da Sie wahrscheinlich nicht jede Sekunde in 1000 verschiedene Dateien schreiben können.
Es gibt noch andere Dinge, über die Sie sich Sorgen machen müssen - wie das Betriebssystem, das diese Menge an Aktivitäten unterstützt. Möglicherweise müssen Sie einige Registrierungseinstellungen optimieren. (Siehe hierzu stackoverflow question )
IOCP ist der Weg zu Ultra-Capacity-Servern. Ich habe Indy für die einfache Verwendung in Implementierung / Debugging für eine sehr lange Zeit verwendet. Ich habe meine eigene IOCP-Implementierung, die ich vor Jahren geschrieben habe, aber nie in der Produktion umgesetzt, wie wir es einfach nicht brauchen.
Mein einfacher Ratschlag - Ich schlage vor, es in Indy auszuprobieren, NLB als Lastkrücke zu verwenden und danach, wenn Sie immer noch die höchste Geschwindigkeit anstreben, schreiben Sie Ihre eigene IOCP-Implementierung, damit Sie sie zu Ihrem erstellen können Spezifische Anforderungen. Beachten Sie, dass dies darauf basiert, dass Sie nichts über die tatsächlichen Implementierungsanforderungen wissen.
Ich habe mehrere Delphi-Lösungen für die Netzwerkarbeit ausprobiert und herausgefunden, dass viele, wenn nicht alle Lösungen Komplexität und Code hinzufügen, die sich auf die Leistung oder den Footprint oder beides auswirken. Also begann ich nach dem leichtesten Wrapper um die Winsock-API zu suchen. Ich habe Delphis eigene TTcpClient- und TTcpServer-Komponenten (wieder) entdeckt. Im Blockiermodus und beim Überschreiben von TCustomTcpServer beim Überschreiben der DoAccept-Methode habe ich bisher die besten Ergebnisse erzielt.
Wenn Sie eine sehr hohe Anzahl eingehender Verbindungen und (kleine) Antworten für (kleine) Anfragen erwarten, ist es sehr ratsam, E / A-Abschluss-Ports , da damit eingehende Anfragen besser behandelt werden.
Ich habe ICS in den letzten 12 Jahren benutzt. Es ist nicht blockierend. Ich unterstütze bis zu 2000 gleichzeitige Verbindungen mit jeweils mindestens 5000 Bytes pro Sekunde, gesendet als 1000 Bytes alle 200 ms. Nie mit irgendwelchen Problemen konfrontiert und CPU-Nutzung der App ist sehr klein. Gute Unterstützung im Forum, aber überhaupt nicht erforderlich.
Shekar
Tags und Links delphi