kostenloser Webspace werbefrei: lima-city


Hochskalierbarer Java Webserver

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    g****e

    Hey,
    Ich möchte vorankommen in meinem Wissen um groß angelegte Webprojekte, und habe nun vor kurzem den Anreiz bekommen, mit Java hoch skalierbare und hoch performante Java Webservices zu schreiben. Leider stellt sich das alles als schwerer heraus, als es sein sollte.
    Java an sich ist mir geläufig, damit komm ich ganz gut klar, jedoch ist das Webserver Entwickeln für mich ein bisschen schwerer als es sein sollte.

    Ich arbeite normalerweise mit PHP, wo einem ja alles abgenommen wird, oder entwickel seit ca nem halben Jahr alles Serverartige mit NodeJS. Mit NodeJS muss ich mich aber quasi um nichts kümmern, da dies ein sehr sehr simples System ist. Mit NodeJS kann ich SingleThreaded Async Webservices schreiben, die auch 1000-10000 Anfragen pro Sekunden ganz gut verkraften. Das möcht ich nu auch mit Java erreichen können, bzw erlernen.

    Mein Anfang bestand darin, ein bisschen rum zu googln, aber leider habe ich irgendwie nichts gefunden, was wirklich logisch erschien. Die meisten Tutorials bauen Singlethreaded (offensichtlich) Syncron Webservices, die keine solche Performance erreichen dürften. Darum bin ich jetzt verwirrt und weiß einfach nicht so wirklich weiter :-S Und wenn ich 50 Threads aufsetze, die alle Verbindungen entgegen nehmen und verarbeiten, dann bekomm ich doch auf dauer, bzw mit zu vielen Threads CPU Zuweisungs Probleme? (einzelner Prozess, 50 Threads, da bekommt jeder Thread nur 1/50 der Laufzeit des Prozesses, oder irre ich?) Also optimal ist es in meinen Augen nicht :-S

    Ich würde mich freuen, wenn ihr mir da ein bisschen Input geben könnt, der mich wirklich voran bringt. Ziel ist, dass eine Anfrage mindestens 10 SQL Anfragen, eine Datei auslesen und diese Daten mittels Regex zu kombinieren (vllt 20 Regex replacements?). Einfach, dass das Ziel auch ein bisschen Last abkann. Klar würde das alles noch optimiert, aber auch Last muss das ganze ab können...
    Ich würd mich einfach freuen, ich komm so nicht an Ziele hab ich das Gefühl.

    Liebe Grüße
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Die meisten Tutorials bauen Singlethreaded (offensichtlich) Syncron Webservices, die keine solche Performance erreichen dürften.

    Nach was hast du denn gesucht? Wie man sich einen eigenen Webserver in Java programmiert?

    Ich weiß ja nicht, wie brutal effizient deine Webanwendung sein muss, aber die klassische Wahl für Java+Web ist Tomcat, sofern du den Webserver nicht selber schreiben willst.

    Daher: Kannst du bitte nochmal kurz erläutern, ob du einen Webserver in Java schreiben willst, oder ob du lediglich eine Webanwendung schreiben willst.
  4. Autor dieses Themas

    g****e

    Grundlegend soll es ein Webservice werden. Es geht hauptsächlich um die Verarbeitung von Anfragen. Einen kompletten Webserver würd ich auch schreiben, um alle Grundlagen auch in Java durch zu exerzieren und zu verstehen.

    Brutal effizient, vllt hab ich auch ein bisschen übertrieben^^ Ich möcht halt so viel wie möglich rausholen. 5k Verbindungen pro Sek sollten schon drin sein denk ich, zumindest für den Test (wobei, ich glaube, das ist schwer zu messen... Das Setup für die 5k Verbindungen muss ich erstmal definieren, das wäre dann im direktvergleich mit NodeJS denk ich mal).
    An Tomcat hab ich noch nicht gedacht, danke. Das werd ich mir nochmal anschauen und ausprobieren.

    Gesucht hatte ich als erstes nach "java webserver", aber auch nach "high performance webserver java" oder "high performance java webserver tutorial". Ich such schon seit nen paar Tagen, da erinner ich mich nicht an alles.
    Man findet auch viele Frameworks dafür (viele ist untertrieben, SEHR viele), wovon Javaxt auf Anhieb gut aussah.

    Vielleicht kann man es ein bisschen verallgemeinern: Ich möchte mich mit groß angelegten Serverprojekten beschäftigen. Dabei soll es nicht nur um einen Blog gehen, der 100 Besucher die Stunde hat, sondern eher vergleichbar mit einem größeren Newsportal mit wirklich 1000-10000 Besucher die Minute (dadurch aber zwangsweise auch entsprechend viele Anfragen für Bilder usw usf). Oder sonst ein Dienst, der halt sehr groß angelegt ist. Da ich bisher aber nur mit PHP und Javascript gearbeitet habe auf Serverseite möcht ich jetzt mal mit einer Sprache arbeiten, die das nicht so easy macht. Ich bin noch nicht dahinter gekommen, wie ich die Anfragen effizient und schnell verarbeiten kann. Da geht es um Input.

    Tut mir leid, wenn der Anfang ein bisschen holprig formuliert ist, ich hoffe ihr verzeiht.
    Ich sag schonmal Danke :)

    Liebe Grüße
  5. Hey,
    ich denke, dass du in Java EE die Anwendung schreiben möchtest.

    Du musst keinen Server selber schreiben. Es gibt, wie oben bereits erwähnt, den Tomcat oder Glassfish Server.

    Ich kann dir Tutorials empfehlen, die mir damals auch sehr geholfen haben:
    Youtube Videos, die leider unvollständig sind, aber für den Anfang ganz nett:
    http://www.jofre.de/javaeetutorial/

    Die Tutorial Reihe von Arun Gupta ist sehr gut, es gibt noch mehr Interessante Videos von ihm auf Youtube:
    http://www.youtube.com/watch?v=m_33ZHYCjf8

    Und natürlich das Java EE 6 Tutorial von Oracle:
    http://docs.oracle.com/javaee/6/tutorial/doc/

    Mit Java EE 7 habe ich mich noch nicht beschäftigt, scheint aber ganz gute Änderungen zu haben, daher nur der Link zum Tutorial von Oracle:
    http://docs.oracle.com/javaee/7/tutorial/doc/home.htm
  6. ggamee schrieb:
    Vielleicht kann man es ein bisschen verallgemeinern: Ich möchte mich mit groß angelegten Serverprojekten beschäftigen. Dabei soll es nicht nur um einen Blog gehen, der 100 Besucher die Stunde hat, sondern eher vergleichbar mit einem größeren Newsportal mit wirklich 1000-10000 Besucher die Minute (dadurch aber zwangsweise auch entsprechend viele Anfragen für Bilder usw usf). Oder sonst ein Dienst, der halt sehr groß angelegt ist.

    Solche Angebote laufen in der Regel nicht nur auf einer Maschine. Du hast dann mehrere Maschinen und einen Load-Balancer. Zusätzlich kannst du noch Content-Delivery-Networks für Multimediainhalte verwenden.

    Node.js mag zwar ein imposantes Stück Software sein, aber die Leistungsfähigkeit wird nicht nur auf das asynchrone Thread-Modell zurückzuführen sein. Da spielen noch viel mehr Optimierungsmaßnahmen eine Rolle.


    Da ich bisher aber nur mit PHP und Javascript gearbeitet habe auf Serverseite möcht ich jetzt mal mit einer Sprache arbeiten, die das nicht so easy macht.

    Ein ungewöhnliches Vorhaben. Aber vielleicht ist die Formulierung deinerseits auch nur unglücklich. Die Leute von Zend sind schließlich auch nicht doof und sind darum bemüht PHP effizient zu machen.


    Ich bin noch nicht dahinter gekommen, wie ich die Anfragen effizient und schnell verarbeiten kann. Da geht es um Input.

    Da kommen viele Details ins Spiel. Du musst verstehen, wie die Kommunikation und die Verarbeitung funktioniert. Und erst wenn du das verstehst, kannst du optimieren. Daher solltest du dich erstmal grundsätzlich mit der Funktionsweise des Internets auseinander setzen (OSI-Schichtenmodell, gängige Protokolle, Routing, Sockets, ... ) sowie der Funktionsweise der JVM. Außerdem kann es hilfreich sein sich mit C und Assembler auseinander zu setzen, um zu verstehen, wie Programme grundsätzlich funktionieren.

    Und wenn du dann noch eine Datenbank nutzen willst, gibt es wiederum eine ganze Menge zu lernen, wie man damit effizient arbeitet.

    Du siehst also, Optimerung ist ein komplexes Themengebiet. Daher wirst du auch kein Tutorial finden, dass dir alles erklärt.

    Beitrag zuletzt geändert: 31.8.2013 10:42:54 von bladehunter
  7. Autor dieses Themas

    g****e

    Danke :)

    Dass nicht alles auf einem Server laufen würde, da bin ich sicher, das ist mr auch bewusst. Wenn ich aber eine Serversoftware entwickel, die total ineffizient ist, dass ich 5 Server hinstellen müsst, statt einem, dann ist das für mich nicht zufrieden stellend.
    Eine Lösung muss effizient und elegant sein. Und dazu gehört natürlich auch ein Verständnis dessen, was ich da machen.

    PHP wird natürlich immer effizienter, und ich habe schon imense Steigerungen von PHP5.4 auf PHP5.5 und damit die integration des Zend Optimizers gesehen. Vorher hat das ertellen einer Sitemap für meinem Blog ca 2Sek und 37,5Mb Arbeitsspeicher gebraucht, nach dem Update bin ich bie nichtmal mehr 0,5 Sek und 7,5Mb Arbeitsspeicher pro Erstellung der Sitemap. Natürlich ist das ein guter Schritt, wunderschön, aber ich möchte meinen Horizont halt nicht auf das beschränken, was ich schon kenne, sondern neues Sehen, neues Lernen, und neues Verstehen. Noch sind Semesterferien, und weil ich mich nicht so sehr mit den mich plagenden Krankheiten beschäftigen möchte, OPs werden mit pech halt kommen, widme ich meine Zeit diesem hier :)

    Meine Formulierungen sind leider, irgendwie, ich weiß nicht genau wie ich mein Ziel ausdrücken soll... Ich möchte halt in meinem Wissen weiter kommen, in meinem Verständnis und auch in meiner Fähigkeit, etwas größeres Aufzubauen. Ich wurde gefragt, ob ich in der Lage bin große Dienste aufzubauen, eigentlich mit Java, und die Antwort war ein schlichtes: "Noch nicht". Ich möchte es lernen, und das ist auch möglich. Alles ist möglich, dem der da glaubt.

    Wie die JVM genau funktioniert, das weiß ich garnicht so genau. Das ist eine gute Idee, mir auch das noch einmal näher anzuschauen. ISO/OSI, Grundlagen der Netzwerktechnik im Bezug auf Routing, NAT, DNS, ein paar Protokolle (leider nicht sehr viele), die Grundlagen denke ich habe ich. Spätestens seit dem Studium, da ich hier die entsprechenden Fächer mit 1.0 bzw 1.3 bestanden habe.
    C und Assembler, die ganze Umgebung um gcc, objdump, gdb, Speicheranalyse und so ist ein spannendes Thema, bin ich sogar nebenbei auch am werkeln mit, aber nicht oft. Ich lerne das mit einem Debian3 System, da hier die ganze Optimierung mit dem GCC noch nicht so stark ist, und man den Code ein bisschen umfassender Verstehen kann. Aber Assembler besonders ist ein echt schweres Thema find ich. Ich kann mich nur schwer merken, wofür alle Register stehen. Eine Sache, die ich noch meistern werde, aber ich auf Anhieb garnicht hiermit in Verbindung brachte. Ich glaub von dir kann ich noch eine große Menge lernen bladehunter^^

    Hmm, nu hab ich 2, eig 3, interessante Themen, mit denen ich mich fast Zeitgleich beschäftigen möchte:
    - WebServer Entwicklung mit Java
    - C, Assembler und die Speicheranalysen
    - Allgemeine Optimierung in Zusammenhang mit eig beidem :-S
    Nachher mal bissel Pläne schreiben und alles Ordnen, ich glaub ich hab hier ein bisschen Viel, was ich mir gleichzeitig interessantes Ansehen möchte, und das führt zu nicht gutem Wissen, wenn man alles gleichzeitg macht :-S

    Ich sag schonmal Danke, die Java EE Videos werd ich mir speichern, die Anregungen von dir Bladehunter werd ich mir alle zu Herzen nehmen (solange es nicht morgen aufgibt :-D) und schauen, dass ich das alles erstmal Schritt für Schritt mache. Alles auf einmal wird nicht gut.

    Ich sag Danke und liebe Grüße :)
  8. ggamee schrieb:
    Dass nicht alles auf einem Server laufen würde, da bin ich sicher, das ist mr auch bewusst. Wenn ich aber eine Serversoftware entwickel, die total ineffizient ist, dass ich 5 Server hinstellen müsst, statt einem, dann ist das für mich nicht zufrieden stellend.
    Eine Lösung muss effizient und elegant sein.

    Das ist natürlich der Idealzustand. In der Realität hast du aber nur begrenzt viel Zeit. In der Regel ist es dann wichtiger eine Software zu haben die überhaupt funktioniert. Dann stellt man sich eben 5 Server hin, weil man sonst noch ein halbes Jahr damit beschäftigt wäre Code zu schreiben, ohne in dieser Zeit Geld zu verdienen.


    Meine Formulierungen sind leider, irgendwie, ich weiß nicht genau wie ich mein Ziel ausdrücken soll... Ich möchte halt in meinem Wissen weiter kommen, in meinem Verständnis und auch in meiner Fähigkeit, etwas größeres Aufzubauen. Ich wurde gefragt, ob ich in der Lage bin große Dienste aufzubauen, eigentlich mit Java, und die Antwort war ein schlichtes: "Noch nicht". Ich möchte es lernen, und das ist auch möglich. Alles ist möglich, dem der da glaubt.

    "Große Dienste" ist ein ungenauer Begriff. Meine Sichtweise auf die Dinge ist folgende:

    1) Große Programme schreibt man indem man alle Probleme, die in einem Projekt gelöst werden sollen, in möglichst kleine Teilprobleme zerlegt und für diese Teilprobleme möglichst einfache Lösungen findet.

    2) Große Programme benötigen eine Architektur, in der die einzelnen Komponenten aus 1) miteinander interagieren können. Diese Architektur kann bereits durch ein (Web)framework vorgegeben sein. Wichtig ist dabei die Modularität, die es einem erlaubt halbwegs unkompliziert einzelne Komponenten einzubauen und auch zu ändern. Eine Architektur muss nicht zwangsläufig besonders kreativ sein. Je nach Situation, können einfache Lösungen ausreichend sein.

    Geschwindigkeit wird in 1) und 2) nicht berücksichtigt, denn ein großes System ist nicht zwangsläufig langsam. Nehmen wir UNIX: Unix ermöglicht es einfache Shellprogramme miteinander über Pipes und Dateidescriptoren zu verbinden. Auch wenn es sehr viele Programme in einem UNIX-System gibt, hat dies kaum eine negative Auswirkung auf die Performance des Systems. Ein Grund dafür ist dass Modularität die Geschwindigkeit begünstigen kann, weil eben nicht alle Komponenten gleichzeitig geladen werden müssen (wobei man auch sagen muss, dass Modularität nicht nur gute Konsequenzen für die Preformance hat).

    Wenn man also von großen Systemen spricht, ist Geschwindigkeit kein zwangsläufiges Kriterium dass bei der Wahl der Architektur berücksichtigt werden muss.


    C und Assembler, die ganze Umgebung um gcc, objdump, gdb, Speicheranalyse und so ist ein spannendes Thema, bin ich sogar nebenbei auch am werkeln mit, aber nicht oft. Ich lerne das mit einem Debian3 System, da hier die ganze Optimierung mit dem GCC noch nicht so stark ist, und man den Code ein bisschen umfassender Verstehen kann.

    Die Option -O0 sollte eigentlich alle Optimierungen vermeiden. Auch auf aktuellen Systemen.
    Korrektur: Laut manpage ist -O0 der default. Ich vermute dass spätere GCC Versionen aktuellere Befehle für x86 CPUs kennen und daher etwas schwerer zu verstehen sind.

    Falls du das Geld über hast, kauf dir lieber das Buch hier: http://duntemann.com/assembly.html. Das ist viel spannender zu lesen als automatisch generierter Assemblercode.


    Aber Assembler besonders ist ein echt schweres Thema find ich. Ich kann mich nur schwer merken, wofür alle Register stehen.

    Assembler ist nicht schwer. Assembler ist bloß umständlich, weil Computer so unglaublich doof sind. Es geht nicht darum alle Details zu kennen, sondern die grundsätzliche Arbeitsweise des Computers auf Assemblerebene zu verstehen. Wenn du auf der JVM programmierst, kannst du eh kein Assembler verwenden (JNI mal ausgeklammert).

    Beitrag zuletzt geändert: 31.8.2013 17:46:55 von bladehunter
  9. Autor dieses Themas

    g****e

    Momentan sind die Projekte Hobbyprojekte, in denen ich durchaus erlernen kann, wie ich an wirkliche eleganz und effizienz komme. Ob das ganze morgen, oder morgen in einem Jahr fertig ist, ist für mich persönlich eigentlich egal. Aber, wenn ich lerne von Anfang an "gut" zu Denken, dann muss der Code vllt im Nachhinein nicht noch stark optimiert werden. Wenn es bei einem Arbeitgeber um Geld geht, sind die Bedingungen leider anders, das stimmt... Das hat auch nichts mehr mit wirklichem hacken zu tun... Mal sehen, was die Zukunft bringt. Erstmal studium beenden^^

    Und stimmt eig, für eine Java Anwendung habe ich mich so auf die Art und Weise der Verarbeitung konzentriert, da habe ich garnicht über eine Architektur nachgedacht... Ich Schussel... Ich glaub, wenn ich mich demnächst oder so nochmal daran setze, werd ich erstmal eine Architektur ausarbeiten, und diese dann mit dem com.sun.net.HttpServer aufbauen. Damit wäre ich ohne Framework, und könnte eine komplette Architektur erproben, um es später dann mal gg Tomcat, Spring oder ähnliches "antreten" zu lassen. Bis dahin sollte ich aber schon eine Testumgebung aufsetzen :-D

    Ich werd mir das alles mal durch den Kopf gehen lassen, mal sehen. Danke :)

    Liebe Grüße
  10. Deine jeweiligen Interessengebiete haben zum Teil auch sehr unterschiedliche Aspekte. In der Java Welt, vor allem beim Einsatz in Unternehmen, sind Architektur, Komponentenabhängigkeiten, Code-Wiederverwendung, Deployment etc. von hoher Bedeutung. Es geht den jeweiligen Verwendern/Betreibern primär darum ein System zu haben das möglichst modular und gekapselt ist. Z.Bsp. damit Komponenten während der Laufzeit ausgetauscht bzw. neu eingespielt werden können. Außerdem soll es möglichst unabhängig vom Betriebssystem des Server sein. Auch die Java EE Architektur nimmt einem Anwendungsentwickler viel Arbeit und Detailwissen ab. Der will sich nicht mit Transaktionsproblemen und Laufzeitoptimierungen beschäftigen, sondern seine, unter Umständen auch schon komplexe, Business-Logik implementieren und anderen einfach zur Verfügung stellen. Es geht also eher darum zu abstrahieren und Systeme mit loser Kopplung zu bauen und zu wissen, das einem bestimmte Details einfach egal sind.

    Bei C und Assembler liegt der Fokus eher auf Effizienz und Leistungsorientierung. Wenn man nicht gerade mit ANSI-C programmiert muss man sich schon Gedanken machen für welche Plattform man später kompiliert - bei Java ist dir das vollkommen egal. Assembler ist noch mal ein ganzes Stück weiter unten, hier geht es wirklich um Detailprobleme auf der Low-Level Ebene.
    Ich behaupte jetzt mal das man Assembler-Kenntnisse wirklich nur für ganz spezielle Probleme braucht. Also wenn man Sicherheitslücken sucht oder reverse-engineering betreibt.

  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!