Eine Web-App ist ja schön und gut, aber solange sie nur auf unserem lokalen Computer ausgeführt wird, nur beschränkt nützlich. Wir möchten die App auf einem Server im Netz laufen lassen und für alle Nutzenden zugänglich machen.
Ziele:
Falls uns das gelingt, könnten wir darüber nachdenken, ob wir unser Spiel monetarisieren können - also Geld dafür verlangen oder Werbung schalten und stinkreich werden :).
Die Computer, die wir für die Entwicklung verwenden, sind typischerweise nicht frei im Internet erreichbar, da eine Firewall den Zugang von aussen unterbindet. Zudem sind die Geräte oft ausgeschaltet. Und wir möchten auch nicht, dass eine allfällige Sicherheitslücke in unserem Servercode dazu führen könnte, dass unser Gerät kompromittiert wird.
Der Code soll also in einer sogenannten Sandbox (ein Sandkasten, in dem der Code spielen kann, ohne dass etwas Schlimmes passiert) ausgeführt werden. Dieses Hosting wird von vielen Anbietern als Dienstleistung ermöglicht und ist typischerweise kostenpflichtig.
Möglichkeiten:
Wir werden die zweite Möglichkeit näher anschauen.
render.com kann unser (public) Repository direkt laufen lassen. Schritte:
npm install um alle Abhängigkeiten in node_modules zu installieren)node app.js bzw. node index.js)
Wenn alles klappt, wird das Projekt geklont, installiert, und ist nach ca. 1 Minute auf einem URL wie dem folgenden Verfügbar:
Ein Server-Prozess kann nur eine begrenzte Anzahl Spiele ausführen. Für mehr parallele Spiele könnten wir einfach mehrere Prozesse (Instanzen) starten - alle sind unter der gleichen Adresse erreichbar, aber werden im Data Center über verschiedene Mechanismen auf die Instanzen zugeteilt (Load Balancing):
ksr-talit-connect4.onrender.com wird auf mehr als eine IP-Adresse aufgelöst - der Browser wählt zufällig eine davon aus.Mit mehreren Instanzen kann es vorkommen, dass zwei Client-Anfragen an verschiedene Backends gelangen. Da in unserer App aber der ganze Zustand im Speicher der Server-Instanz liegt, fehlt den Backends die gemeinsame Sicht auf das Spiel. Wir müssten also sicherstellen dass alle Anfragen eines Spiels beim gleichen Backend landen. Dies nennt sich Affinität (affinity).
Beim DNS Load Balancing ist das schwierig zu erreichen, weil der Client zufällig die IP-Adresse auswählt. Beim Server Load Balancing hingegen muss das Frontend sich merken, welche Spiele auf welchen Backends laufen, und die Anfragen entsprechend weiterleiten.
Eine einfach Implementierung würden nur den Redirect vom leeren Pfad / auf ein wartendes Spiel (z.B. /0/) so weiterleiten, dass der Client auf einem konkreten Backend landet, z.B. 0.ksr-talit-connect4.onrender.com bis 67.ksr-talit-connect4.onrender.com.
Möchten wir die Spielstände, Highscores etc. langfristig speichern, so dass sie einen Server-Neustart überstehen, müssen alle Server einen gemeinsamen Speicher haben. Mögliche Lösungen wären separate Speichersysteme: