L'esecuzione di qualsiasi piattaforma distribuita scalabile richiede un impegno per l'affidabilità, per garantire ai clienti ciò di cui hanno bisogno quando ne hanno bisogno. Le dipendenze potrebbero essere piuttosto complesse, specialmente con una piattaforma grande come Roblox. Costruire servizi affidabili significa che, indipendentemente dalla complessità e dallo stato delle dipendenze, qualsiasi servizio non verrà interrotto (ad es disponibile), funzionerà senza bug (ad es qualità) e senza errori (es tolleranza d'errore).
Perché l'affidabilità è importante
Il nostro team di Account Identity si impegna a raggiungere una maggiore affidabilità, poiché i servizi di conformità che abbiamo creato sono componenti fondamentali della piattaforma. La mancata conformità può avere gravi conseguenze. Il costo del blocco del funzionamento naturale di Roblox è molto alto, con risorse aggiuntive necessarie per il ripristino dopo un errore e un'esperienza utente indebolita.
L'approccio tipico all'affidabilità si concentra principalmente sulla disponibilità, ma in alcuni casi i termini sono misti e usati in modo improprio. La maggior parte delle misurazioni per la disponibilità valuta semplicemente se i servizi sono attivi e in esecuzione, mentre aspetti come la tolleranza e la coerenza delle partizioni vengono talvolta dimenticati o fraintesi.
In accordo con il teorema CAP, qualsiasi sistema distribuito può garantire solo due di questi tre aspetti, quindi i nostri servizi di conformità sacrificano una certa coerenza per essere altamente disponibili e tolleranti alle partizioni. Tuttavia, i nostri servizi hanno sacrificato poco e hanno trovato meccanismi per ottenere una buona coerenza con modifiche architettoniche ragionevoli spiegate di seguito.
Il processo per raggiungere una maggiore affidabilità è iterativo, con misurazioni rigorose che abbinano un lavoro continuo al fine di prevenire, trovare, rilevare e correggere i difetti prima che si verifichino incidenti. Il nostro team ha identificato un forte valore nelle seguenti pratiche:
- Misura giusta – Costruire la piena osservabilità su come la qualità viene fornita ai clienti e su come le dipendenze forniscono qualità a noi.
- Anticipazione proattiva – Eseguire attività come revisioni dell'architettura e valutazioni del rischio di dipendenza.
- Dai priorità alla correzione – Portare maggiore attenzione alla risoluzione dei rapporti sugli incidenti per il servizio e le dipendenze collegate al nostro servizio.
Costruire una maggiore affidabilità richiede una cultura della qualità. Il nostro team stava già investendo nello sviluppo orientato alle prestazioni e sa che il successo di un processo dipende dalla sua adozione. Il team ha adottato completamente questo processo e ha applicato le pratiche come standard. Il diagramma seguente evidenzia le componenti del processo:
Il potere della giusta misurazione
Prima di approfondire le metriche, è necessario fare un rapido chiarimento in merito alle misurazioni del livello di servizio.
- SLO (Service Level Objective) è l'obiettivo di affidabilità a cui mira il nostro team (ovvero 99.999%).
- SLI (Service Level Indicator) è l'affidabilità raggiunta in un arco temporale (cioè 99.975% lo scorso febbraio).
- SLA (Service Level Agreement) è l'affidabilità concordata per fornire e che ci si aspetta dai nostri consumatori in un determinato periodo di tempo (cioè 99.99% a settimana).
Lo SLI dovrebbe riflettere la disponibilità (nessuna risposta non gestita o mancante), la tolleranza ai guasti (nessun errore di servizio) e la qualità raggiunta (nessun errore imprevisto). Pertanto, abbiamo definito il nostro SLI come il “Success Ratio” delle risposte riuscite rispetto al totale delle richieste inviate a un servizio. Le risposte riuscite sono quelle richieste che sono state spedite in tempo e forma, il che significa no connettività, servizio o errori imprevisti.
Questo SLI o Success Ratio viene raccolto dal punto di vista dei consumatori (ovvero i clienti). L'intenzione è di misurare l'effettiva esperienza end-to-end fornita ai nostri consumatori in modo da essere certi che gli SLA siano rispettati. Non farlo creerebbe un falso senso di affidabilità che ignora tutte le preoccupazioni relative all'infrastruttura per connettersi con i nostri clienti. Analogamente allo SLI consumer, raccogliamo lo SLI di dipendenza per tenere traccia di qualsiasi potenziale rischio. In pratica, tutti gli SLA di dipendenza dovrebbero essere allineati con lo SLA di servizio e con essi esiste una dipendenza diretta. Il fallimento di uno implica il fallimento di tutti. Tracciamo e segnaliamo anche le metriche del servizio stesso (ad esempio, server), ma questa non è la fonte pratica per un'elevata affidabilità.
Oltre agli SLI, ogni build raccoglie le metriche di qualità riportate dal nostro flusso di lavoro CI. Questa pratica aiuta a rafforzare fortemente i controlli di qualità (ad esempio, la copertura del codice) ea segnalare altre metriche significative, come la conformità agli standard di codifica e l'analisi del codice statico. Questo argomento è stato precedentemente trattato in un altro articolo, Creazione di microservizi guidati dalle prestazioni. La diligente osservanza della qualità si aggiunge quando si parla di affidabilità, perché più investiamo per raggiungere punteggi eccellenti, più siamo sicuri che il sistema non fallirà in condizioni avverse.
Il nostro team ha due dashboard. One offre tutta la visibilità sia sull'SLI dei consumatori che sull'SLI delle dipendenze. Il secondo mostra tutte le metriche di qualità. Stiamo lavorando per unire tutto in un'unica dashboard, in modo che tutti gli aspetti a cui teniamo siano consolidati e pronti per essere segnalati in qualsiasi momento.
Anticipare il fallimento
fare Recensioni architettoniche è una parte fondamentale dell'essere affidabili. Innanzitutto, determiniamo se la ridondanza è presente e se il servizio ha i mezzi per sopravvivere quando le dipendenze diminuiscono. Oltre alle tipiche idee di replica, la maggior parte dei nostri servizi ha applicato tecniche migliorate di idratazione della doppia cache, strategie di doppio ripristino (come le code locali di failover) o strategie di perdita di dati (come il supporto transazionale). Questi argomenti sono abbastanza estesi da giustificare un altro post sul blog, ma in definitiva la migliore raccomandazione è quella di implementare idee che tengano conto degli scenari di emergenza e riducano al minimo qualsiasi penalizzazione delle prestazioni.
Un altro aspetto importante da anticipare è tutto ciò che potrebbe migliorare la connettività. Ciò significa essere aggressivi riguardo alla bassa latenza per i client e prepararli a un traffico molto elevato utilizzando tecniche di controllo della cache, sidecar e politiche performanti per timeout, interruttori di circuito e tentativi. Queste pratiche si applicano a qualsiasi client, inclusi cache, archivi, code e client interdipendenti in HTTP e gRPC. Significa anche migliorare i segnali sani dai servizi e comprendere che i controlli dello stato svolgono un ruolo importante in tutta l'orchestrazione dei container. La maggior parte dei nostri servizi fornisce segnali migliori per il degrado come parte del feedback del controllo dello stato e verifica che tutti i componenti critici siano funzionali prima di inviare segnali sani.
La suddivisione dei servizi in parti critiche e non critiche si è rivelata utile per concentrarsi sulla funzionalità che conta di più. In passato avevamo endpoint di solo amministratore nello stesso servizio e, sebbene non venissero utilizzati spesso, influivano sulle metriche di latenza complessive. Spostarli al proprio servizio ha avuto un impatto positivo su ogni metrica.
Valutazione del rischio di dipendenza è uno strumento importante per identificare potenziali problemi con le dipendenze. Ciò significa che identifichiamo le dipendenze con SLI basso e chiediamo l'allineamento SLA. Tali dipendenze richiedono un'attenzione speciale durante le fasi di integrazione, quindi dedichiamo più tempo al benchmarking e al test se le nuove dipendenze sono sufficientemente mature per i nostri piani. Un buon esempio è l'adozione anticipata di Roblox Storage-as-a-Service. L'integrazione con questo servizio ha richiesto l'archiviazione di ticket di bug e riunioni periodiche di sincronizzazione per comunicare risultati e feedback. Tutto questo lavoro utilizza il tag "affidabilità" in modo da poterne identificare rapidamente l'origine e le priorità. La caratterizzazione è avvenuta spesso finché non abbiamo avuto la certezza che la nuova dipendenza era pronta per noi. Questo lavoro extra ha aiutato a portare la dipendenza al livello di affidabilità richiesto che ci aspettiamo di fornire agendo insieme per un obiettivo comune.
Porta la struttura al caos
Non è mai desiderabile avere incidenti. Ma quando accadono, ci sono informazioni significative da raccogliere e da cui imparare per essere più affidabili. Il nostro team dispone di un rapporto sugli incidenti del team che viene creato al di là del tipico rapporto a livello aziendale, quindi ci concentriamo su tutti gli incidenti indipendentemente dall'entità del loro impatto. Indichiamo la causa principale e diamo la priorità a tutto il lavoro per mitigarla in futuro. Nell'ambito di questo rapporto, chiamiamo altri team per risolvere gli incidenti di dipendenza con priorità elevata, seguire con una risoluzione adeguata, analizzare a posteriori e cercare modelli che potrebbero essere applicabili a noi.
La squadra produce a Report mensile sull'affidabilità per servizio che include tutti gli SLI spiegati qui, tutti i ticket che abbiamo aperto a causa dell'affidabilità e qualsiasi possibile incidente associato al servizio. Siamo così abituati a generare questi rapporti che il prossimo passo naturale è automatizzare la loro estrazione. Svolgere questa attività periodica è importante ed è un promemoria che l'affidabilità viene costantemente monitorata e considerata nel nostro sviluppo.
La nostra strumentazione include metriche personalizzate e avvisi migliorati in modo da essere contattati il prima possibile quando si verificano problemi noti e previsti. Tutti gli avvisi, compresi i falsi positivi, vengono rivisti ogni settimana. A questo punto, perfezionare tutta la documentazione è importante in modo che i nostri consumatori sappiano cosa aspettarsi quando si attivano gli avvisi e quando si verificano errori, e quindi tutti sanno cosa fare (ad esempio, i playbook e le linee guida di integrazione vengono allineati e aggiornati spesso).
In definitiva, l'adozione della qualità nella nostra cultura è il fattore più critico e decisivo per raggiungere una maggiore affidabilità. Possiamo osservare come queste pratiche applicate al nostro lavoro quotidiano stiano già dando i loro frutti. Il nostro team è ossessionato dall'affidabilità ed è il nostro risultato più importante. Abbiamo aumentato la nostra consapevolezza dell'impatto che i potenziali difetti potrebbero avere e di quando potrebbero essere introdotti. I servizi che hanno implementato queste pratiche hanno costantemente raggiunto i propri SLO e SLA. I rapporti sull'affidabilità che ci aiutano a tenere traccia di tutto il lavoro che abbiamo svolto sono una testimonianza del lavoro svolto dal nostro team e rappresentano una lezione inestimabile per informare e influenzare gli altri team. È così che la cultura dell'affidabilità tocca tutti i componenti della nostra piattaforma.
La strada verso una maggiore affidabilità non è facile, ma è necessaria se vuoi costruire una piattaforma affidabile che reimmagina il modo in cui le persone si uniscono.
Alberto è un Principal Software Engineer nel team Account Identity di Roblox. È nel settore dei giochi da molto tempo, con crediti su molti titoli di giochi AAA e piattaforme di social media con una forte attenzione alle architetture altamente scalabili. Ora sta aiutando Roblox a raggiungere la crescita e la maturità applicando le migliori pratiche di sviluppo.
Il post Fornire affidabilità della piattaforma su larga scala apparve prima Blog di Roblox.
- "
- a
- WRI
- Il mio account
- Raggiungere
- raggiunto
- attività
- attività
- aggiunta
- aggiuntivo
- Adozione
- avverso
- Accordo
- Tutti
- già
- .
- Un altro
- anticipare
- applicato
- APPLICA
- AMMISSIONE
- approccio
- architettonico
- in giro
- articolo
- associato
- attenzione
- automatizzare
- disponibilità
- disponibile
- consapevolezza
- perché
- prima
- essendo
- sotto
- Segno di riferimento
- MIGLIORE
- Al di là di
- Blog
- portare
- Insetto
- costruire
- chiamata
- che
- casi
- Causare
- Controlli
- clienti
- codice
- codifica
- raccogliere
- Venire
- commettere
- impegno
- impegnata
- Uncommon
- comunicare
- rispetto
- conformità
- componenti
- condizioni
- fiducia
- fiducioso
- Connettiti
- Connettività
- Prendere in considerazione
- costantemente
- Consumer
- Consumatori
- Contenitore
- Nucleo
- potuto
- creare
- creato
- Crediti
- critico
- Cultura
- costume
- Clienti
- cruscotto
- dati
- più profondo
- consegnato
- consegna
- fornisce un monitoraggio
- richieste
- dipende
- Determinare
- Mercato
- dirette
- disastro
- distribuito
- giù
- spinto
- durante
- Presto
- da un capo all'altro
- ingegnere
- particolarmente
- tutti
- qualunque cosa
- esempio
- eccellente
- attenderti
- previsto
- esperienza
- estensivo
- Fallimento
- feedback
- Nome
- Fissare
- Focus
- si concentra
- messa a fuoco
- seguire
- i seguenti
- modulo
- essere trovato
- da
- pieno
- funzionale
- funzionalità
- fondamentale
- futuro
- gioco
- Gates
- la generazione di
- scopo
- buono
- Crescita
- di garanzia
- linee guida
- accadere
- successo
- Salute e benessere
- Aiuto
- aiutare
- aiuta
- qui
- Alta
- superiore
- evidenzia
- vivamente
- Come
- HTTPS
- idee
- identificare
- Identità
- Impact
- realizzare
- implementato
- importante
- competenze
- migliorata
- miglioramento
- In altre
- inclusi
- Compreso
- è aumentato
- industria
- influenza
- informazioni
- Infrastruttura
- integrazione
- Intenzione
- investire
- IT
- stessa
- Sapere
- conosciuto
- IMPARARE
- Livello
- piccolo
- locale
- Lunghi
- Guarda
- make
- corrispondenza
- Matters
- alunni
- maturità
- significato
- significativo
- si intende
- misurare
- Media
- incontri
- Metrica
- misto
- Scopri di più
- maggior parte
- in movimento
- Naturale
- necessaria
- tuttavia
- operare
- operazione
- orchestrazione
- minimo
- Altro
- complessivo
- proprio
- parte
- Persone
- performance
- pezzi
- piani
- piattaforma
- Piattaforme
- Giocare
- punto
- Punto di vista
- Termini e Condizioni
- positivo
- possibile
- potenziale
- energia
- pratica
- presenti
- Direttore
- priorità
- problemi
- processi
- qualità
- Presto
- rapidamente
- raggiungere
- ragionevole
- Recuperare
- recupero
- riflettere
- per quanto riguarda
- affidabile
- rapporto
- Report
- richieste
- necessario
- Risorse
- Recensioni
- Rischio
- strada
- Roblox
- Ruolo
- radice
- running
- stesso
- scalabile
- Scala
- senso
- servizio
- Servizi
- simile
- da
- singolo
- So
- Social
- Social Media
- piattaforme di social media
- Software
- Software Engineer
- alcuni
- la nostra speciale
- stare in piedi
- Standard
- Stato dei servizi
- negozi
- strategie
- forte
- il successo
- di successo
- supporto
- sistema
- parlando
- team
- tecniche
- condizioni
- test
- Il
- perciò
- tre
- biglietti
- tempo
- periodo di tempo
- insieme
- tolleranza
- argomento
- Argomenti
- pista
- traffico
- e una comprensione reciproca
- us
- APPREZZIAMO
- verificare
- Visualizza
- visibilità
- settimana
- Che
- se
- while
- senza
- Lavora
- lavoro
- sarebbe