2009-04-18 5 views
3

Ich habe in eingebetteten Systemen und Systemen Programmierung für Hardware-Schnittstellen bis heute zu arbeiten. Aus Spaß und persönlichem Wissen habe ich kürzlich versucht, mehr über Serverprogrammierung zu lernen, nachdem ich meine Hände mit Erlang nass gemacht habe. Ich gehe zurück und denke über Server aus einer C++/Java-Perspektive, und jetzt frage ich mich, wie skalierbare Systeme mit Technologie wie C++ oder Java gebaut werden können.Server-Design und Implementierung

Ich habe gelesen, dass aufgrund von Kontextwechsel und begrenztem Speicher ein pro-Client-Thread-Handler nicht realistisch ist. Normalerweise wird ein Thread-Pool erstellt und eine Mischung aus Worker-Threads und asynchronem I/O wird verwendet, um Anfragen zu bearbeiten. Ich frage mich zunächst, wie bestimmt man die Thread-Pool-Größe? Muss man einfach das optimale Gleichgewicht messen und finden? Wenn das System skaliert wird, wird möglicherweise mehr als ein Server benötigt, um Anfragen zu bearbeiten. Wie werden Anforderungen auf mehreren Servern verwaltet, die eine große Kundenbasis verarbeiten?

Ich bin nur auf der Suche nach einer Richtung in die ich vielleicht mehr lesen und Antworten auf meine Fragen finden könnte. In welchem ​​Bereich der Informatik würde ich mich für weitere Informationen in diesem Bereich interessieren? Gibt es Design-Muster für diesen Bereich des Computing?

+0

Ich schätze diese Frage, aber vielleicht sind es vier oder fünf Fragen in einem. – ojblass

Antwort

1

für C++ Ich habe Boost :: Asio verwendet, es ist sehr modern C++, und ziemlich angenehm zu arbeiten. Auch die C++ 0x-Netzwerkbibliotheken werden auf der ASIO-Implementierung basieren, also ist es wertvolles Wissen.

Wie für Designs 1 Threads pro Client, funktioniert nicht, wie Sie bereits gelernt haben. Und für Hochleistungs-Multithreading scheint die beste Anzahl von Threads CoresX2 zu sein, aber für Server gibt es eine Menge IO pro Anfrage, was bedeutet, dass viel Leerlauf wartet. Und aus der Erfahrung heraus betrachtet man bei Apache, MySQL und Oracle die Anzahl der Threads über CoresX10 für Datenbankserver und CoresX40 für Webserver, wobei man nicht sagt, dass dies die Ideale sind, aber sie scheinen Muster erfolgreicher Systeme zu sein kann ausgeglichen werden, um mit ähnlichen Zahlen optimal zu arbeiten, zumindest werden Sie wissen, dass Ihr Entwurf nicht völlig miserabel ist.

3

Ihre Frage ist zu allgemein, um eine nette Antwort zu haben. Die Antwort hängt stark vom Kontext ab, davon, wie viel ein einzelner Thread verarbeitet, wie schnell Anfragen eingehen, von der verwendeten CPU-Familie, vom verwendeten Webcontainer und von vielen anderen Faktoren.

1

Wie Lothar verwenden wir die Bibliothek ACE, die Reaktor- und Proactor-Muster für die Behandlung asynchroner Ereignisse und asynchroner E/A mit C++ - Code enthält. Wir verwenden umfangreiche Worker-Thread-Pools, die nach Bedarf wachsen (bis zu einem konfigurierbaren Maximum) und im Laufe der Zeit verkleinert werden.

Einer der Tricks mit C++ ist, wie Sie Ausnahmen und Fehlersituationen über Netzwerkgrenzen hinweg propagieren (was nicht von der Sprache gehandhabt wird). Ich weiß, dass es Möglichkeiten gibt, mit .NET Ausnahmen über diese Netzwerkgrenzen hinweg zu werfen.

Eine Sache, die Sie betrachten können, ist in SOA (Service Oriented Architecture) für den Umgang mit übergeordneten verteilte Systemprobleme zu suchen. ACE, wenn Sie wirklich auf dem blanken Metall der Maschine laufen wollen.