
Netflix â leader du marchĂ© de la tĂ©lĂ©vision par Internet â est une entreprise qui a créé et qui dĂ©veloppe activement ce segment. Netflix est connu non seulement pour son vaste catalogue de films et de sĂ©ries, accessible presque de n'importe quel coin du globe et sur tout appareil avec un Ă©cran, mais aussi pour son infrastructure fiable et sa culture d'ingĂ©nierie unique.
Un exemple concret de l'approche de Netflix en matiĂšre de dĂ©veloppement et de maintenance de systĂšmes complexes a Ă©tĂ© prĂ©sentĂ© lors de DevOops 2019 par â directeur du dĂ©veloppement chez Netflix. DiplĂŽmĂ© de la facultĂ© de VMI de l'UniversitĂ© d'Ătat de Nijni Novgorod, SergueĂŻ est l'un des premiers ingĂ©nieurs d'Open Connect â l'Ă©quipe CDN de Netflix. Il a construit des systĂšmes de surveillance et d'analyse des donnĂ©es vidĂ©o, a lancĂ© le service populaire d'Ă©valuation de la vitesse de connexion Internet FAST.com et, ces derniĂšres annĂ©es, a travaillĂ© Ă l'optimisation des requĂȘtes Internet afin que l'application Netflix fonctionne aussi rapidement que possible pour les utilisateurs.
La présentation a reçu les meilleurs avis des participants à la conférence et nous avons préparé pour vous une version écrite.

Dans cette présentation, Sergueï a expliqué en détail
- ce qui influence la latence des requĂȘtes Internet entre le client et le serveur;
- comment réduire cette latence;
- comment concevoir, maintenir et surveiller des systÚmes résilients aux pannes;
- comment atteindre des résultats dans des délais serrés et avec un risque minimal pour l'entreprise;
- comment analyser les résultats et apprendre de ses erreurs.
Les réponses à ces questions sont nécessaires non seulement à ceux qui travaillent dans de grandes entreprises.
Les principes et techniques prĂ©sentĂ©s doivent ĂȘtre connus et pratiquĂ©s par quiconque dĂ©veloppe et maintient des produits Internet.
Ensuite â le rĂ©cit du speaker.
L'importance de la vitesse de l'Internet
La vitesse des requĂȘtes Internet est directement liĂ©e aux affaires. ConsidĂ©rons le secteur du shopping : l'entreprise Amazon en 2009 , qu'un retard de 100 ms entraĂźne une perte de 1 % des ventes.
Il y a de plus en plus d'appareils mobiles, et par conséquent de sites et d'applications mobiles. Si votre page met plus de 3 secondes à se charger, vous perdez environ la moitié de vos utilisateurs. Depuis , Google prend en compte la vitesse de chargement de votre page dans les résultats de recherche : plus la page est rapide, plus sa position dans Google est élevée.
La vitesse de connexion est Ă©galement importante dans les organisations financiĂšres, oĂč le retard est critique. En 2015, l'entreprise Hibernia Networks un cĂąble entre New York et Londres coĂ»tant 400 millions de dollars, afin de rĂ©duire le temps de latence entre les villes de 6 ms. Imaginez, 66 millions de dollars pour 1 ms de rĂ©duction de latence !
Selon , une connexion supérieure à 5 Mbit/s n'affecte plus directement la vitesse de chargement d'un site web standard. Cependant, il existe une dépendance linéaire entre la latence de connexion et la vitesse de chargement des pages :

Cependant, Netflix n'est pas un produit standard. L'impact de la latence et de la vitesse sur l'utilisateur est un domaine d'analyse et de dĂ©veloppement actif. Il y a le chargement de l'application et le choix du contenu, qui dĂ©pendent de la latence, mais le chargement des Ă©lĂ©ments statiques et le streaming dĂ©pendent Ă©galement de la vitesse de connexion. L'analyse et l'optimisation des facteurs clĂ©s influençant la qualitĂ© du service pour l'utilisateur est un domaine actif de dĂ©veloppement pour plusieurs Ă©quipes chez Netflix. L'un des objectifs est de rĂ©duire la latence des requĂȘtes entre les appareils Netflix et l'infrastructure cloud.
Dans ce rapport, nous allons nous concentrer sur la réduction de la latence (latency) en prenant l'exemple de l'infrastructure de Netflix. Nous examinerons de maniÚre pratique comment aborder les processus de conception, de développement et d'exploitation de systÚmes distribués complexes tout en passant du temps sur l'innovation et les résultats, et non sur le diagnostic des problÚmes opérationnels et des pannes.
à l'intérieur de Netflix
Des milliers de dispositifs différents prennent en charge les applications Netflix. Leur développement est entrepris par quatre équipes différentes, qui créent des versions distinctes du client pour Android, iOS, TV et navigateurs web. Nous consacrons également beaucoup d'efforts à améliorer et à personnaliser l'interface utilisateur. Pour cela, nous exécutons des centaines de tests A/B en parallÚle.
La personnalisation est soutenue par des centaines de microservices dans le cloud AWS, fournissant des donnĂ©es personnalisĂ©es pour l'utilisateur, la gestion des requĂȘtes, la tĂ©lĂ©mĂ©trie, le Big Data et l'encodage. La visualisation du trafic est la suivante :
à gauche se trouve le point d'entrée, puis le trafic est réparti entre plusieurs centaines de microservices, soutenus par différentes équipes backend.
Un autre composant important de notre infrastructure est le CDN Open Connect, qui livre du contenu statiqueâvidĂ©os, images, code pour les clients, etc.âjusqu'Ă l'utilisateur final. Le CDN est situĂ© sur des serveurs personnalisĂ©s (OCA - Open Connect Appliance). Ă l'intĂ©rieur, se trouvent des ensembles de disques SSD et HDD fonctionnant sous un FreeBSD optimisĂ©, avec NGINX et un ensemble de services. Nous concevons et optimisons les composants matĂ©riels et logiciels afin que ce serveur CDN puisse envoyer le plus de donnĂ©es possible aux utilisateurs.
Le « mur » de ces serveurs au point d'échange de trafic Internet (Internet eXchange - IX) se présente comme suit :

L'Internet Exchange permet aux fournisseurs d'accĂšs Internet et aux fournisseurs de contenu de se « connecter » les uns aux autres pour un Ă©change de donnĂ©es plus direct sur Internet. Il existe environ 70 Ă 80 points Internet Exchange dans le monde, oĂč nos serveurs sont installĂ©s, et nous nous occupons nous-mĂȘmes de leur installation et de leur maintenance :

De plus, nous fournissons également des serveurs directement aux fournisseurs d'accÚs Internet, qui les installent dans leur réseau, améliorant ainsi la localisation du trafic Netflix et la qualité du streaming pour les utilisateurs :

L'ensemble des services AWS est responsable de l'acheminement des requĂȘtes vidĂ©o des clients vers les serveurs CDN, ainsi que de la configuration mĂȘme de ces serveursâmise Ă jour du contenu, du code logiciel, des paramĂštres, etc. Pour cela, nous avons Ă©galement construit un backbone network qui relie les serveurs des points Internet Exchange Ă AWS. Le backbone network est un rĂ©seau mondial de cĂąbles en fibre optique et de routeurs, que nous pouvons concevoir et configurer en fonction de nos besoins.
Selon , notre infrastructure CDN livre aux heures de pointe environ â du trafic Internet mondial et â du trafic en AmĂ©rique du Nord, oĂč Netflix existe depuis le plus longtemps. Ce sont des chiffres impressionnants, mais pour moi, l'un des accomplissements les plus Ă©tonnants est que l'ensemble du systĂšme CDN est dĂ©veloppĂ© et maintenu par une Ă©quipe de moins de 150 personnes.
Ă l'origine, l'infrastructure CDN Ă©tait conçue pour la livraison de donnĂ©es vidĂ©o. Cependant, avec le temps, nous avons rĂ©alisĂ© que nous pouvions Ă©galement l'utiliser pour optimiser les requĂȘtes dynamiques des clients vers le cloud AWS.
Sur l'accélération de l'Internet
Aujourd'hui, Netflix compte 3 rĂ©gions AWS, et la latence des requĂȘtes vers le cloud dĂ©pendra de la distance entre le client et la rĂ©gion la plus proche. Nous avons aussi de nombreux serveurs CDN qui sont utilisĂ©s pour la livraison de contenu statique. Existe-t-il un moyen d'utiliser cette infrastructure pour accĂ©lĂ©rer les requĂȘtes dynamiques ? Malheureusement, ces requĂȘtes ne peuvent pas ĂȘtre mises en cache, car les API sont personnalisĂ©es et chaque rĂ©sultat est unique.
Créons un proxy sur le serveur CDN et commençons à acheminer le trafic à travers lui. Cela sera-t-il plus rapide ?
Matériel
Rappelons-nous comment fonctionnent les protocoles réseau. Aujourd'hui, la majorité du trafic sur Internet utilise HTTPS, qui dépend des protocoles de bas niveau TCP et TLS. Pour que le client se connecte au serveur, il effectue un handshake, et pour établir une connexion sécurisée, le client doit échanger des messages avec le serveur trois fois, plus au moins une fois de plus pour transmettre des données. Avec une latence d'un échange (RTT) de 100 ms, nous aurons besoin de 400 ms pour obtenir le premier bit de données :

Si nous plaçons les certificats sur le serveur CDN, nous pouvons considérablement réduire le temps de « handshake » entre le client et le serveur, à condition que le CDN soit plus proche. Supposons que la latence vers le serveur CDN soit de 30 ms. Alors, pour obtenir le premier bit, il faudra déjà 220 ms :

Mais les avantages ne s'arrĂȘtent pas lĂ . Une fois la connexion Ă©tablie, TCP augmente la congestion de la fenĂȘtre (la quantitĂ© d'informations qu'il peut transmettre sur cette connexion en parallĂšle). Si un paquet de donnĂ©es est perdu, les implĂ©mentations classiques du protocole TCP (comme TCP New Reno) rĂ©duisent la « fenĂȘtre » ouverte de moitiĂ©. L'augmentation de la congestion de la fenĂȘtre, et la vitesse de sa rĂ©cupĂ©ration aprĂšs une perte dĂ©pendront Ă nouveau de la latence (RTT) vers le serveur. Si cette connexion ne passe que par le serveur CDN, cette rĂ©cupĂ©ration sera plus rapide. De plus, la perte de paquets est un phĂ©nomĂšne standard, surtout pour les rĂ©seaux sans fil.
La bande passante Internet peut diminuer, surtout pendant les heures de pointe Ă cause du trafic des utilisateurs, ce qui peut entraĂźner des « embouteillages ». Il n'existe cependant pas de moyen sur Internet pour donner la prioritĂ© Ă certaines requĂȘtes par rapport Ă d'autres. Par exemple, donner la prioritĂ© aux requĂȘtes lĂ©gĂšres et sensibles Ă la latence par rapport aux « lourds » flux de donnĂ©es qui saturent le rĂ©seau. Toutefois, dans notre cas, la prĂ©sence d'un rĂ©seau backbone propre nous permet de le faire sur une partie du chemin de la requĂȘte - entre le CDN et le cloud, et nous pouvons le configurer entiĂšrement. Nous pouvons faire en sorte que de petits paquets sensibles Ă la latence soient prioritaires, tandis que les gros flux de donnĂ©es passent un peu plus tard. Plus le CDN est proche du client, plus l'efficacitĂ© est grande.
De plus, les protocoles de niveau application (niveau 7 du modĂšle OSI) influencent Ă©galement la latence. De nouveaux protocoles, comme HTTP/2, permettent d'optimiser la performance des requĂȘtes parallĂšles. Cependant, nos clients de Netflix possĂšdent des appareils anciens ne supportant pas ces nouveaux protocoles. Tous les clients ne peuvent pas ĂȘtre mis Ă jour ou configurĂ©s de maniĂšre optimale. Entre le proxy du CDN et le cloud, nous avons un contrĂŽle total et la possibilitĂ© d'utiliser des protocoles et des configurations nouveaux et optimaux. La partie inefficace avec les anciens protocoles n'agira que entre le client et le serveur CDN. De plus, nous pouvons rĂ©aliser le multiplexage des requĂȘtes sur une connexion dĂ©jĂ Ă©tablie entre le CDN et le cloud, amĂ©liorant ainsi l'utilisation de la connexion au niveau TCP.

Mesurons
Bien que la théorie promette des améliorations, nous ne nous précipitons pas pour lancer le systÚme en production. Au lieu de cela, nous devons d'abord prouver que l'idée fonctionnera dans la pratique. Pour cela, il est nécessaire de répondre à plusieurs questions :
- Vitesse: le proxy sera-t-il plus rapide ?
- Fiabilité: sera-t-il plus sujet aux pannes ?
- Complexité: comment s'intégrer aux applications ?
- Coût: quel est le coût de déploiement d'une infrastructure supplémentaire ?
Examinons en détail notre approche pour évaluer le premier point. Les autres se traitent de maniÚre similaire.
Pour analyser la vitesse des requĂȘtes, nous souhaitons obtenir des donnĂ©es pour tous les utilisateurs, ne pas passer trop de temps en dĂ©veloppement et ne pas casser la production. Pour cela, plusieurs approches existent :
- RUM, ou mesure passive des requĂȘtes. Nous mesurons le temps d'exĂ©cution des requĂȘtes actuelles des utilisateurs et assurons une couverture complĂšte des utilisateurs. Le dĂ©savantage est un signal pas trĂšs stable en raison de nombreux facteurs, comme la taille variable des requĂȘtes, le temps de traitement sur le serveur et le client. De plus, il n'est pas possible de tester une nouvelle configuration sans impact sur la production.
- Tests en laboratoire. Serveurs et infrastructure spéciaux imitant des clients. Grùce à eux, nous effectuons les tests nécessaires. Cela nous permet d'avoir un contrÎle total sur les résultats des mesures et un signal clair. Cependant, il n'y a pas de couverture complÚte des dispositifs et des emplacements des utilisateurs (surtout avec un service à l'échelle mondiale et prenant en charge des milliers de modÚles de dispositifs).
Comment combiner les avantages des deux méthodes ?
Notre Ă©quipe a trouvĂ© une solution. Nous avons Ă©crit un petit morceau de code â un essai â que nous avons intĂ©grĂ© dans notre application. Les essais nous permettent d'effectuer des tests rĂ©seau entiĂšrement contrĂŽlĂ©s depuis nos dispositifs. Cela fonctionne comme suit :
- Peu aprÚs le chargement de l'application et l'achÚvement des activités initiales, nous lançons nos essais.
- Le client fait une demande au serveur et reçoit une "recette" de test. La recette est une liste d'URL auxquelles il faut faire une requĂȘte HTTP(s). En outre, la recette configure les paramĂštres des requĂȘtes : dĂ©lais entre les requĂȘtes, volume de donnĂ©es demandĂ©es, en-tĂȘtes HTTP(s), etc. Par ailleurs, nous pouvons tester plusieurs recettes diffĂ©rentes en parallĂšle â lors de la demande de configuration, nous dĂ©terminons alĂ©atoirement quelle recette dĂ©livrer.
- Le temps de dĂ©marrage de l'essai est choisi pour ne pas entrer en conflit avec l'utilisation active des ressources rĂ©seau par le client. En substance, un moment est sĂ©lectionnĂ© oĂč le client n'est pas actif.
- AprĂšs avoir reçu la recette, le client effectue des requĂȘtes sur chacune des URL, en parallĂšle. La requĂȘte pour chaque adresse peut ĂȘtre rĂ©pĂ©tĂ©e â les fameux "pulses". Lors du premier pulse, nous mesurons le temps nĂ©cessaire pour Ă©tablir la connexion et tĂ©lĂ©charger les donnĂ©es. Lors du second pulse, nous mesurons le temps de chargement des donnĂ©es via la connexion dĂ©jĂ Ă©tablie. Avant le troisiĂšme, nous pouvons imposer un dĂ©lai et mesurer la vitesse d'Ă©tablissement d'une reconnexion, etc.
Lors du test, nous mesurons tous les paramĂštres que le dispositif peut obtenir :
- le temps de requĂȘte DNS ;
- le temps d'établissement de la connexion TCP ;
- le temps d'établissement de la connexion TLS ;
- le temps de réception du premier octet de données ;
- le temps total de chargement ;
- le code d'état du résultat.
- à la fin de chaque pulse, l'échantillon télécharge les résultats de toutes les mesures pour l'analyse.

Les points clĂ©s sont la dĂ©pendance minimale Ă la logique cĂŽtĂ© client, le traitement des donnĂ©es cĂŽtĂ© serveur et la mesure des requĂȘtes parallĂšles. Ainsi, nous avons la possibilitĂ© d'isoler et de tester l'influence de divers facteurs sur la performance des requĂȘtes, de les varier dans un mĂȘme scĂ©nario et d'obtenir des rĂ©sultats venant de clients rĂ©els.
Cette infrastructure s'est rĂ©vĂ©lĂ©e utile non seulement pour analyser la performance des requĂȘtes. Actuellement, nous avons 14 scĂ©narios actifs, plus de 6000 Ă©chantillons par seconde, recueillant des donnĂ©es du monde entier et couvrant tous les dispositifs. Si Netflix devait acheter un service similaire Ă des entreprises tierces, cela coĂ»terait des millions de dollars par an, avec une couverture bien infĂ©rieure.
Nous testons la théorie en pratique : prototype
Avec un tel systĂšme, nous avons pu Ă©valuer l'efficacitĂ© d'un proxy CDN sur la latence des requĂȘtes. Maintenant, nous devons :
- créer un prototype de proxy ;
- déployer le prototype sur un CDN ;
- déterminer comment diriger les clients vers le proxy sur un serveur CDN spécifique ;
- comparer les performances avec les requĂȘtes AWS sans proxy.
L'objectif est d'Ă©valuer aussi rapidement que possible l'efficacitĂ© de la solution proposĂ©e. Pour mettre en Ćuvre le prototype, nous avons choisi Go, grĂące Ă la disponibilitĂ© de bonnes bibliothĂšques rĂ©seau. Sur chaque serveur CDN, nous avons installĂ© le prototype de proxy sous forme de binaire statique, afin de minimiser les dĂ©pendances et de simplifier l'intĂ©gration. Dans la mise en Ćuvre initiale, nous avons utilisĂ© au maximum les composants standards et quelques petites modifications pour le pooling de connexions HTTP/2 et le multiplexage de requĂȘtes.
Pour Ă©quilibrer entre les rĂ©gions AWS, nous avons utilisĂ© une base de donnĂ©es gĂ©ographique DNS, la mĂȘme que celle utilisĂ©e pour Ă©quilibrer les clients. Pour choisir le serveur CDN pour le client, nous utilisons TCP Anycast pour les serveurs dans Internet Exchange (IX). Dans cette configuration, nous utilisons une adresse IP pour tous les serveurs CDN, tandis que le client sera dirigĂ© vers le serveur CDN avec le plus petit nombre de sauts IP. Sur les serveurs CDN installĂ©s chez les fournisseurs d'accĂšs Internet (FAI), nous n'avons pas le contrĂŽle sur le routeur pour configurer TCP Anycast, donc nous appliquons , selon laquelle les clients sont dirigĂ©s vers les fournisseurs d'accĂšs Internet pour le streaming vidĂ©o.
Ainsi, nous avons trois types de chemins pour la requĂȘte : dans le cloud via Internet ouvert, via un serveur CDN dans l'IX ou via un serveur CDN situĂ© chez le fournisseur d'accĂšs Internet. Notre objectif est de comprendre quel chemin est le meilleur, et quel est l'avantage du proxy, par rapport Ă la maniĂšre dont les requĂȘtes sont dirigĂ©es en production. Pour cela, nous utilisons un systĂšme de tests comme suit :

Chacun des chemins devient une cible distincte, et nous regardons le temps que nous avons obtenu. Pour l'analyse, nous regroupons les rĂ©sultats des proxies en un seul groupe (en choisissant le meilleur temps entre le proxy IX et le proxy ISP) et les comparons avec le temps des requĂȘtes dans le cloud sans proxy :

Comme on peut le voir, les rĂ©sultats sont ambigus â dans la plupart des cas, le proxy offre une bonne accĂ©lĂ©ration, mais il y a aussi un nombre suffisant de clients pour lesquels la situation se dĂ©tĂ©riorerait considĂ©rablement.
En fin de compte, nous avons fait plusieurs choses importantes :
- Nous avons Ă©valuĂ© la performance attendue des requĂȘtes des clients dans le cloud via le proxy CDN.
- Nous avons obtenu des données de véritables clients, de tous types d'appareils.
- Nous avons compris que la théorie ne s'est pas confirmée à 100 % et que la proposition initiale de proxy CDN ne fonctionnera pas pour nous.
- Nous n'avons pas pris de risques â nous n'avons pas modifiĂ© les configurations de production pour les clients.
- Nous n'avons rien cassé.
Prototype 2.0
Ainsi, nous retournons au tableau noir et recommençons le processus.
L'idĂ©e est que, au lieu de 100 % de proxy, pour chaque client, nous dĂ©finissons le chemin le plus rapide et dirigeons les requĂȘtes vers celui-ci â c'est ce qu'on appelle le client steering.

Comment la mettre en Ćuvre ? Nous ne pouvons pas utiliser la logique cĂŽtĂ© serveur, car l'objectif est de se connecter Ă ce serveur. Il faut donc le faire d'une maniĂšre ou d'une autre cĂŽtĂ© client. L'idĂ©al serait de le rĂ©aliser avec un minimum de logique complexe pour Ă©viter de devoir rĂ©soudre des problĂšmes d'intĂ©gration avec de nombreuses plateformes client.
La réponse est l'utilisation de DNS. Dans notre cas, nous avons notre propre infrastructure DNS, et nous pouvons configurer une zone de domaine pour laquelle nos serveurs seront autoritatifs. Cela fonctionne comme suit :
- Le client effectue une requĂȘte au serveur DNS en utilisant l'hĂŽte, par exemple api.netflix.com.
- La requĂȘte arrive sur notre serveur DNS
- Le serveur DNS connaĂźt le chemin le plus rapide pour ce client et fournit l'adresse IP correspondante.
Il y a une complexité supplémentaire dans la solution : les fournisseurs DNS autoritatifs ne voient pas l'adresse IP du client et ne peuvent considérer que l'adresse IP du résolveur récursif utilisé par le client.
En fin de compte, notre résolveur autoritatif doit prendre des décisions non pas pour un client individuel, mais pour un groupe de clients en fonction du résolveur récursif.
Pour rĂ©soudre ce problĂšme, nous utilisons les mĂȘmes Ă©chantillons, nous agrĂ©geons les rĂ©sultats de mesure des clients pour chaque rĂ©solveur rĂ©cursif et dĂ©cidons oĂč diriger ce groupe - Ă travers un proxy via IX en utilisant TCP Anycast, Ă travers un proxy ISP ou directement dans le cloud.
Nous obtenons ainsi un systĂšme :

Le modĂšle de DNS steering obtenu permet de diriger les clients sur la base des observations historiques de la vitesse des connexions des clients au cloud.
Encore une fois, la question est de savoir dans quelle mesure cette approche sera efficace ? Pour rĂ©pondre, nous utilisons Ă nouveau notre systĂšme d'Ă©chantillonnage. Ainsi, nous configurons une configuration de mise Ă jour, oĂč une des cibles suit la direction du DNS steering, l'autre se dirige directement vers le cloud (production actuelle).

En définitive, nous comparons les résultats et obtenons une évaluation de l'efficacité :

Finalement, nous avons appris plusieurs choses importantes :
- Nous avons Ă©valuĂ© la performance attendue des requĂȘtes des clients vers le cloud en utilisant DNS Steering.
- Nous avons obtenu des données de véritables clients, de tous types d'appareils.
- Nous avons prouvé l'efficacité de l'idée proposée.
- Nous n'avons pas pris de risques â nous n'avons pas modifiĂ© les configurations de production pour les clients.
- Nous n'avons rien cassé.
Maintenant, sur la partie complexe - nous lançons en production.
Le plus facile est maintenant derriĂšre nous : nous avons un prototype fonctionnel. La partie difficile consiste dĂ©sormais Ă dĂ©ployer la solution pour tout le trafic de Netflix, Ă la rendre opĂ©rationnelle pour 150 millions d'utilisateurs, des milliers d'appareils, des centaines de microservices et des produits et infrastructures en constante Ă©volution. Les serveurs de Netflix reçoivent des millions de requĂȘtes par seconde, et il est facile de casser le service par une action inattentive. ParallĂšlement, nous souhaitons rediriger dynamiquement le trafic Ă travers des milliers de serveurs CDN, sur Internet, oĂč tout change et se casse constamment au pire moment.
Et avec tout cela, l'équipe compte 3 ingénieurs responsables du développement, du déploiement et de la maintenance complÚte du systÚme.
C'est pourquoi nous allons maintenant parler d'un sommeil calme et sain.
Comment poursuivre le développement sans passer tout son temps à maintenir ? Notre approche repose sur 3 principes :
- Nous réduisons le potentiel d'ampleur des pannes (blast radius).
- Nous nous préparons aux surprises - nous nous attendons à ce que quelque chose casse, malgré les tests et l'expérience personnelle.
- DĂ©gradation progressive (graceful degradation) - si quelque chose ne fonctionne pas, cela doit ĂȘtre rĂ©parĂ© automatiquement, mĂȘme de maniĂšre moins efficace.
Il s'est avĂ©rĂ© que, dans notre cas, avec cette approche du problĂšme, nous pouvons trouver une solution simple et efficace et simplifier considĂ©rablement la maintenance du systĂšme. Nous avons compris que nous pouvions ajouter un petit morceau de code dans le client et surveiller les erreurs des requĂȘtes rĂ©seau causĂ©es par des problĂšmes de connexion. En cas d'erreurs rĂ©seau, nous effectuons un fallback directement dans le cloud. Cette solution n'exige pas d'efforts significatifs de la part des Ă©quipes clientes, mais rĂ©duit considĂ©rablement les risques de pannes inattendues et de surprises pour nous.
Ăvidemment, malgrĂ© le fallback, nous suivons tout de mĂȘme une discipline stricte durant le dĂ©veloppement :
- Test des échantillons.
- Tests A/B ou Canaries.
- Déploiement progressif (progressive rollout).
Pour les échantillons, l'approche a été décrite - les changements sont d'abord testés à l'aide d'une recette configurée.
Pour les tests canary, nous avons besoin de paires de serveurs comparables, sur lesquelles nous pouvons comparer le fonctionnement du systÚme avant et aprÚs les modifications. Pour ce faire, à partir de nos nombreux sites CDN, nous faisons un échantillon de paires de serveurs qui reçoivent un trafic comparable :

Ensuite, nous déployons la version modifiée sur les serveurs Canary. Pour évaluer les résultats, nous exécutons un systÚme qui compare environ 100 à 150 métriques à partir d'un échantillon de serveurs de contrÎle :

Si le test Canary est rĂ©ussi, nous procĂ©dons au dĂ©ploiement de maniĂšre progressive, par vagues. Sur chaque site, nous ne mettons pas Ă jour les serveurs simultanĂ©ment â la perte d'un site entier en cas de problĂšme a un impact plus significatif sur le service pour les utilisateurs que la perte d'une quantitĂ© Ă©quivalente de serveurs, mais Ă diffĂ©rents endroits.
Dans l'ensemble, l'efficacitĂ© et la sĂ©curitĂ© de cette approche dĂ©pendent de la quantitĂ© et de la qualitĂ© des mĂ©triques recueillies. Pour notre systĂšme d'accĂ©lĂ©ration des requĂȘtes, nous collectons des mĂ©triques provenant de tous les composants possibles :
- des clients â le nombre de sessions et de requĂȘtes, les taux de secours ;
- proxy â les statistiques concernant le nombre et le temps des requĂȘtes ;
- DNS â le nombre et les rĂ©sultats des requĂȘtes ;
- cloud edge â le nombre et le temps de traitement des requĂȘtes dans le cloud.
Tout cela est intégré dans un pipeline unique, et, selon les besoins, nous décidons quelles métriques envoyer pour l'analyse en temps réel, et lesquelles vers Elasticsearch ou Big Data pour un diagnostic plus détaillé.
Surveillance

Dans notre cas, nous apportons des modifications sur le chemin critique des requĂȘtes entre le client et le serveur. L'ensemble des diffĂ©rents composants sur le client, le serveur et le chemin Ă travers Internet est immense. Les modifications sur le client et le serveur se produisent en permanence â en raison du travail de dizaines d'Ă©quipes et des changements naturels dans l'Ă©cosystĂšme. Nous sommes au milieu â lors du diagnostic des problĂšmes, il y a une forte probabilitĂ© que nous y soyons impliquĂ©s. Par consĂ©quent, nous devons comprendre clairement comment dĂ©finir, collecter et analyser les mĂ©triques pour une localisation rapide des problĂšmes.
IdĂ©alement â un accĂšs complet Ă tous les types de mĂ©triques et filtres en temps rĂ©el. Mais il y a beaucoup de mĂ©triques, donc le coĂ»t devient une question. Dans notre cas, nous segmentons les mĂ©triques et les outils de dĂ©veloppement de la maniĂšre suivante :

Pour la dĂ©tection et le triage des problĂšmes, nous utilisons notre propre systĂšme en temps rĂ©el Ă code source ouvert et â pour la visualisation. Il stocke des mĂ©triques agrĂ©gĂ©es en mĂ©moire, est fiable et s'intĂšgre Ă un systĂšme d'alerte. Pour la localisation et le diagnostic, nous avons accĂšs aux journaux d'Elasticsearch et Kibana. Pour l'analyse statistique et la modĂ©lisation, nous utilisons les big data et la visualisation dans Tableau.
Il semble qu'il soit trĂšs difficile de travailler avec une telle approche. Cependant, grĂące Ă une organisation hiĂ©rarchique des mĂ©triques et des outils, nous pouvons rapidement analyser le problĂšme, dĂ©terminer le type de problĂšme, puis approfondir les mĂ©triques dĂ©taillĂ©es. En moyenne, nous mettons environ 1 Ă 2 minutes pour identifier la source de la panne. Ensuite, nous travaillons dĂ©jĂ avec une Ă©quipe spĂ©cifique sur le diagnostic â cela peut prendre de dizaines de minutes Ă plusieurs heures.
MĂȘme si le diagnostic est rapide, nous ne voulons pas que cela se produise souvent. IdĂ©alement, nous ne devrions recevoir des alertes critiques que lorsque cela a un impact significatif sur le service. Pour notre systĂšme d'accĂ©lĂ©ration des requĂȘtes, nous n'avons que 2 alertes qui nous notifieront :
- pourcentage de Client Fallback â Ă©valuation du comportement des clients;
- pourcentage d'erreurs Probe â donnĂ©es de stabilitĂ© des composants rĂ©seau.
Ces alertes critiques surveillent si le systĂšme fonctionne pour la majoritĂ© des utilisateurs. Nous regardons combien de clients ont utilisĂ© le fallback s'ils n'ont pas pu bĂ©nĂ©ficier de l'accĂ©lĂ©ration des requĂȘtes. En moyenne, nous avons moins d'une alerte critique par semaine, bien que de nombreux changements surviennent dans le systĂšme. Pourquoi cela nous suffit-il ?
- Il existe un fallback client si notre proxy ne fonctionne pas.
- Il y a un systÚme de steering automatique qui réagit aux problÚmes.
Parlons davantage de ce dernier. Notre systĂšme de probes et notre systĂšme de dĂ©tection automatique du chemin optimal pour les requĂȘtes clients vers le cloud permettent de gĂ©rer automatiquement certains problĂšmes.
Revenons Ă notre configuration des probes et aux 3 catĂ©gories de chemins. Au-delĂ du temps de chargement, nous pouvons aussi observer la simple livraison. Si les donnĂ©es ne peuvent pas ĂȘtre chargĂ©es, en examinant les rĂ©sultats sur diffĂ©rents chemins, nous pouvons dĂ©terminer oĂč et quoi s'est cassĂ©, et si nous pouvons le rĂ©parer automatiquement en changeant le chemin de la requĂȘte.
Exemples :



Ce processus peut ĂȘtre automatisĂ©. L'intĂ©grer dans le systĂšme de steering. Et l'apprendre Ă rĂ©agir aux problĂšmes de performance et de fiabilitĂ©. Si quelque chose commence Ă se casser â rĂ©agir, s'il existe une meilleure option. Dans ce cas, la rĂ©action instantanĂ©e n'est pas critique, grĂące au fallback sur les clients.
Ainsi, les principes de support du systĂšme peuvent ĂȘtre formulĂ©s de la maniĂšre suivante :
- nous réduisons l'ampleur des pannes;
- nous collectons des métriques;
- nous réparons automatiquement les pannes, si nous le pouvons;
- si nous ne le pouvons pas â nous notifions;
- Nous travaillons sur des tableaux de bord et un ensemble d'outils de triage pour une réaction rapide.
Leçons tirées
Il ne faut pas beaucoup de temps pour Ă©crire un prototype. Dans notre cas, il Ă©tait prĂȘt en seulement 4 mois. Avec celui-ci, nous avons obtenu de nouvelles mĂ©triques, et 10 mois aprĂšs le dĂ©but du dĂ©veloppement, nous avons reçu notre premier trafic de production. Ensuite, un travail pĂ©nible et trĂšs complexe a commencĂ© : il a fallu progressivement industrialiser et mettre Ă l'Ă©chelle le systĂšme, migrer le trafic principal et apprendre de nos erreurs. Ce processus efficace ne sera pas linĂ©aire â malgrĂ© tous les efforts, tout ne peut pas ĂȘtre prĂ©vu. Une itĂ©ration rapide et une rĂ©action aux nouvelles donnĂ©es sont beaucoup plus efficaces.

D'aprÚs notre expérience, nous pouvons conseiller ce qui suit :
- Ne faites pas confiance Ă votre intuition.
Notre intuition nous a souvent induits en erreur, malgré l'immense expérience des membres de l'équipe. Par exemple, nous avons mal prédit l'accélération attendue avec l'utilisation de proxys CDN, ou le comportement de TCP Anycast.
- Obtenez des données de production.
Il est important d'accĂ©der le plus rapidement possible Ă au moins une petite quantitĂ© de donnĂ©es de production. Il est pratiquement impossible d'obtenir le nombre de cas uniques, de configurations et de rĂ©glages dans des conditions de laboratoire. Un accĂšs rapide aux rĂ©sultats permettra d'ĂȘtre informĂ© plus rapidement des problĂšmes potentiels, pour les prendre en compte dans l'architecture du systĂšme.
- Ne suivez pas les conseils et les rĂ©sultats des autres â collectez vos propres donnĂ©es.
Suivez les principes de collecte et d'analyse des donnĂ©es, mais ne prenez pas aveuglĂ©ment les rĂ©sultats et les affirmations des autres. Vous seul pouvez savoir ce qui fonctionne pour vos utilisateurs. Vos systĂšmes et vos clients peuvent ĂȘtre trĂšs diffĂ©rents de ceux d'autres entreprises. Heureusement, les outils d'analyse sont maintenant facilement accessibles et faciles Ă utiliser. Les rĂ©sultats que vous obtenez peuvent ne pas correspondre Ă ce que des entreprises comme Netflix, Facebook, Akamai et d'autres affirment. Dans notre cas, les performances TLS, HTTP2 ou les statistiques sur les requĂȘtes DNS diffĂšrent des rĂ©sultats de Facebook, Uber, Akamai â car nous avons d'autres appareils, clients et flux de donnĂ©es.
- Ne courez pas aprÚs des tendances à la mode sans nécessité et évaluation de l'efficacité.
Commencez par le simple. Il est préférable de créer un systÚme de travail simple dans un court laps de temps que de passer énormément de temps à développer des composants inutiles. Résolvez des tùches et des problÚmes qui sont importants sur la base de vos mesures et résultats.
- Préparez-vous aux nouvelles applications.
Tout comme il est difficile de prĂ©voir tous les problĂšmes, il est tout aussi difficile d'anticiper les avantages et les applications. Prenez exemple sur les startups : leur capacitĂ© Ă s'adapter aux besoins des clients. Dans votre cas, vous pouvez dĂ©couvrir de nouveaux problĂšmes et leurs solutions. Dans notre projet, nous avons visĂ© Ă rĂ©duire la latence des requĂȘtes. Cependant, au cours de notre analyse et de nos discussions, nous avons compris que nous pouvions Ă©galement utiliser des serveurs proxy :
- pour équilibrer le trafic à travers les régions AWS et réduire les coûts ;
- pour modéliser la stabilité du CDN ;
- pour configurer le DNS ;
- pour configurer le TLS/TCP.
Conclusion
Dans ma prĂ©sentation, j'ai dĂ©crit comment Netflix aborde le problĂšme d'accĂ©lĂ©ration des requĂȘtes Internet entre les clients et le cloud. Comment nous collectons des donnĂ©es Ă l'aide d'un systĂšme de sondes sur les clients, et utilisons les donnĂ©es historiques recueillies pour diriger les requĂȘtes de production des clients par le chemin le plus rapide sur Internet. Comment nous utilisons les principes de fonctionnement des protocoles rĂ©seau, notre infrastructure CDN, notre rĂ©seau backbone, et nos serveurs DNS pour atteindre cet objectif.
Cependant, notre solution n'est qu'un exemple de la façon dont nous avons mis en Ćuvre un tel systĂšme chez Netflix. Ce qui a fonctionnĂ© pour nous. La partie pratique de mon exposĂ© pour vous concerne les principes de dĂ©veloppement et de support que nous suivons et qui nous permettent d'obtenir de bons rĂ©sultats.
Notre solution Ă ce problĂšme peut ne pas convenir Ă votre cas. Cependant, les thĂ©ories et les principes de dĂ©veloppement restent valables, mĂȘme si vous n'avez pas votre propre infrastructure CDN, ou si elle diffĂšre considĂ©rablement de la nĂŽtre.
L'importance de la vitesse des requĂȘtes pour l'entreprise demeure. MĂȘme pour un service simple, il faut faire des choix : entre les fournisseurs « cloud », l'emplacement des serveurs, les fournisseurs de CDN et de DNS. Votre choix influencera l'efficacitĂ© des requĂȘtes Internet pour vos clients. Il est important que vous mesuriez et compreniez cette influence.
Commencez par des solutions simples, prenez soin de maniÚre dont vous modifiez le produit. Apprenez en cours de route et améliorez le systÚme sur la base des données de vos clients, de votre infrastructure et de votre entreprise. Pensez à la possibilité de pannes inattendues lors de la conception. Ainsi, vous pourrez accélérer votre processus de développement, améliorer l'efficacité de la solution, éviter une surcharge de support et dormir sur vos deux oreilles.
Cette annĂ©e en format en ligne. Vous pourrez poser des questions Ă l'un des pĂšres de DevOps, le mĂȘme John Willis !
Source : habr.com
