beschäftige mich grad mit dem Loadbalancing von Spring Boot und hab da ein wenig rumgespielt, nun kommen ein paar Fragen. Vielleicht hat jemand Ahnung von der Materie ich werd aus den englisch/indischen Tutorials nicht schlau.
Im Einsatz hab ich Zuul ApiGateway, Eureka als Nameserver und meinen Service.
Meinen Service hab ich auf einem Server 2x laufen, sagen wir als Service1 und Service2 unter verschiedenen Ports, die registrieren sich auch bei Eureka alles super. Wenn ich jetzt meinen Service mit Anfragen bombardiere, wird die ganze Zeit nur in das logfile von Serivce1 gelogged, der Service 2 auf dem anderen Port hat nix zu tun.
Ist das so gewollt, springt Service 2 nur ein wenn der 1 offline ist? Oder wie wird die Last verteilt?
Ich habe einen kritischen Service den ich sehr selten neustarten kann um ihn zu aktualisieren. Nun wollte ich diesen service auch 2 mal aufsetzen. Wenn ich ihn updaten will, würde ich das jar file deployen auf service2, hochfahren.
Den Service1 würde ich dann herunterfahren, während dessen übernimmt service 2.
Aber wie kann ich dem Service 1 mitteilen "keine Anfragen mehr annehmen, aber was er noch macht soll er fertig machen"
Also die Frage ist, was Du genau gemacht hast und was Du derzeit ansprichst.
Wie du mit Zuul und Eureka ein LoadBalancing aufbauen kannst, zeigt baeldung z.B. unter https://www.baeldung.com/zuul-load-balancing.
(Round Robin ist da der Standard so wie ich den Artikel verstehe!)
Wenn Du einen Service stoppst, dann sollte er sich direkt beim load balancer abmelden, so dass der direkt keine Requests mehr bekommt. Im Rahmen eines Absturzes oder so, erfolgt das nicht und dann gehen da noch eine gewisse Zeit Requests ins "Leere", bis da halt erkannt wird, dass der Service nicht mehr lebt. (Da kenne ich die genauen Details von Zuul und Eureka aber nicht). Da ich mit Zuul / Eureka als Load Balancer keine Erfahrungen habe, müsstest Du das einfach einmal austesten....
So wie ich das aktuelle Verhalten verstehe scheinst Du derzeit lediglich Eureka zu nutzen, um ein Discovery des Services zu haben. Das könnte für Dein Szenario aber auch schon ausreichen, so Du nur den Wartungsfall abdecken willst. Dann würdest Du einen zweiten Service melden um dann den ersten herunter zu fahren ...
Das einfach einmal aus meiner Sicht, wobei ich wie gesagt mit diesen LoadBalancern keine Erfahrung habe. Bezüglich LoadBalancer habe ich bisher nur auf F5 Basis Erfahrungen gesammelt ...
Wie/Wo deployest du? Das Rolling update wird ja z.B. von Kubernetes gemanaged. Sonst kann ich mich @JustNobody nur anschliessen. Normalerweise sollte die Last verteilt werden, da stimmt bei dir wohl etwas nicht.
Danke schon mal für Deine Einschätzung! Das klingt erstmal gut mit dem Wartungsmodus sollte das eigentlich klappen. Ich werde es mal testen.
Was mir aber noch bisschen aufstößt; Sagen wir ich habe einen Service, der irgendwas logisches macht. Derbekommt Requests mit Daten aus einem Gerät und berechnet irgendwelche Sachen mit den Daten. Das dauert aber unter Umständen sehr lange. Nun ist da ein Bug in der Berechnung - gibt es eine Möglichkeit per Hotswapping oder irgendsowas in den laufenden Service zu grätschen und zu updaten ohne was anzuhalten ? Ne oder
Was mir aber noch bisschen aufstößt; Sagen wir ich habe einen Service, der irgendwas logisches macht. Derbekommt Requests mit Daten aus einem Gerät und berechnet irgendwelche Sachen mit den Daten. Das dauert aber unter Umständen sehr lange. Nun ist da ein Bug in der Berechnung - gibt es eine Möglichkeit per Hotswapping oder irgendsowas in den laufenden Service zu grätschen und zu updaten ohne was anzuhalten ? Ne oder
Nein, da ist das Problem aber weniger auf technischer Seite, sondern mehr auf logischer und semantischer.
Was soll denn passieren, wenn die Berechnung grad mit der Hälfte fertig ist, dann die Berechnung selbst geändert wird?
Alle bereits berechneten Ergebnisse sind ungültig und die Berechnung muss von vorne starte?
Alles bereist berechnete bleibt gültig, nur der Rest wird nach der neuen "Rechenart" berechnet?
Die Berechnung wird einfach fortgeführt, erst alle nach dem Update gestarteten Berechnungen werden mit der neuen "Rechenart" durchgeführt?
Mal als ganz plumpes Beispiel: Bild soll von farbig nach Graustufen konvertiert werden. Bild ist riesig groß (alternativ: jeweils N Bilder als Batch), deshalb dauert's lange. Entwickler hat dummerweise schwarz und weiß vertauscht:
Das Bild wird neu von vorn konvertiert, ist danach passend vorliegen (oder bei Batch: alle bereist konvertierten werden verworfen, alle sind danach korrekt konvertiert)
Die Hälfte des Bildes ist mit umgekehrten Farben, die andere passend, Bild ist also kaputt. (oder bei Batch: Hälfte sieht aus wie gewünscht, andere Hälfte sieht scheiße aus)
Das ganze Bild ist falsch, erst alle danach sind richtig.
Variante 1 & 3 lassen sich lösen, ohne das man diesen einen Service dafür im laufenden Betrieb updaten muss. Variante 2 nicht, das wäre aber ich in den meisten Fällen dämlich.