View a markdown version of this page

GAMEREL03-BP02 Implementieren Sie eine lose Kopplung von Spielfunktionen, um Fehler mit minimaler Beeinträchtigung des Spielerlebnisses zu beheben - Linse für die Spieleindustrie

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

GAMEREL03-BP02 Implementieren Sie eine lose Kopplung von Spielfunktionen, um Fehler mit minimaler Beeinträchtigung des Spielerlebnisses zu beheben

Das Entkoppeln von Komponenten bezieht sich auf das Konzept, Serverkomponenten so zu entwerfen, dass sie so unabhängig wie möglich arbeiten können. Einige Aspekte des Spielens lassen sich nur schwer entkoppeln, da die Daten so aktuell wie möglich sein müssen, um den Spielern ein gutes Spielerlebnis zu bieten. Viele Komponenten und Spielaufgaben können jedoch entkoppelt werden. Zum Beispiel sind Bestenlisten und Statistikdienste für das Spielerlebnis nicht entscheidend, und die Lese- und Schreibvorgänge in diesen Diensten können asynchron vom Spiel aus ausgeführt werden.

Risikostufe, wenn diese bewährte Methode nicht eingeführt wird: Hoch

Implementierungsleitfaden

Implementieren Sie eine schrittweise Degradation für Funktionen in Ihrem Spiel, die automatisch oder von einem Administrator deaktiviert werden können, wenn Probleme erkannt werden, und konfigurieren Sie Upstream-Dienste, die von der Funktion abhängen, um den Ausfall ordnungsgemäß behandeln zu können. Wenn beispielsweise bestimmte Spielerdaten in deinem Spielclient nicht richtig geladen werden, solltest du dir überlegen, ob diese Daten für das Spielerlebnis entscheidend sind. Falls nicht, konfiguriere den Spielclient so, dass er diesen Fehler behutsam behandelt, ohne das Spielerlebnis zu beeinträchtigen, und wähle, diese Daten später erneut abzurufen, wenn der Spieler den Bildschirm erneut aufruft.

Nutze Logik wie Timeouts, Wiederholungen und Backoff, um Fehler und Ausfälle zu behandeln. Timeouts verhindern, dass Systeme für unangemessen lange Zeiträume hängen bleiben. Wiederholungen können für eine hohe Verfügbarkeit vorübergehender und zufälliger Fehler sorgen.

Definieren Sie unkritische Komponenten, die lose an kritische Komponenten gekoppelt werden können. Durch die lose Kopplung können Systeme widerstandsfähiger sein, da sich der Ausfall einer Komponente nicht auf andere überträgt. Wenn für Spielfunktionen keine statusbehafteten Verbindungen zu Ihren Spieleservern oder Ihrem Backend erforderlich sind, sollten Sie statusfreie Protokolle implementieren, um dynamisch zu skalieren und vorübergehende Ausfälle zu beheben. Entwickeln Sie Ihre unkritischen Komponenten so, dass sie mithilfe einer API lose mit zustandslosen Protokollen verknüpft werden können. HTTP/JSON Implementieren Sie Netzwerkaufrufe vom Spielclient so, dass sie asynchron und nicht blockierend erfolgen, um die Auswirkungen langsamer Spielfunktionen oder anderer abhängiger Dienste auf die Spieler zu minimieren.

Um die Ausfallsicherheit durch lose Kopplung weiter zu verbessern, verwenden Sie einen Messaging-Dienst wie Warteschlangen, Streaming oder ein themenbasiertes System zwischen Komponenten, die asynchron verarbeitet werden können. Dieses Modell eignet sich für Interaktionen, die keine sofortige Antwort erfordern oder bei denen eine Bestätigung, dass eine Anfrage registriert wurde, ausreichend ist. Diese Lösung beinhaltet eine Komponente, die Ereignisse generiert, und eine andere, die sie verarbeitet. Die beiden Komponenten werden nicht durch direkte point-to-point Interaktion integriert, sondern über ein Zwischenprodukt wie eine dauerhafte Speicher- oder Warteschlangenschicht. Dies trägt auch dazu bei, die Zuverlässigkeit des Systems zu verbessern, indem Nachrichten gespeichert werden, wenn die Verarbeitung fehlschlägt.

Suchen Sie nach einem geeigneten Nachrichtenmechanismus und wählen Sie ihn aus, da verschiedene Nachrichtendienste unterschiedliche Merkmale aufweisen, z. B. Bestell- und Zustellungsmechanismen. Entwerfen Sie Operationen so, dass sie idempotent sind, sodass das gewählte Nachrichtensystem Nachrichten mindestens einmal zustellt. Stellen Sie sich als Beispiel einen typischen Anwendungsfall für Spiele vor, bei dem Ihr Spiel die Spielzeit, Statistiken oder andere relevante Daten von Spielern verfolgen muss, was zu einem Anwendungsfall mit hohem Schreibdurchsatz in Zeiten hoher Parallelität der Spieler führen kann.

Um eine zuverlässige Architektur zu implementieren, sollten Sie sich überlegen, ob für den Anwendungsfall eine vom Spieler wahrgenommene read-after-write Konsistenz erforderlich ist. In der Regel eignen sich solche Szenarien für die asynchrone Verarbeitung und können durch die Implementierung eines Schreibwarteschlangenmusters erreicht werden, bei dem die Anfragen in eine skalierbare und dauerhafte Nachrichtenwarteschlange wie Amazon SQS aufgenommen und mithilfe eines Verbraucherdienstes, z. B. einer Lambda-Funktion, stapelweise in Ihre Backend-Datenbank eingefügt werden können. Dieser Ansatz ist zuverlässiger als die synchrone Kommunikation zwischen mehreren verteilten Komponenten, einschließlich dem Spielclient des Spielers, Ihren Backend-Web- und Anwendungsservern und Ihrem internen Datenbanksystem. Es reduziert auch die Kosten, da die Backend-Datenbank nicht skaliert werden muss, um den maximalen Schreibdurchsatz zu bewältigen, da die Benutzerverarbeitung aus der Schreibwarteschlange genutzt werden kann, um diese Aufnahmerate nach Bedarf zu verlangsamen.

Implementierungsschritte

  • Entkoppeln Sie unkritische Komponenten wie Bestenlisten und Statistikdienste von wichtigen Spielfunktionen, um asynchrone Abläufe zu ermöglichen und die Stabilität zu erhöhen.

  • Implementieren Sie eine ordentliche Degradation für unkritische Funktionen mit Logik für Timeouts, Wiederholungen und Backoff und stellen Sie sicher, dass der Spielclient Ausfälle verarbeitet, ohne das Spielerlebnis zu beeinträchtigen.

  • Verwenden Sie Messaging-Systeme wie Amazon SQS für die asynchrone Kommunikation zwischen Komponenten und ermöglichen Sie so eine skalierbare, dauerhafte und zuverlässige Verarbeitung von Anwendungsfällen mit hohem Durchsatz.

Ressourcen