

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# GAMEREL03-BP02 Implementa una combinazione libera delle funzionalità di gioco per gestire i guasti con un impatto minimo sull'esperienza del giocatore
<a name="gamerel03-bp02"></a>

 Il disaccoppiamento dei componenti si riferisce al concetto di progettazione dei componenti del server in modo che possano funzionare nel modo più indipendente possibile. Alcuni aspetti del gioco sono difficili da disaccoppiare poiché i dati devono essere il più aggiornati possibile per offrire una buona esperienza di gioco ai giocatori. Tuttavia, molti componenti e attività di gioco possono essere disaccoppiati. Ad esempio, le classifiche e i servizi di statistiche non sono fondamentali per l'esperienza di gioco e le letture e le scritture su questi servizi possono essere eseguite in modo asincrono dal gioco. 

 **Livello di rischio associato se questa best practice non fosse adottata:** elevato 

## Guida all’implementazione
<a name="implementation-guidance-42"></a>

 Implementa una graduale degradazione delle funzionalità del gioco che possono essere disattivate automaticamente o da un amministratore se vengono rilevati problemi, e configura i servizi upstream che dipendono dalla funzionalità per essere in grado di gestire correttamente l'errore. Ad esempio, se i dati di alcuni giocatori non vengono caricati correttamente nel tuo client di gioco, dovresti valutare se questi dati sono fondamentali per l'esperienza di gioco. In caso contrario, configura il client di gioco in modo da gestire correttamente questo errore senza interrompere l'esperienza del giocatore, scegliendo di riprovare a recuperare questi dati in un secondo momento, quando il giocatore torna a visualizzare lo schermo. 

 Usa logiche come timeout, tentativi e backoff per gestire errori e fallimenti. I timeout impediscono ai sistemi di bloccarsi per periodi irragionevolmente lunghi. I tentativi possono fornire un'elevata disponibilità di errori transitori e casuali. 

 Definisci componenti non critici che possono essere accoppiati liberamente ai componenti critici. L'accoppiamento lento consente ai sistemi di essere più resilienti poiché il guasto di un componente non si ripercuote sugli altri. Quando le funzionalità di gioco non richiedono connessioni stateful ai server di gioco o al backend, dovresti implementare protocolli stateless per scalare dinamicamente e ripristinare il sistema in caso di guasti transitori. Sviluppa i tuoi componenti non critici laddove possano essere liberamente associati a protocolli stateless utilizzando un'API. HTTP/JSON Implementa le chiamate di rete dal client di gioco in modo che siano asincrone e non bloccanti per ridurre al minimo l'impatto sui giocatori delle funzionalità di gioco a prestazioni lente o di altri servizi dipendenti. 

 Per migliorare ulteriormente la resilienza tramite il loose coupling, utilizza un servizio di messaggistica, ad esempio un sistema di accodamento, streaming o un sistema basato su argomenti tra i componenti che può essere gestito in modo asincrono. Questo modello è adatto per un'interazione che non richiede una risposta immediata o in cui è sufficiente la conferma della registrazione di una richiesta. Questa soluzione prevede un componente che genera eventi e un altro che li consuma. I due componenti non si integreranno tramite un'interazione diretta punto a punto, ma attraverso un livello intermedio, ad esempio uno storage durevole o uno strato di coda. Questo aiuta anche a migliorare l'affidabilità del sistema preservando i messaggi quando l'elaborazione fallisce. 

 Ricerca e seleziona un meccanismo di messaggistica appropriato, poiché i vari servizi di messaggistica hanno caratteristiche diverse, ad esempio i meccanismi di ordinazione e consegna. Progetta le operazioni in modo che siano idempotenti in modo che il sistema di messaggistica scelto recapiti i messaggi almeno una volta. Ad esempio, considera un tipico caso d'uso di un gioco in cui il gioco deve tenere traccia del tempo di gioco, delle statistiche o di altri dati pertinenti del giocatore, il che può portare a un elevato throughput di scrittura nei momenti di massima concorrenza tra i giocatori. 

 Per implementare un'architettura affidabile, valutate se il caso d'uso richiede la coerenza tra lettura e scrittura, così come percepita dal giocatore. In genere, scenari come questi sono adatti all'elaborazione asincrona e possono essere realizzati implementando uno schema di codifica di scrittura in cui le richieste vengono inserite in una coda di messaggi scalabile e duratura come Amazon SQS e possono essere inserite nel database di backend in batch utilizzando un servizio consumer, come una funzione Lambda. Questo approccio è più affidabile della comunicazione sincrona tra più componenti distribuiti, tra cui il client di gioco del giocatore, i server web e applicativi di backend e il sistema di database interno. Inoltre, riduce i costi perché non è necessario scalare il database backend per soddisfare i picchi di velocità di scrittura, poiché l'elaborazione consumer proveniente dalla coda di scrittura può essere utilizzata per rallentare questa velocità di inserimento in base alle necessità. 

### Passaggi dell’implementazione
<a name="implementation-steps-41"></a>
+  Separa componenti non critici come classifiche e servizi di statistiche dalle funzionalità di gioco critiche per consentire operazioni asincrone e migliorare la resilienza. 
+  Implementa una graduale degradazione per le funzionalità non critiche con una logica di timeout, tentativi e backoff e verifica che il client di gioco gestisca i guasti senza interrompere l'esperienza del giocatore. 
+  Usa sistemi di messaggistica come Amazon SQS per la comunicazione asincrona tra i componenti, consentendo l'elaborazione scalabile, duratura e affidabile di casi d'uso ad alto rendimento. 

### Resources
<a name="resources-8"></a>
+  [Crea carichi di lavoro altamente scalabili e affidabili utilizzando un'architettura a microservizi ](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/design-your-workload-service-architecture.html) 
+  [Integrazione dei microservizi utilizzando servizi serverless AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/modernization-integrating-microservices/welcome.html) 
+  [Comprendere la messaggistica asincrona per i microservizi ](https://aws.amazon.com/blogs/compute/understanding-asynchronous-messaging-for-microservices/) 
+  [Introduzione ai modelli di sviluppo di giochi scalabili su AWS](https://d1.awsstatic.com/whitepapers/aws-scalable-gaming-patterns.pdf) 
+  Implementazione di [ 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.) 