Ce qui a duré quatre ans, le moteur de Dropbox avec Rust récrire le code de base

GO bibliothèques d'outils de langage open source, la recherche iOS et Android développement C ++ multi-plateforme, il faut cinq ans pour inverser la migration du nuage vers la plate-forme de centre de données ... Dropbox technologie jamais arrêt « frustrant. » Aujourd'hui, l'entreprise a passé quatre ans à réécrire le code moteur central synchronisation interne la plus ancienne et la plus importante.

Dropbox prend quatre ans pour la reconstruction complète

Au cours des quatre dernières années, nous avons essayé de reconstruire le moteur de synchronisation de client de bureau Dropbox, qui est une technologie importante derrière le dossier Dropbox, Dropbox est le plus ancien et l'un des plus importants du code. Après quatre années d'efforts, nous avons lancé un nouveau moteur de synchronisation avec écriture Rust (nom de code « Nucleus ») à tous les utilisateurs Dropbox.

moteur de synchronisation est difficile Rewrite, nous ne voulons pas célébrer aveuglément la sortie d'une nouvelle version du moteur de synchronisation, car dans de nombreux scénarios, la réécriture est une mauvaise idée. Cependant, il se trouve, pour réécrite Dropbox est une bonne idée, mais seulement parce que nous considérons que le processus était très complet. Nous allons partager réécrire la question de savoir comment envisager un logiciel important dans cet article, et a souligné que le projet a la clé du succès de l'initiative, par exemple, a un modèle de données très propre.

Reconstruction a refusé de concéder la défaite: trop de problèmes

En 2008, la synchronisation Dropbox pour la première fois entré dans la phase de test. Les utilisateurs installent l'application Dropbox, Dropbox crée un dossier sur leur ordinateur, tant que le fichier est enregistré dans ce dossier, vous pouvez les synchroniser au serveur Dropbox et d'autres utilisateurs de l'appareil. serveur Dropbox peut être en permanence et stocker en toute sécurité des fichiers, et ces fichiers peuvent également être connectés via l'accès Internet partout.

Autrement dit, le moteur de réside la synchronisation sur l'ordinateur, l'utilisateur responsable des fichiers de téléchargement et le téléchargement à une coordination du système de fichiers à distance.

Synchronisation à grande échelle est difficile

Notre premier moteur de synchronisation appelé « Sync Engine » (ce qui signifie « moteur de synchronisation classique »), il y a quelques problèmes fondamentaux de son modèle de données, ces problèmes ne se manifestera dans le cas massif, de sorte que progressive amélioration de style impossible.

Les systèmes distribués sont difficiles

À l'échelle uniquement de Dropbox, la construction de systèmes distribués est lui-même une tâche difficile. En dehors de l'échelle d'origine de côté, la synchronisation de fichiers est un problème de système distribué unique, car permet au client de hors ligne pendant de longues périodes, et de coordonner leurs modifications lors de retour en ligne. Pour de nombreux algorithmes pour les systèmes distribués, les partitions du réseau sont des exceptions, mais pour nous, il est pratique courante.

Il est important de traiter correctement: la confiance des utilisateurs Dropbox, et leur contenu le plus précieux confiés à Dropbox, par conséquent, Dropbox doit assurer la sécurité du contenu, ce qui est non négociable. Cependant, il y a beaucoup de cas extrêmes de synchronisation dans les deux sens, persistants que Assurez-vous de ne pas supprimer ou détruire les données sur le serveur est beaucoup plus difficile. Par exemple, Sync Engine Classic « move » représente une paire de fonctionnement: un « Supprimer » dans l'ancien emplacement et le fonctionnement « ajouter » au nouvel emplacement. Si une panne de réseau se produit, l'opération de suppression sera effectuée, mais l'opération correspondante n'a pas été ajouté. Ensuite, l'utilisateur trouvera des fichiers manquants apparaissent sur les serveurs et autres équipements, même si elles se déplacent seulement au niveau local et les opérations de fichiers.

La persistance est difficile à maintenir

L'objectif de Dropbox est: quelle que soit la configuration de l'ordinateur de l'utilisateur, peut « travailler ». Nous soutenons de Windows, MacOS et Linux, ces plates-formes ont une grande variété de systèmes de fichiers, et le comportement de tous ces systèmes de fichiers sont légèrement différents. Au niveau du système d'exploitation et le matériel sont très différents, sans parler de l'utilisateur installera différentes extensions du noyau ou pilote pour modifier le comportement du système d'exploitation. Et au-dessus de Dropbox, une application utilisant le système de fichiers d'une manière différente, et il repose sur son comportement ne peut en fait partie de la spécification.

Pour assurer la pérennité d'un environnement particulier, nous devons comprendre sa mise en uvre, parfois même lors du débogage des problèmes de production, l'ingénierie inverse. Ces questions touchent généralement un grand nombre d'utilisateurs, et une erreur de système de fichiers rares peuvent affecter seulement une petite fraction des utilisateurs. Par conséquent, du point de vue de l'échelle, être en mesure de « travail » dans la plupart des environnements et offrent une durabilité forte de garantie, il est fondamentalement opposé.

File test synchronisation difficile

Avec une base d'utilisateurs assez grand, presque toutes les choses théoriquement possible qui peut se produire dans un environnement de production. problèmes de débogage dans l'environnement de production que le débogage des problèmes dans l'environnement de développement est beaucoup plus cher, surtout pour les logiciels en cours d'exécution sur le périphérique de l'utilisateur concerné. Par conséquent, avant la production de masse, il est essentiel de retour de capture par les tests automatisés.

Cependant, les tests du moteur de synchronisation est difficile, car les combinaisons possibles de l'état des fichiers et des actions de l'utilisateur est un chiffre astronomique. Un dossier partagé peut avoir des milliers de membres, chaque membre a un moteur de synchronisation qui a une connexion différente, ainsi que vue à jour un système de fichiers Dropbox. Chaque utilisateur peut avoir des changements locaux en attente de téléversement, et ils peuvent différer de la partie du serveur de programme pour télécharger le fichier. Par conséquent, le système a beaucoup « instantané » possible donc, qui doivent tous être testés.

Le nombre pris du bon fonctionnement de l'état du système est également très grande. Est un processus de synchronisation de fichiers hautement simultanée, les utilisateurs peuvent télécharger et télécharger plusieurs fichiers en même temps. La synchronisation peut se rapporter à un seul bloc de contenu de transmission parallèle de fichier, le contenu écrit sur le disque ou à partir du système de fichiers local. Des tests approfondis doit essayer différentes séquences de ces opérations, afin d'assurer des erreurs de concurrence dans notre système n'existe pas.

La synchronisation est difficile de préciser le comportement

Enfin, il est souvent difficile de définir précisément le moteur de synchronisation de comportement correct. Par exemple, considérons un cas: Supposons que nous ayons trois dossiers, un dossier qui est imbriqué dans un autre dossier.

Alberto en supposant que les utilisateurs et Béatrice, ils utilisent ce dossier en mode hors connexion. Alberto sera dossier « Archives » dans le dossier « Janvier », et Béatrice dossier « Brouillons » dans le dossier « Archives ».

Quand ils se reconnectent au réseau ce qui se passerait? Si l'application directe de ces étapes, notre figure de système de fichiers sera un cycle: dossier répertoire parent « Archives » dossier « brouillons », « Brouillons » dossier est le dossier de répertoire parent « Janvier », le dossier de répertoire parent « Janvier » dossier « Archives ».

Dans ce cas, quel est l'état du système final correct? Sync Engine copier chaque dossier et fusion arborescence Alberto Bratice. Utilisez Nuclues, nous conservons le répertoire d'origine, la séquence finale dépend du moteur de synchronisation pour télécharger leurs opérations mobiles.

Dans un cas simple ce trois dossiers et deux actions, Nucleus a un état final satisfaisant. Mais comment pouvons-nous préciser le comportement de synchronisation en général, et non se noient dans une série de cas de coin il?

Annotation: coin de cas (cas d'angle), ou des cas pathologiques (cas pathologique) fait référence au problème ou d'une situation dans laquelle les paramètres de fonctionnement en dehors de la plage normale, et la plupart de plusieurs variables ou conditions environnementales dans le cas des valeurs extrêmes, même ces deux extrêmes sont encore des paramètres dans les spécifications (ou frontière), il peut être considéré comme un cas d'angle.

Par exemple, un haut-parleur retentit son déformé, mais semble au volume maximum, maximum et basse humidité élevée. Ou dans le cas d'un serveur sera instable, mais la condition est à 64 microprocesseur auxiliaire, mémoire pour le maximum est de 512 Gigabyte, alors que la ligne de temps sur un million d'utilisateurs est instable, ce sont des cas d'angle.

coins de cas et les bords des différents cas, seules les conditions aux limites variable unique pour le maximum ou minimum. Si un son haut-parleur aussi longtemps que le volume maximum, indépendamment du fait que les autres conditions sont normales ou extrêmes, le son sera déformé, ce qui est un cas limite.

Comment résoudre ces problèmes?

À grande échelle est difficile de fichiers synchroniser. En 2016, nous avons une bonne solution à ce problème. Nous avons des centaines de millions d'utilisateurs, tels que Smart Sync nouvelles fonctionnalités du produit, il y a une solide équipe d'experts développe synchrone. Sync Engine Après des années d'amélioration de la production, a passé beaucoup de temps pour trouver et corriger les erreurs plus communes.

Joel Spolsky a dit récrire le code à partir de zéro est « Les sociétés de logiciels sont susceptibles de commettre la plus grave erreur stratégique. » Pour les caractéristiques de ré-écriture avec succès complet souvent souhaitable de ralentir la vitesse du développement, parce que les progrès réalisés sur les anciens besoins du système à être porté sur le nouveau système. Bien sûr, il y a beaucoup de projets orientés vers l'utilisateur, nos ingénieurs peuvent être synchronisés.

Bien que Sync Engine succès, mais très malsain. Dans le processus de construction d'une Smart Sync, nous faisons le système beaucoup d'améliorations supplémentaires, nettoyons le code pauvre, et l'interface refactoring, et même ajouté une annotations de type Python. Nous avons ajouté un certain nombre de technologies de télémétrie, et la mise en place des procédures pour assurer le maintien d'un coffre-fort et simple. Cependant, ces améliorations progressives ne suffit pas.

Toute modification apportée à la prestation de comportement synchronisation besoin d'être difficiles à déployer, et nous trouvons encore des incohérences dans la production complexe. L'équipe doit tout laisser tomber, diagnostiquer et résoudre les problèmes, puis prendre le temps de rendre leurs applications à restaurer bon état. Même si nous avons une solide équipe d'experts, mais laissez-les ingénieurs d'intégrer dans le nouveau système prendre encore plusieurs années. Enfin, nous avons investi beaucoup de temps pour améliorer les performances, mais n'a pas réussi à augmenter de manière significative le nombre total de moteur de synchronisation de fichiers peut gérer.

Il y a quelques causes profondes de ces problèmes, mais le plus important est le moteur de synchronisation classique modèle de données. Un modèle de données ne sont pas partagées, monde de conception plus simple, et le fichier est manquant identifiant de stable qui peut être maintenu dans le processus de déplacement. Nous allons prendre des heures pour déboguer théoriquement possibles, mais « très peu probable » apparaît dans un des problèmes de l'environnement de production. Changer ne peuvent généralement pas être atteint les noms de base d'un système, et bientôt nous aurons aucune méthode efficace d'améliorations supplémentaires.

En second lieu, le système n'a pas été conçu pour la testabilité et le design. Nous comptons sur la libération lente et sur place des problèmes de débogage, plutôt que les tests pré-version automatisée. Sync Engine permet des moyens de modèle de données que nous ne pouvons pas être trop de contrôles dans un test de stress, car il y a beaucoup de résultat impopulaire mais toujours valable, nous ne pouvons pas dire. Avoir un modèle de données une forte liaison invariants (invariant serré) pour le test est très utile, car vérifier si le système est actif est toujours une chose très facile à faire.

Nous avons d'abord discuté pourquoi la synchronisation est un des problèmes de concurrence, et le test et le débogage du code concurrent est notoirement difficile. Sync Engine classique de l'architecture à base de fil qui ne sont pas utilisés du tout. Il toutes les décisions de planification sont remis au système d'exploitation, ce qui rend les tests d'intégration ne devient pas reproductible. Dans la pratique, nous nous retrouvons à l'aide très serrure à gros grains de longue date. Bien que cette architecture sacrifier les avantages du parallélisme, mais qui rend le système plus facile à raisonner.

Avant rewrite, comment évaluer les besoins?

Décidons de réécrire des raisons raffinées une ré-écriture sur la liste, il peut aider à prendre de telles décisions dans d'autres systèmes.

Avez-vous épuisé méthode d'amélioration progressive? 1, si vous avez essayé de reconstruire le module de code pour le mieux?

La mauvaise qualité du code lui-même ne constitue pas une raison importante de réécrire le système. Renommer les variables et déverrouiller le module peut être étroitement liée à des améliorations progressives pour terminer, nous avons passé beaucoup de temps dans Sync Engine pour remplir ces tâches. la nature dynamique de Python peut rendre difficile, par conséquent, nous avons ajouté des notes MyPy, afin de saisir progressivement plus d'erreurs au moment de la compilation. Cependant, le système primitif de base reste inchangé, car la reconstruction seule ne modifie pas le modèle de données sous-jacentes.

2, vous essayez d'améliorer les performances en optimisant?

Software passent habituellement la plupart du temps de très peu de code. De nombreux problèmes de performance ne sont pas des problèmes fondamentaux, optimize analyseur de point chaud est un bon moyen d'identifier une amélioration progressive des performances. Pendant des mois, l'équipe a été engagée dans les aspects du travail et de performance de l'échelle, ils ont fait de grandes réalisations dans l'amélioration du contenu de la performance de transfert de fichiers. Cependant, l'empreinte mémoire améliorée (par exemple en augmentant le nombre de système de fichiers peut gérer) restent insaisissables.

3, vous pouvez fournir plus de valeur?

Même si vous décidez de réécrire, vous pouvez augmenter la valeur pour réduire le risque? Ceci permettra de vérifier les décisions techniques au début, pour aider à maintenir l'élan des projets de développement, et d'alléger les souffrances causées par les caractéristiques du développement lent.

Vous pouvez réécrire?

1, si vous êtes une profonde compréhension et le respect du système actuel?

Ecrire un nouveau code que de comprendre le code existant beaucoup plus facile. Ainsi, avant la réécriture, vous avez une profonde compréhension et de respect pour le système « classique ». Ceci est la raison de l'existence de toute votre équipe et d'affaires, il fonctionne dans un environnement de production par l'accumulation d'années de sagesse. Faire des recherches archéologiques, comprendre pourquoi tout cela est ainsi.

2. Avez-vous le temps?

système Rewrite à partir de zéro est un travail difficile, mais aussi pour obtenir la gamme complète de fonctionnalités prend beaucoup de temps. Ces ressources avez-vous? Votre organisation est assez bonne santé pour soutenir un tel projet d'envergure?

3, vous pouvez accepter un taux de développement plus lent des caractéristiques font?

Nous ne sommes pas arrêter complètement le développement de moteur de synchronisation classique caractéristique, mais tous les changements de l'ancien système sera la ligne d'arrivée du nouveau système va pousser plus loin. Nous avons décidé de fournir certains éléments, sans glisser réécrire l'équipe, nous devons guider consciemment l'allocation des ressources pour publier ces articles. Nous avons également la technologie Sync Engine télémétrique fait des investissements importants afin de maintenir les coûts d'entretien de l'homéostasie au minimum.

Quel est votre objectif?

1. Pourquoi est-mieux la deuxième fois?

Si vous êtes loin, vous avez une connaissance approfondie des systèmes existants, ainsi que des leçons à tirer. Cependant, il devrait Réécrire conduit par l'évolution des besoins ou des besoins d'affaires. Nous avons expliqué comment le changement de synchronisation de fichiers dans ce qui précède, cependant, nous avons décidé de réécrire également de nature prospective. Les utilisateurs de Dropbox comprennent la collaboration croissante dans le travail a besoin de construire de nouvelles fonctionnalités pour les utilisateurs ont besoin d'un moteur de synchronisation flexible, robuste.

2. Quel est votre principe du nouveau système est?

Pour une équipe, à partir de zéro est une excellente occasion de remodeler la culture de la technologie. Étant donné que nous exploitons Sync Engine expérience classique, nous sommes très stressée dès le début, les tests, le débogage et l'exactitude du codage de tous ces principes dans le modèle de données. Nous sommes au début du cycle de vie du projet d'écrire ces principes, ils reviennent encore et encore pour apporter leur propre.

Nous Rouille Réécrire le code de base

Enfin, nous utilisons Rust a écrit Nucleus. Pour notre équipe, je parie que la rouille est l'une des meilleures décisions que nous avons fait. En plus de la performance, la justesse de son attention pour nous aider à surmonter la complexité de la synchronisation. Nous pouvons être dans le système de invariants type de système de codage complexe, et laisser le compilateur vérifie les pour nous.

La quasi-totalité de notre code dans un thread ( « fil de contrôle ») pour fonctionner sur, et utiliser la bibliothèque dans la planification à terme Rouille de nombreuses opérations simultanées sur ce fil. Nous ne travaillons que simplement le passage à d'autres threads en cas de besoin: le réseau boucle d'événement IO pour calculer le grand travail des frais généraux, tels que le hachage du pool de threads, système de fichiers IO à un thread dédié. Cela réduit considérablement la portée et la complexité du développeur lors de l'ajout de nouvelles fonctionnalités qui doivent être pris en compte.

Et quand les décisions d'ordonnancement de threads de contrôle d'entrée sont fixes dont il est conçu pour être entièrement déterminée. Nous utilisons cette propriété, avec un test de simulation pseudo-aléatoire, il floue. Graine générateur de nombres aléatoires, on peut générer un état initial aléatoire du système de fichiers, des troubles du calendrier et du système, et laisser tourner le moteur à l'état d'achèvement. Ensuite, si nous ne vérifions pas l'exactitude de toute synchronisation, on peut toujours reproduire l'erreur à partir des graines d'origine. Chaque jour, nous courons une variété de scénarios à des millions dans l'infrastructure de test.

Nous avons repensé le client - protocole de serveur, il a une consistance solide. L'accord assure le serveur et le client ont la même vue du fichier distant avant d'envisager des modifications. dossiers et fichiers partagés à l'échelle mondiale identifiant unique, le client ne les a jamais observé en copie temporaire ou perte de statut. Maintenant, nous avons eu des contrôles solides de cohérence entre vue du système de fichiers à distance du client et le serveur, les différences sont fausses.

Huawei a perdu, IPO Cambrian quelque chose de lourd « coeur »
Précédent
Dextension d'expansion, en plus de l'architecte d'expansion peut faire?
Prochain
Chaque fois que je veux abandonner Scala, j'écris Python et Java
Softbank énorme perte de 1,35 billions de yens, a promis de rembourser Alibaba stock
Prise de chats errants qui trouvent! Ou travaillé dans le garage souterrain à fléchette pratique, et les hommes multi-animaux de compagnie cellulaire poison
enregistrement nom réel, ce qui limite bateau, un après l'autre pour la gestion de bateau parc municipal « voile »
Nock la partie orientale de la rénovation Grande Muraille a commencé, ici sont concernés ALICE
3740 cigarettes contrefaites, d'une valeur 960000 Xiaolan a arrêté cinq personnes qui vendent des cigarettes contrefaites
Sud + bus tôt le matin | Foire de Canton en ligne, long sciés à la fin?
Pas de rebondissement! Publié officiellement le nouvel iPhone SE, 3299 yuans en vente vendredi prochain
Constamment mis à jour | 5 minutes et 24 experts de haut nationaux vous amène à comprendre comment le cancer
Pour vous joindre à l'équipe nationale de plongeon, Grand Park trésor « fromage vers le haut » pour la santé de l'huile chinoise
mer Lima
À venir! Mettre en place 26 stations, plus d'accès direct à la ville, cette construction de la ligne ferroviaire est entré dans une nouvelle étape, une partie de la section est attendue pour la fin d