Zurück zum Blog

Die Stop Killing Games Kampagne vs. Live-Ops: Server Fallbacks richtig architektonieren

Veröffentlicht am 21. Februar 2026
Die Stop Killing Games Kampagne vs. Live-Ops: Server Fallbacks richtig architektonieren

Jeder Multiplayer-Entwickler kennt die harte Realität von Live-Ops: Irgendwann kosten die Server mehr, als das Spiel einbringt. Seit Jahrzehnten ist es Industriestandard, die AWS-Instanzen stillschweigend herunterzufahren, eine emotionale Dankesnachricht in den sozialen Medien zu posten und das Projekt zu beenden.

Doch die Spielregeln ändern sich rasant. Die stop killing games campaign hat kürzlich knapp 1,3 Millionen verifizierte Unterschriften gesammelt und damit EU-Politiker an den Verhandlungstisch gezwungen. Anstatt nach der Petition zu verstummen, legen die Organisatoren nach und gründen dedizierte NGOs in Europa und den USA, um permanente Verbraucherschutzgesetze bezüglich Server-Shutdowns durchzusetzen.

Für Indie- und AA-Entwickler ist dies ein massiver Weckruf. Wenn Gesetze verabschiedet werden, die vorschreiben, dass Online-only-Spiele auch nach ihrem kommerziellen Ende spielbar bleiben müssen, können Sie sich nicht mehr auf tief verstrickte, proprietäre Cloud-Architekturen verlassen. Sie müssen Ihr Spiel vom ersten Tag an für das eventuelle End-of-Life (EOL) architektonieren.

Hier ist eine technische Analyse dessen, was die Stop Killing Games-Kampagne für Ihre Infrastruktur bedeutet und wie Sie elegante Server Fallbacks bauen, die sowohl Ihr Erbe als auch die rechtliche Stellung Ihres Studios schützen.

Die technische Realität von "Einfach online lassen"

Für den durchschnittlichen Spieler scheint es so einfach zu sein, ein Spiel am Leben zu erhalten, wie einen Computer im Schrank laufen zu lassen. Für einen Backend-Engineer ist die Realität ein weit verzweigtes Netz von Abhängigkeiten.

Ein modernes Live-Service-Spiel läuft nicht auf einem einzelnen Executable. Es basiert auf einer komplexen Microservice-Architektur. Sie haben vielleicht Redis-Cluster für Echtzeit-Matchmaking, PostgreSQL-Datenbanken für Spieler-Inventare, Third-Party-Authentifizierungs-APIs (wie Steam oder Epic Online Services) und proprietäre Serverless-Funktionen zur Validierung von In-App-Käufen.

Ein standardmäßiges mittelgroßes Live-Service-Spiel kann leicht 4.000 bis 8.000 US-Dollar pro Monat an Infrastrukturkosten verschlingen, nur um den Betrieb für ein paar hundert gleichzeitige Spieler aufrechtzuerhalten.

Wenn ein Studio beschließt, ein Spiel einzustellen, kann es nicht einfach den Backend-Quellcode veröffentlichen. Dieser Code enthält oft proprietäre Anti-Cheat-Mechanismen, lizenzierte Third-Party-Middleware und sensible Infrastrukturkonfigurationen. Darüber hinaus ist die Übergabe eines Datenbank-Dumps ein massiver Verstoß gegen die DSGVO und andere Datenschutzgesetze, da er die Personally Identifiable Information (PII) jedes Spielers enthält, der sich jemals eingeloggt hat.

Die Notwendigkeit von Graceful Degradation

Die Lösung besteht nicht darin, die Server ewig laufen zu lassen, sondern eine Architektur zu bauen, die zu Graceful Degradation fähig ist. Ihr Game Client muss intelligent genug sein, um zu erkennen, wenn die Master-Server weg sind, und nahtlos auf einen Community-hosted oder Peer-to-Peer (P2P) Fallback umzuschalten.

Dies ändert grundlegend, wie wir Networking angehen. Wenn Sie Ihren Client so hardcoden, dass er abstürzt oder einfriert, wenn er ein HTTP 503 (Service Unavailable) von Ihrer Matchmaking-API erhält, bauen Sie eine tickende Zeitbombe.

Architektonieren der End-of-Life State Machine

Um einen kompletten Backend-Shutdown zu überstehen, benötigt Ihr Game Client eine EOL State Machine. Anstatt eine fehlgeschlagene Master-Server-Verbindung als fatalen Fehler zu behandeln, sollte der Client eine externe, hochverfügbare Konfigurationsdatei abfragen (z. B. eine statische JSON-Datei auf einem günstigen CDN oder GitHub Pages), um den globalen Status des Spiels zu ermitteln.

Wenn der Status als SUNSET markiert ist, umgeht der Client den Standard-Authentifizierungsflow und schaltet das UI für lokales Hosting frei.

Code-Beispiel: Implementierung eines Network Bootstrappers in Unity (C#)

Hier ist ein praktisches Beispiel, wie Sie einen EOL-fähigen Network Bootstrapper mit Unity und Standard-HTTP-Requests implementieren könnten. Dieses Skript versucht, die offizielle API zu erreichen, prüft auf einen spezifischen HTTP 410 (Gone) Statuscode und fällt auf einen lokalen IP-Transport zurück.

using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using UnityEngine;

public class NetworkBootstrapper : MonoBehaviour
{
    private static readonly HttpClient httpClient = new HttpClient();
    
    // The primary API endpoint for your live-ops
    private const string MasterServerURL = "https://api.yourgame.com/v1/health";
    
    // A highly durable fallback URL (e.g., a static GitHub Pages JSON file)
    private const string EOLConfigURL = "https://yourstudio.github.io/game-config/status.json";

    public enum GameNetworkState
    {
        Live,
        Offline,
        CommunityHosted
    }

    public GameNetworkState CurrentState { get; private set; }

    async void Start()
    {
        await DetermineNetworkStateAsync();
    }

    private async Task DetermineNetworkStateAsync()
    {
        try
        {
            // Attempt to ping the master server with a strict 3-second timeout
            httpClient.Timeout = TimeSpan.FromSeconds(3);
            HttpResponseMessage response = await httpClient.GetAsync(MasterServerURL);

            if (response.StatusCode == HttpStatusCode.Gone) // HTTP 410
            {
                Debug.LogWarning("Master server returned 410 Gone. Game is in EOL mode.");
                EnableCommunityFallback();
                return;
            }

            if (response.IsSuccessStatusCode)
            {
                Debug.Log("Connected to official master servers.");
                CurrentState = GameNetworkState.Live;
                InitializeOfficialTransport();
            }
        }
        catch (HttpRequestException)
        {
            // If the DNS is completely dead, check the durable EOL config
            await CheckDurableEOLConfig();
        }
    }

    private async Task CheckDurableEOLConfig()
    {
        try
        {
            HttpResponseMessage fallbackResponse = await httpClient.GetAsync(EOLConfigURL);
            if (fallbackResponse.IsSuccessStatusCode)
            {
                string json = await fallbackResponse.Content.ReadAsStringAsync();
                // Assume we parse JSON here and check a "status" field
                if (json.Contains("\"status\": \"sunset\""))
                {
                    EnableCommunityFallback();
                    return;
                }
            }
        }
        catch (Exception ex)
        {
            Debug.LogError($"Failed to reach both master and fallback servers: {ex.Message}");
            CurrentState = GameNetworkState.Offline;
        }
    }

    private void EnableCommunityFallback()
    {
        CurrentState = GameNetworkState.CommunityHosted;
        // Swap your network transport layer here (e.g., Netcode for GameObjects)
        // Transport.SetProvider(new DirectIPTransport());
        Debug.Log("Community Hosted Mode Unlocked. Direct IP connect enabled.");
    }

    private void InitializeOfficialTransport()
    {
        // Initialize standard matchmaking and relay services
    }
}

Diese einfache architektonische Entscheidung – die Prüfung auf einen HTTP 410 Code und das elegante Failover auf einen direkten IP-Transport – ist der Unterschied zwischen einem Spiel, das ewig lebt, und einem Spiel, das in dem Moment kaputt geht, in dem Ihre DNS-Registrierung abläuft.

Das Problem der Datenportabilität: Speichern der Player Progression

Spieler zu einem Community-Server zu leiten, ist nur die halbe Miete. Was passiert mit ihren hunderten Stunden an Progression?

In einem standardmäßigen autoritativen Backend vertraut der Client niemals dem lokalen Save File für die Multiplayer-Progression. Wenn ein Spieler Level 50 erreicht, liegen diese Daten sicher in Ihrer Cloud-Datenbank. Wenn Sie die Server abschalten, verschwinden diese Daten.

Um dies zu lösen, müssen Entwickler einen "Sunset Export"-Mechanismus bauen. Monate vor dem endgültigen Shutdown veröffentlichen Sie ein Client-Update, das es Spielern ermöglicht, einen kryptografischen Export ihres Profils anzufordern. Der Server paketiert ihre Progressionsdaten, signiert sie mit einem Private Key und sendet sie an den Client, um sie lokal zu speichern.

Wenn Sie Leveling Up Your Games Persistence Beyond Simple Save Files lesen, müssen Sie bedenken, wie diese Persistenz einen Cloud-Ausfall überlebt. Ein Community-Server kann die kryptografische Signatur der exportierten Datei verifizieren, um sicherzustellen, dass der Spieler seine Stats nicht manuell auf Level 999 editiert hat, bevor er beitritt.

Code-Beispiel: Exportieren signierter Profile in Godot (GDScript)

Hier sehen Sie, wie Sie den clientseitigen Empfang und die Speicherung eines exportierten, kryptografisch signierten Spielerprofils in Godot 4 handhaben könnten.

extends Node

const EXPORT_API_URL = "https://api.yourgame.com/v1/profile/export"
var http_request : HTTPRequest

func _ready():
    http_request = HTTPRequest.new()
    add_child(http_request)
    http_request.request_completed.connect(_on_export_completed)

# Called when the player clicks "Export Profile for Community Servers"
func request_profile_export(auth_token: String):
    var headers = ["Authorization: Bearer " + auth_token]
    var error = http_request.request(EXPORT_API_URL, headers, HTTPClient.METHOD_GET)
    
    if error != OK:
        push_error("An error occurred while requesting profile export.")

func _on_export_completed(result, response_code, headers, body):
    if response_code == 200:
        var json = JSON.new()
        var parse_result = json.parse(body.get_string_from_utf8())
        
        if parse_result == OK:
            var payload = json.get_data()
            # Payload should contain {"data": {...}, "signature": "hex_string"}
            save_signed_profile_to_disk(payload)
            print("Profile successfully exported for EOL use.")
    else:
        push_error("Failed to export profile. HTTP Code: " + str(response_code))

func save_signed_profile_to_disk(payload: Dictionary):
    var file = FileAccess.open("user://community_profile.sav", FileAccess.WRITE)
    if file:
        # Store the raw JSON string so the signature remains valid
        file.store_string(JSON.stringify(payload))
        file.close()

Durch die Implementierung dieses Endpunkts ermöglichen Sie es den Spielern, die Hoheit über ihre Daten zu übernehmen, ohne Ihre gesamte Backend-Datenbank offenzulegen oder gegen Datenschutzgesetze zu verstoßen.

Entkopplung der Core Logic von der Cloud-Infrastruktur

Der größte Fehler, den Entwickler machen, ist die enge Kopplung der Core Logic ihres Spiels an eine proprietäre Cloud-Infrastruktur. Wenn Ihr Spiel auf eine AWS Lambda-Funktion angewiesen ist, um Waffenschaden zu berechnen, oder einen proprietären Matchmaking-Algorithmus nutzt, der fest in Ihren Hosting-Provider integriert ist, wird das Extrahieren dieser Logik für einen lokal gehosteten Community-Server ein komplettes Rewrite des Spiels erfordern.

Genau darum geht es in Beyond The Pixels Why Your Games Backend Is The Secret To Long Term Success — eine entkoppelte Architektur gibt Ihnen Optionen. Ihr Game Client sollte über standardisierte REST APIs oder WebSockets kommunizieren, völlig agnostisch gegenüber dem Ort, an dem diese Endpunkte tatsächlich gehostet werden.

Wenn Sie Ihren Dedicated Server als Headless Linux Build erstellen und ihn mit Docker containerisieren, stellen Sie sicher, dass exakt dieselbe Serverumgebung, die auf Ihrem teuren Cloud-Cluster läuft, später als einfaches Docker-Image an Ihre Spieler verteilt werden kann.

5 Best Practices für EOL-Ready Architektur

Um sicherzustellen, dass Ihr Spiel dem Ethos der Stop Killing Games-Kampagne (und potenziellen zukünftigen Gesetzen) entspricht, implementieren Sie diese Praktiken von Beginn der Entwicklung an:

  1. Umgebungsvariablen für alle Endpunkte verwenden: Hardcoden Sie niemals API-URLs direkt in Ihren kompilierten Client. Rufen Sie diese aus einer Konfigurationsdatei oder einem dauerhaften DNS-Eintrag ab, der später leicht auf Community-Server umgeleitet werden kann.
  2. Dedicated Server containerisieren: Erstellen Sie Ihre Serverlogik als Headless Executable und verpacken Sie diese frühzeitig in einen Docker-Container. Dies macht es trivial, eine "Community Server Edition" zu verteilen, wenn die Live-Ops enden.
  3. Offline-First State Machine implementieren: Entwerfen Sie Ihr Hauptmenü so, dass es HTTP 410 (Gone) oder HTTP 503 (Service Unavailable) Fehler elegant verarbeitet. Anstatt eine fatale Exception auszulösen, schalten Sie ein "Local Network" oder "Direct IP" Menü frei.
  4. PII von Game State trennen: Stellen Sie sicher, dass Ihr Datenbank-Schema sensible Daten (E-Mails, Klarnamen, Abrechnungsdaten) von Game State-Daten (Inventar, Level, Stats) trennt. Dies macht es rechtlich zulässig, Game State-Daten an Spieler zu exportieren.
  5. Abstraktion von Third-Party-Abhängigkeiten: Wenn Ihr Spiel auf einen spezifischen Dienst für Voice-over-IP oder Anti-Cheat angewiesen ist, kapseln Sie diese SDKs in einem Interface. Wenn das Spiel in den EOL-Modus wechselt, kann das Interface zu einem Null-Provider wechseln, was verhindert, dass das Spiel abstürzt, wenn der externe Dienst nicht erreichbar ist.

Die Rolle von Backend-as-a-Service (BaaS)

Eine abstrahierte, EOL-fähige Infrastruktur komplett von Grund auf neu aufzubauen, ist ein gewaltiges Unterfangen. Das Einrichten von Load Balancern, Database Sharding, Container-Orchestrierung und der Bau von Graceful Degradation Fallbacks kann leicht 4-6 Wochen dedizierte Engineering-Zeit in Anspruch nehmen, bevor Sie überhaupt den ersten Game Loop schreiben.

Hier ändert eine moderne Backend-as-a-Service-Plattform die Gleichung. Mit horizOn werden diese Backend-Dienste vorkonfiguriert mit sauberen API-Grenzen geliefert. Da horizOn das Heavy Lifting des Infrastruktur-Managements abstrahiert, sind Sie nicht gezwungen, tief verstrickten, proprietären Cloud-Code zu schreiben.

Sie können Ihr Spiel mit standardisierten Endpunkten bauen, Ihren Titel schneller veröffentlichen und beruhigt sein, da Ihre Architektur entkoppelt genug ist, um auf einen Community-hosted Fallback zu verweisen, falls Sie die offiziellen Server jemals einstellen müssen. Sie investieren Ihr Budget in den Bau des Spiels, nicht in den Kampf gegen die Infrastruktur.

Die Zukunft der Spielkonservierung annehmen

Die Stop Killing Games-Kampagne ist kein Feind der Spieleentwickler; sie ist ein notwendiger Anstoß für besseres, nachhaltigeres Software-Engineering. Die Ära, in der Spiele als wegwerfbare, temporäre Dienste behandelt werden, geht zu Ende – sei es durch die Nachfrage der Verbraucher oder durch kommende EU-Gesetzgebung.

Indem Sie Ihr Spiel vom ersten Tag an für das End-of-Life architektonieren, schützen Sie Ihr Studio vor PR-Desastern, mindern potenzielle rechtliche Risiken und stellen sicher, dass die Kunst, in die Sie Ihre Seele stecken, über Jahrzehnte hinweg spielbar bleibt.

Bereit, Ihr Multiplayer-Backend zu skalieren, ohne sich an eine starre, proprietäre Infrastruktur zu binden? Testen Sie horizOn kostenlos und bauen Sie noch heute resiliente, zukunftssichere Live-Ops.


Quelle: Stop Killing Games campaign hope to "signal that we're not just going away" by setting up online game preservation NGOs