La tecnologia alla base della progressiva riduzione del carico di Netflix

Ad aprile 2020, il servizio di streaming basato su abbonamento Netflix ha registrato 16 milioni di nuove registrazioni, a causa di blocchi a livello nazionale in diversi paesi a causa della paura del coronavirus. Nonostante l’aumento, si può aver osservato che non si è verificata un’interruzione significativa, paralizzando lo streaming regolare . Netflix, attraverso un blog , ha descritto in dettaglio una tecnologia di riduzione del carico progressiva basata sulle priorità per migliorare l’esperienza del cliente sulla piattaforma offrendo servizi ininterrotti. Questa tecnologia ha un filtro di “limitazione della priorità” denominato Zuul che può eliminare le richieste del server non necessarie ogni volta che si verifica un problema sul back-end.

Eliminazione progressiva del carico prioritaria con Zuul
Il sovraccarico del traffico può verificarsi a causa di diversi motivi, ad esempio l’attivazione di più tentativi da parte dei client, un servizio di dimensioni inferiori, un problema di rete o un problema tecnico con il provider di servizi cloud. Tenendo presenti queste cause, Netflix ha deciso di rendere la piattaforma più affidabile: assegnando priorità alle richieste su più tipi di dispositivi, limitando progressivamente le richieste e convalidando le ipotesi di Chaos Testing.

Zuul assegna la priorità al traffico in base a quanto un utente ne ha bisogno per la riproduzione. Netflix si è concentrato su tre fattori – throughput, funzionalità e criticità – per classificare il traffico delle richieste in:

NON_CRITICO: i log e le richieste in background sono alcuni degli esempi di questo tipo di traffico, che non influisce sulla riproduzione ma ha un throughput elevato che contribuisce principalmente al caricamento nel sistema.
DEGRADED_EXPERIENCE: a differenza di NON_CRITICAL, questo tipo di traffico influisce sull’esperienza dell’utente; tuttavia, non la capacità di giocare. Entra in gioco per funzionalità come i marcatori di interruzione e pausa, la selezione della lingua e la visualizzazione della cronologia.
CRITICO: questo tipo influisce sulla capacità di giocare. Se la richiesta fallisce, gli utenti vedranno un messaggio di errore quando premono play.
In base ai bucket di traffico, come discusso in precedenza, in base alle caratteristiche individuali, Zuul calcola un punteggio di priorità compreso tra 1 e 100 per ciascuna richiesta. Quando si sviluppa un problema sul backend, il filtro Zuul limita prima i carichi con la priorità più bassa. Significa che la richiesta con la priorità più alta ottiene un trattamento preferenziale e viene servita. L’implementazione è analoga a una coda con una soglia di priorità dinamica.

Durante il ciclo di vita della richiesta, Zuul può applicare la riduzione del carico in due casi:

Limitazione del servizio: entra in gioco quando le richieste vengono instradate a un servizio di backend specifico. Zuul monitora i tassi di errore e le richieste simultanee per valutare qualsiasi anomalia. Quando viene superata la percentuale di soglia per una di queste due metriche, il traffico viene limitato per ridurre il carico.
Limitazione globale: influisce su tutti i servizi di backend piuttosto che su un singolo servizio di backend: problemi come l’utilizzo della CPU, le richieste simultanee e il conteggio delle connessioni innescano la limitazione globale. Se Zuul è inattivo, nessun traffico arriva ai servizi di backend che si traducono in un’interruzione completa.
Quando una qualsiasi delle soglie sopra elencate viene superata, il traffico viene progressivamente ridotto, a partire dalla priorità più bassa. Il livello di throttling è gestito da una funzione cubica, come indicato di seguito. Con l’aumento della percentuale di sovraccarico, la soglia di priorità lo trascina lentamente. Ad esempio, alla soglia di sovraccarico del 35%, la soglia di priorità è ancora a metà degli anni ’90. Tuttavia, se la soglia di sovraccarico aumenta, il livello colpisce il lato acuto della curva e rallenta tutto.

Aggiungendo la riduzione progressiva del carico basata sulla priorità a Zulu, può eliminare abbastanza traffico da stabilizzare i servizi anche senza che i membri se ne accorgano. Per eliminare il traffico, Zuul invia un segnale ai dispositivi. Zuul indica quanti tentativi può eseguire e il periodo di tempo. Zuul utilizza un meccanismo di contropressione per fermare più velocemente la tempesta di tentativi.

Nel 2019, Netflix ha subito una grave interruzione che ha comportato un’elevata percentuale di persone che non sono state in grado di utilizzare la piattaforma per alcune ore. Dopo l’implementazione del meccanismo di eliminazione progressiva del carico, la piattaforma ha sperimentato di nuovo una situazione simile nel 2020, tuttavia, a causa di Zuul, l’effetto era in larga misura sotto controllo e non ha ostacolato affatto la capacità dei membri di utilizzare la piattaforma .

In futuro, il team cercherà di espandere l’ambito della priorità della richiesta per altre funzioni come migliori criteri di ripetizione tra dispositivi e back-end, priorità della richiesta utilizzando Chaos Testing, per modificare dinamicamente la soglia di eliminazione del carico, tra le altre.

Di ihal