La Full Stack Week se consacre avant tout à la manière dont les développeurs adoptent la puissance du réseau Cloudflare pour développer des applications à l'échelon mondial par défaut. La promesse de Workers ne se limite pas à une amélioration de la latence : elle repose sur des paradigmes de programmation fondamentalement différents, permettant de faciliter la vie des développeurs et d'accroître la résilience des applications.
L'année dernière, nous avons annoncé le lancement de Durable Objects, notre approche visant à coordonner les états des Workers exécutés en périphérie du réseau Cloudflare. La solution Durable Objects permet aux développeurs de mettre en œuvre des applications autrefois complexes, comme des applications collaboratives de saisie d'informations (whiteboarding), des serveurs de jeu ou des files d'attente mondiale, en tout juste quelques lignes de code.
Nous annonçons aujourd'hui la mise en disponibilité générale de la solution Durable Objects, ainsi que son entrée en production. N'hésitez pas à l'utiliser !
En quoi la solution Durable Objects est-elle si efficace ?
Pour de nombreuses applications traditionnelles, la coordination des états s'effectue par le biais d'une base de données. Les applications développées sur Workers présentent des défis uniques pour une base de données. Concrètement, ces difficultés s'articulent autour de la nécessité de fonctionner immédiatement à l'échelle mondiale et du fort accent mis sur la simultanéité, deux aspects susceptibles de conduire à de fréquents rollbacks des transactions en cas de coordination effectuée à l'aide de clés partagées. Les bases de données elles-mêmes s'avèrent difficiles à configurer et à faire évoluer, en particulier au niveau mondial. C'est d'ailleurs la raison pour laquelle nos développeurs ont besoin d'ajuster leur base de données aux schémas d'accès spécifiques de Workers.
La solution Durable Objects présente un paradigme plus simple : il vous suffit de rédiger une classe JavaScript pour que votre application puisse créer des instances nommées de cette classe, garanties uniques sur l'ensemble du réseau Cloudflare. Cette instance constitue un objet durable (Durable Object). Les Workers (et les autres objets durables !) peuvent lui envoyer des messages par l'intermédiaire de son ID. L'objet durable traite alors les messages dans l'ordre et sous forme de fil unique, afin de permettre la coordination des messages. Nous lui proposons également une API de stockage fortement cohérente, capable de stocker les paires clé-valeur dont l'objet a besoin pour être durable.
Prenons l'exemple d'un éditeur de documents en ligne. Une architecture classique sauvegarderait l'état du document dans une base de données et laisserait les utilisateurs y consigner leurs modifications. Ce mode de fonctionnement rend toutefois la collaboration difficile. En effet, comment garantir à plusieurs utilisateurs que le document qu'ils ont sous les yeux est bien la dernière version ?
Avec Durable Objects, le problème est beaucoup plus simple. Lorsque vous rédigez une classe de document, vous stockez l'état de chaque document en mémoire au sein d'un objet durable. Lorsqu'un utilisateur se connecte, il voit alors la dernière copie du document et peut apporter ses modifications de manière synchronisée avec les autres utilisateurs. Lorsque les utilisateurs quittent le document, l'objet durable est également déchargé de la mémoire et les opérations sur ce dernier interrompues, tandis que son état est conservé de manière persistante. Cette solution vous libère de la nécessité de configurer un réseau, de gérer une base de données ou de mettre en place une politique de mise à l'échelle automatique : les choses fonctionnent tout simplement.
Si les objets individuels sont traités selon un fil unique, les objets durables sont conçus comme une collection d'objets capables d'évoluer indéfiniment. La solution gère le cycle de vie des objets à votre place, éliminant ainsi les tâches de nettoyage ou de réduction de l'échelle des systèmes. Les objets durables peuvent évoluer instantanément pour traiter des centaines de milliers de requêtes par seconde, avant de revenir à une échelle moindre sans aucune interaction de la part des développeurs.
Qu'avons-nous conçu depuis l'annonce de l'accès anticipé ?
Nous nous sommes tout d'abord occupés d'améliorer la fiabilité et les performances. Les objets durables sont à l'origine d'un grand nombre de nouveaux produits en cours de développement chez Cloudflare, notamment l'infrastructure de la solution de stockage R2 et du service File d'attente de Cloudflare.
Ce dernier s'appuie ainsi sur des objets durables pour offrir une vue fortement cohérente et en temps réel sur le nombre d'utilisateurs qui tentent d'accéder à un site donné dans le monde entier. Le stockage de cet état sujet à des mises à jour fréquentes au sein d'une base de données traditionnelle entraînerait des difficultés en matière de mise à l'échelle et l'exécution du processus dans le monde entier se révélerait considérablement plus complexe.
Nos clients ont également adopté la solution Durable Objects. Nous avons observé un acteur majeur du secteur des jeux vidéo développer sa nouvelle architecture back-end sur la solution Durable Objects, afin de coordonner à la fois l'état de chacun de ses jeux et les salons d'attente des jeux multijoueurs. Grâce à ses capacités d'évolution dynamique, sans gérer de serveur ou de base de données, le choix de Durable Objects s'est facilement imposé pour ce client, dans la mesure où le produit lui permettait de développer son jeu à l'aide d'une équipe relativement petite.
Les clients ont développé bien d'autres applications, des moniteurs de page de statut aux applications collaboratives de saisie d'informations (whiteboarding). Nous avons d'ailleurs constaté un intérêt particulier pour l'utilisation de la solution Durable Objects en conjonction avec les protocoles WebSockets afin de créer des applications totalement réactives. Nous avons publié une architecture de référence en ce sens, afin d'aider les clients à aller plus loin dans le processus de création.
Nous avons également amélioré le fonctionnement du système, notamment face à de gros volumes de requêtes. La solution Durable Objects peut désormais diffuser des centaines de milliers de requêtes par seconde sur l'ensemble des objets et des centaines de requêtes sur un seul objet. Nous pouvons donc la considérer comme prête pour l'entrée en production, même pour les clients les plus exigeants.
Nous venons également de lancer la fonctionnalité de restriction de juridiction, qui ajoute la simplicité des Durable Objects en termes d'évolutivité au processus de conformité. Cette fonction permet ainsi aux développeurs d'attribuer une région à un objet durable, afin de garantir que ce dernier traitera et stockera les données au sein de cette région.
Nous avons ajouté un cache en amont des requêtes de stockage d'objets durables, afin d'accélérer considérablement les opérations de lecture et d'écriture, tout en facilitant également la rédaction d'un code concurrent approprié.
Par ailleurs, nous avons apporté un certain nombre de petites améliorations, parmi lesquelles le téléchargement simplifié de nouvelles classes d'objets durables, une interface utilisateur au sein du tableau de bord et la prise en charge des commandes « wrangler dev » et « wrangler tail » pour le débogage en direct.
Quel est l'avenir de la solution Durable Objects ?
Nous comptons poursuivre nos efforts visant à faire de la solution Durable Objects la plate-forme la plus simple en matière de création d'applications évolutives à l'infini.
À l'heure actuelle, la mise à l'échelle des objets durables s'effectue particulièrement bien lorsque les objets peuvent être partitionnés, mais les objets individuels sont limités à un unique fil d'exécution. De nombreuses charges de travail pourraient bénéficier d'une mise à l'échelle sur plusieurs fils, afin de proposer un accès en lecture seule à l'état d'un objet, tout en choisissant de ne procéder à une synchronisation que lors du changement d'état. Nous appelons ce processus la réplication des objets durables et nous y travaillons en ce moment même.
Nous travaillons également à l'ajout d'une API de rappel garanti d'un objet durable, permettant aux développeurs de réveiller ce dernier à un moment prédéterminé afin d'exécuter une fonction. Cette opération simplifie la gestion du cycle de vie et permet de développer facilement des primitives, par exemple, des files d'attente fiables, sur des objets durables.
Nous cherchons également à mieux répartir géographiquement les objets, notamment par la possibilité de visionner la migration automatique des objets évoquée lors de notre annonce initiale.
Vous souhaiteriez nous voir ajouter un élément particulier à notre liste de travail ? Envoyez-nous un e-mail ou écrivez-nous un tweet !
Comment utiliser la solution Durable Objects ?
Rendez-vous sur le tableau de bord de Cloudflare pour activer la solution et choisir une option de tarification, puis consultez notre exemple d'application de discussion et notre architecture de référence ici !
Bon développement !