2009-04-29 6 views
1

Ich schreibe einen Anwendungsserver (wiederum nicht verwandt mit einer Frage, die ich hier bereits geschrieben habe) und frage mich, welche Strategien beim Erstellen von Worker-Threads für die Datenbank verwendet werden sollen. Einige vorläufige Daten: Der Server empfängt xml und sendet xml zurück, alle Anfragen fragen eine Datenbank ab - jede Anfrage kann ein paar Millisekunden bis zu einigen Sekunden dauern.Anzahl der Threads in einer Middleware-Anwendung

Sagen Sie zum Beispiel, dass Ihr Server eine kleine bis mittlere Anzahl von Clients bedient, die wiederum eine kleine Anzahl von Anfragen pro Verbindung senden. Ist es sicher, einen Worker-Thread pro Verbindung zu haben oder sollte es pro Anfrage sein? Sollte auch ein Thread-Pool verwendet werden, um die Ressourcen zu begrenzen, die vom Server verwendet werden, oder sollte ein Worker bei jeder neuen Verbindung/Anfrage hinzugefügt werden?

Sollte der Server die Anzahl der erstellten Threads auf einen oberen Grenzwert begrenzen?

Hoffe, ich bin nicht zu vage ... Ich kann kaum meine Augen offen halten.

Antwort

0

Die Art, wie ich Apps wie diese schreibe, besteht darin, die Anzahl der Threads über die Befehlszeile und/oder eine Konfigurationsdatei konfigurierbar zu machen. Ich mache dann einige Belastungstests mit verschiedenen Anzahlen von Threads - es gibt immer eine optimale Anzahl, über die hinaus die Leistung abnimmt.

2

Wenn Sie nicht über umfangreiche Erfahrung beim Schreiben von Anwendungsservern verfügen, ist dies eine entmutigende Aufgabe. Es kann mit Frameworks wie ACE gelockert werden, dass Sie verschiedene Konfigurationen von Ihrer App Infrastruktur wie Thread pro Verbindung, Thread-Pools, Führer Folger und laden Sie dann die entsprechende Konfiguration mit einem erweiterbaren Service-Framework aufbauen können.

ich diese Bücher auf ACE lesen würde empfehlen, erhalten

, um eine Vorstellung zu bekommen, was der Rahmen für Sie tun kann.

0

Wenn Sie dem von Java EE-Anwendungsserverentwicklern angenommenen Modell folgen, gibt es eine Warteschlange für eingehende Anforderungen und einen Pool von Worker-Threads, die sie bedienen. Es ist ein Thread pro Anfrage. Wenn ein Worker-Thread eine Anforderung erfüllt, geht er zurück in den Pool. Wenn die eingehenden Anforderungen schneller angezeigt werden, als der Worker-Thread-Pool sie verarbeiten kann, können sie in der Warteschlange gestapelt werden, bis ein Worker-Thread freigegeben wird. Sowohl die Größe der Warteschlange als auch der Thread-Pool können auf Ihre Situation abgestimmt werden.

Ich würde mich wundern, warum jemand das Bedürfnis hätte, seinen eigenen Server von Grund auf neu zu schreiben, besonders wenn das von Ihnen beschriebene Szenario von anderen so gut gelöst wird. Wenn dein Wunsch Bildung ist, viel Glück. Wenn Sie glauben, dass Sie das, was in der Vergangenheit getan wurde, verbessern werden, würde ich diese Annahme noch einmal überprüfen.

+0

Nicht alle von uns denken, dass das, was in der Vergangenheit getan wurde, der Höhepunkt menschlicher Errungenschaften ist. –

+0

Offensichtlich, aber es wurde getan. Manchmal ist der schnellste Code zum Schreiben der Stoff, den Sie gerade von jemand anderem verwenden. Es ist für mich überhaupt nicht klar, wie eine Green-Field-Lösung das bisher Erreichte verbessern wird, insbesondere wenn das Verständnis für vergangene Praxis so gering ist, dass eine solche Frage gestellt werden muss. – duffymo

+0

es geht nicht um dich - es geht um den Benutzer. Wenn Sie einen leistungsfähigeren Server schreiben können, profitieren Ihre Benutzer, auch wenn Sie länger brauchen, um sie zu schreiben. Manchmal ist ein für Ihr spezielles Szenario optimierter Server besser als die generischen Versionen, die jemand anderes geschrieben hat. – gbjbaanb

Verwandte Themen