# Load Balancing



## bob_sheknowdas (14. Jan 2017)

Hi

ich bin auf der Suche nach einem Java-Framework, dass die Programmierung eines Load Balancers erleichtert.
Kennt da jemand eines?

Der Anwendungsfall ist folgender.
Für ein Uni-Projekt schreibe ich gerade eine Client-Server-Anwendung.
Dabei soll das Server-Programm später mal auf mehreren VMs gleichzeitig gestartet werden.
Der Client besteht derzeit aus einem mittels JdkHttpServerFactory.createHttpServer() erzeugten BackEnd, auf dem ein Webfrontend (diverse html- und js-files) gehostet wird.
Im BackEnd des Clients soll jetzt ein Load Balancer integriert werden, welcher die mehreren VMs des Servers berücksichtigt.

Ich habe mir schon diverse Lösungsmöglichkeiten angeschaut.
Die meißten (z.B. nginx, apache camel, etc...) laufen aber nur als Servlet und benötigen einen Webservice (z.B. einen Tomcat). Das ist aber aus diversen Gründen für mich keine Option...
Apache Camel z.B. würde auch als Java-Standalone-Application funktionieren. Allerdings läuft es als eigenständiger Server und lässt kein Hosten des Front Ends mehr zu.
Wenn ich die Anwendung in 3 Teile zerlege (also den Client unter Port A, dann separat den Load Balancer unter Port B und dann nochmal die Server unter Port C..N), dann bekomme ich Probleme ala "Quellübergreifende (Cross-Origin) Anfrage blockiert" (Will heißen, das WebFrontEnd und der Load Balancer müssen auf dem selben Server laufen)

Schon mal vielen Dank für Anregungen aller Art.


----------



## JCODA (14. Jan 2017)

Leider kenne ich mich damit überhaupt nicht aus, aber vielleicht bringt es dir ja was: Hast du dir bereits Hazelcast angeschaut? https://hazelcast.org/


----------



## Tobse (14. Jan 2017)

Einen Load-Balancer mit Java zu schreiben ist IMHO keine gute Idee. Ein Load-Balancer enthält nicht viel Logik und muss aber viel Datendurchsatz schaffen.

Es wäre wohl am Einfachsten, wenn du einen Nginx oder einen Apache entsprechend konfigurierst. Selbst programmieren musst du dafür eigentlich nichts.


----------



## JuKu (15. Jan 2017)

Jeder Load Balancer ist anders.
Was du benötigst, ist ein HTTP Load Balancer - den musst du nicht selber schreiben, dafür gibt es fertige Software, z.B. *HaProxy*.
HaProxy schafft bei einem einfachen (4 Core) Linux Server angeblich locker 16.000 Connections / Sekunde, wobei ich dir dabei keine Garantie geben kann. Angeblich soll es der schnellste Proxy Server für Linux sein, nginx kommt da nicht mal annäherungsweise ran.
Wichtig ist, dass du Sticky Session verwendest, also der Proxy einen Cookie setzt, sodass die Anfragen vom selben Client immer an den selben Server (wenn er verfügbar ist) gehen - sonst wirst du ständig ausgeloggt (es sei denn, du hast auch Distributed Sessions z.B. mit Hazelcast implementiert).

Anmerkung zu deinem Problem oben:
Nur der Proxy Server (= Frontend Server) darf auf Port 80 / 433 laufen! Deine Backend Server müssen natürlich unter einem anderem Port erreichbar sein, falls sie auf dem selben Server liegen.

Selbst schreiben musst du dir den Load Balancer nur, wenn er zusätzliche Features braucht. Dann ist *Hazelcast* als *In-Memory-Data Grid*, also als eine Art Cache für z.B. die aktuellen Load Werte, die richtige Wahl. Hazelcast soll angeblich derzeit die schnellste Datenbank auf dem Markt sein, speichert die Daten per Default aber nur im RAM (eine Anbindung an eine persistente Datenbank ist ebenfalls möglich, macht bei dir aber keinen Sinn).
Oder *vertx.io* (nutzt ebenfalls Hazelcast zum Scaling) könnte ebenfalls für dich interessant sein, falls du den Proxy Server ernsthaft selber schreiben willst.


----------

