3 Stimmen

Server-Design und Implementierung

Ich habe im Bereich eingebettete Systeme und Systemprogrammierung für Hardware-Schnittstellen gearbeitet. gearbeitet. In letzter Zeit habe ich versucht, mehr über die Serverprogrammierung zu lernen, nachdem ich mich mit Erlang vertraut gemacht hatte, um Spaß zu haben und mein Wissen zu erweitern. Ich habe mich mit Servern aus einer C++/Java-Perspektive beschäftigt und frage mich nun, wie skalierbare Systeme mit Technologien wie C++ oder Java gebaut werden können.

Ich habe gelesen, dass aufgrund des Kontextwechsels und des begrenzten Speichers ein Thread-Handler pro Client nicht realistisch ist. Normalerweise wird ein Thread-Pool erstellt und eine Mischung aus Worker-Threads und asynchroner E/A verwendet, um Anfragen zu bearbeiten. Ich frage mich vor allem, wie man die Größe des Thread-Pools bestimmt? Muss man einfach messen und das optimale Gleichgewicht finden? Wenn das System skaliert, wird vielleicht mehr als ein Server benötigt, um Anfragen zu bearbeiten. Wie werden die Anfragen über mehrere Server hinweg verwaltet, die einen großen Kundenstamm bedienen?

Ich suche nur nach Hinweisen, wo ich mehr lesen und Antworten auf meine Fragen finden kann. In welchem Bereich der Informatik sollte ich nach weiteren Informationen in diesem Bereich suchen? Gibt es irgendwelche Entwurfsmuster für diesen Bereich der Informatik?

3voto

Eddie Punkte 52504

Ihre Frage ist zu allgemein, als dass es eine schöne Antwort geben könnte. Die Antwort hängt stark vom Kontext ab, davon, wie viel ein einzelner Thread verarbeitet, wie schnell Anfragen eintreffen, von der verwendeten CPU-Familie, dem verwendeten Web-Container und vielen anderen Faktoren.

1voto

lothar Punkte 19157

C++ Netzwerkprogrammierung: Komplexität meistern mit ACE und Patterns und C++ Netzwerkprogrammierung: Systematische Wiederverwendung mit ACE und Frameworks sind sehr gute Bücher, die viele Entwurfsmuster und deren Verwendung mit dem hoch portablen ACE Bibliothek.

1voto

chrish Punkte 2244

Wie Lothar verwenden auch wir die ACE Bibliothek, die Reactor- und Proactor-Muster für die Handhabung asynchroner Ereignisse und asynchroner E/A mit C++-Code enthält. Wir verwenden große Worker-Thread-Pools, die nach Bedarf wachsen (bis zu einem konfigurierbaren Maximum) und mit der Zeit schrumpfen.

Einer der Tricks bei C++ ist die Weitergabe von Ausnahmen und Fehlersituationen über Netzwerkgrenzen hinweg (was nicht von der Sprache gehandhabt wird). Ich weiß, dass es mit .NET Möglichkeiten gibt, Ausnahmen über diese Netzwerkgrenzen hinweg auszulösen.

Eine Möglichkeit, die Sie in Betracht ziehen können, ist die Untersuchung von SOA (Service Oriented Architecture), um Probleme mit verteilten Systemen auf höherer Ebene zu lösen. ACE ist wirklich für den Betrieb auf dem Bare Metal der Maschine gedacht.

1voto

Robert Gould Punkte 66858

Für C++ habe ich boost::asio verwendet, es ist ein sehr modernes C++, und sehr angenehm zu arbeiten. Auch die C++0x Netzwerkbibliotheken werden auf der ASIO-Implementierung basieren, also ist es wertvolles Wissen.

Was die Entwürfe betrifft, so funktioniert 1 Thread pro Client nicht, wie Sie bereits gelernt haben. Und für Hochleistungs-Multithreading scheint die beste Anzahl von Threads CoresX2 zu sein, aber bei Servern gibt es viel IO pro Anfrage, was viel Leerlauf bedeutet. Aus Erfahrung weiß ich, dass bei Apache, MySQL und Oracle die Anzahl der Threads bei Datenbankservern etwa bei CoresX10 und bei Webservern bei CoresX40 liegt. Ich sage nicht, dass dies die Ideale sind, aber es scheinen die Muster erfolgreicher Systeme zu sein, wenn also Ihr System so ausbalanciert werden kann, dass es mit ähnlichen Zahlen optimal funktioniert, wissen Sie zumindest, dass Ihr Design nicht völlig lausig ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X