

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 der Spielfunktionen, um Fehler zu beheben, die sich nur minimal auf das Spielerlebnis auswirken
<a name="gamerel03-bp02"></a>

 Das Entkoppeln von Komponenten bezieht sich auf das Konzept, Serverkomponenten so zu gestalten, dass sie so unabhängig wie möglich arbeiten können. Einige Aspekte des Spielens lassen sich nur schwer voneinander trennen, 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. Beispielsweise sind Bestenlisten und Statistikdienste für das Spielerlebnis nicht entscheidend, und die Lese- und Schreibvorgänge an diese Dienste können asynchron vom Spiel aus ausgeführt werden. 

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

## Implementierungsleitfaden
<a name="implementation-guidance-42"></a>

 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 Fehler problemlos beheben 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 von entscheidender Bedeutung sind. Wenn nicht, konfiguriere den Spielclient so, dass er diesen Fehler problemlos handhabt, ohne das Spielerlebnis für den Spieler zu stören. Du kannst optional versuchen, diese Daten später erneut abzurufen, wenn der Spieler den Bildschirm erneut besucht. 

 Nutze Logik wie Timeouts, Wiederholungen und Backoffs, um Fehler und Ausfälle zu behandeln. Timeouts verhindern, dass Systeme für unangemessen lange Zeiträume hängen bleiben. Wiederholungsversuche 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 eine lose Kopplung sind Systeme widerstandsfähiger, da der Ausfall einer Komponente nicht auf andere übergreift. Wenn für Spielfunktionen keine statusbehafteten Verbindungen zu deinen Spielservern oder deinem Backend erforderlich sind, solltest du zustandslose 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 gekoppelt werden können. HTTP/JSON Implementieren Sie Netzwerkaufrufe vom Spielclient so, dass sie asynchron und nicht blockierend sind, um die Auswirkungen auf die Spieler durch langsame Spielfunktionen oder andere abhängige Dienste zu minimieren. 

 Um die Stabilität durch lose Kopplung weiter zu verbessern, verwenden Sie einen Nachrichtendienst wie Warteschlangen, Streaming oder ein themenbasiertes System zwischen Komponenten, das asynchron verarbeitet werden kann. 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 umfasst eine Komponente, die Ereignisse generiert, und eine andere, die sie verarbeitet. Die beiden Komponenten werden nicht durch direkte Punkt-zu-Punkt-Interaktion integriert, sondern durch eine Zwischenschicht, wie z. B. 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. 

 Recherchieren 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 Spielanwendungsfall vor, bei dem Ihr Spiel die Spielzeit, Statistiken oder andere relevante Daten der Spieler verfolgen muss, was in Zeiten hoher Spieleranzahl zu einem Anwendungsfall mit hohem Schreibdurchsatz führen kann. 

 Um eine zuverlässige Architektur zu implementieren, sollten Sie sich überlegen, ob für den Anwendungsfall ein konsistentes Lesen nach dem Schreiben durch den Spieler erforderlich ist. In der Regel eignen sich solche Szenarien für die asynchrone Verarbeitung und können durch die Implementierung eines Write-Queueing-Musters erreicht werden, bei dem die Anfragen in eine skalierbare und stabile Nachrichtenwarteschlange wie Amazon SQS aufgenommen werden 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 höchsten Schreibdurchsatz zu erreichen, da die Verbraucherverarbeitung aus der Schreibwarteschlange verwendet werden kann, um diese Aufnahmerate nach Bedarf zu verlangsamen. 

### Implementierungsschritte
<a name="implementation-steps-41"></a>
+  Entkoppeln Sie unkritische Komponenten wie Bestenlisten und Statistikdienste von wichtigen Gameplay-Funktionen, um asynchrone Abläufe zu ermöglichen und die Stabilität zu verbessern. 
+  Implementieren Sie eine sanfte Degradation für unkritische Funktionen mit Logik für Timeouts, Wiederholungen und Backoffs und stellen Sie sicher, dass der Spielclient Ausfälle bewältigt, 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
<a name="resources-8"></a>
+  [Erstellen Sie mithilfe der Microservice-Architektur hoch skalierbare und zuverlässige Workloads ](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/design-your-workload-service-architecture.html) 
+  [Integration von Microservices mithilfe serverloser Dienste AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/modernization-integrating-microservices/welcome.html) 
+  [Grundlegendes zu asynchronem Messaging für Microservices ](https://aws.amazon.com/blogs/compute/understanding-asynchronous-messaging-for-microservices/) 
+  [Einführung in skalierbare Spielentwicklungsmuster auf AWS](https://d1.awsstatic.com/whitepapers/aws-scalable-gaming-patterns.pdf) 
+  Implementierung von [ Graceful Degradation ](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_mitigate_interaction_failure_graceful_degradation.html#:~:text=Implementing%20graceful%20degradation%20helps%20minimize%20the%20impact%20of,means%20considering%20potential%20failure%20modes%20during%20dependency%20design.) 