3 points par GN⁺ 2024-10-28 | 1 commentaires | Partager sur WhatsApp

Utiliser SQLite comme stockage de contenu statique pour un serveur web

Contexte

  • Clace est une plateforme conçue principalement pour fournir des applications web destinées aux outils internes.
  • Clace intègre des fonctions habituellement gérées séparément par un serveur web et un serveur d’applications.
  • Au début du développement de Clace, il était important de décider comment stocker les données et les métadonnées des applications.
  • Il était logique de stocker les métadonnées dans une base de données, tandis que les fichiers statiques sont généralement stockés dans le système de fichiers.

Utiliser SQLite pour servir les fichiers

  • Clace a décidé d’utiliser SQLite au lieu du système de fichiers pour stocker les fichiers des applications.
  • Cela permet des changements de version atomiques, de sorte que plusieurs fichiers peuvent être traités en une seule transaction lors d’une mise à jour.
  • Lors de la création et de la mise à jour d’une application, tous les fichiers sont téléversés dans une base de données SQLite, tandis qu’en mode développement, le système de fichiers local est utilisé.

Avantages de l’utilisation de SQLite

  • Mises à jour transactionnelles : plusieurs fichiers peuvent être mis à jour en une seule fois, ce qui garantit qu’aucune webapp cassée n’apparaît pendant une mise à jour.
  • Rollback de déploiement : en cas d’erreur, il est possible de revenir en arrière sur un déploiement, et l’annulation d’une transaction de base de données est plus simple que le nettoyage du système de fichiers.
  • Déduplication des fichiers entre versions : même si un même fichier existe dans plusieurs versions, son contenu n’est stocké qu’une seule fois.
  • Déduplication entre applications : évite les doublons lorsque plusieurs applications contiennent les mêmes fichiers.
  • Facilité de sauvegarde : SQLite permet de sauvegarder facilement l’état du système.
  • Hachage du contenu : lors du téléversement d’un fichier, son SHA de contenu est enregistré afin de faciliter le cache navigateur.
  • Compression : le contenu des fichiers est stocké compressé avec Brotli, et peut facilement être conservé sous différents formats.

Performances

  • L’approche d’accès à la base SQLite de Clace offre d’excellentes performances.
  • Aucun benchmark direct n’a été réalisé, faute d’implémentation équivalente utilisant le système de fichiers.
  • D’après les benchmarks de l’équipe SQLite, SQLite peut offrir de meilleures performances que le système de fichiers pour certaines charges de travail.

Prise en charge multi-nœuds

  • Clace fonctionne actuellement sur un seul nœud.
  • Quand la prise en charge multi-nœuds sera ajoutée, le projet prévoit d’utiliser une base Postgres partagée au lieu d’un SQLite local.
  • Cela peut entraîner des problèmes de latence, et l’objectif est de les réduire en utilisant une base SQLite locale comme cache de fichiers.

Pourquoi cette approche n’est pas courante

  • Si la plupart des serveurs web utilisent le système de fichiers, c’est avant tout pour des raisons de commodité.
  • Les outils du système de fichiers permettent de mettre à jour les fichiers, tandis qu’avec une base de données, il faut une interface API pour téléverser les fichiers.

Le résumé de GN⁺

  • Clace est une plateforme de développement et de déploiement d’outils internes, qui maximise les avantages du stockage de fichiers via SQLite.
  • L’utilisation de SQLite apporte divers bénéfices, notamment les mises à jour transactionnelles, le rollback, la déduplication et la facilité de sauvegarde.
  • Cette approche reste peu courante en raison de la commodité du système de fichiers et de raisons historiques, mais elle améliore l’efficacité en tirant parti des performances et des fonctionnalités de SQLite.
  • Parmi les projets aux fonctionnalités similaires, on peut citer Firebase et AWS Lambda.

1 commentaires

 
GN⁺ 2024-10-28
Commentaires sur Hacker News
  • Il y a quelques années, inspiré par l’article « 35% Faster Than The Filesystem », quelqu’un a expérimenté l’utilisation de SQLite pour servir des fichiers statiques. Il a créé via Datasette un plugin permettant de servir des fichiers statiques depuis SQLite, mais il ne l’a pas beaucoup utilisé. Pour servir des fichiers avec SQLite, l’outil CLI sqlite-utils insert-files peut être utile.

  • Les mises à jour transactionnelles constituent un avantage majeur, car elles permettent de mettre à jour plusieurs fichiers en une seule fois. Que le serveur utilise SQLite ou le système de fichiers, cela n’empêche pas l’application web de se casser pendant une mise à jour. Il faut s’assurer que toutes les sous-ressources d’une page soient référencées avec un hash de contenu spécifique ou un nom de version.

  • En 2011/2012, en travaillant dans une petite société de développement de jeux, quelqu’un stockait tous les assets dans une base sqlite3 et créait des fichiers pak pour enregistrer les offsets des fichiers. Cela permettait de charger rapidement les assets dans les jeux mobiles, et le fait de stocker les métadonnées dans la base facilitait la recherche de fichiers similaires.

  • Utiliser SQLite au lieu du système de fichiers présente l’avantage de pouvoir interroger les fichiers. Les requêtes SQL peuvent être utilisées de manière type-safe avec Kysely.

  • L’idée de servir du contenu statique avec SQLite n’est pas parfaite. Les serveurs web modernes utilisent des stratégies optimales pour traiter les fichiers statiques. SQLite fournit un support pour les E/S mappées en mémoire, mais n’est pas adapté aux sites web de grande taille.

  • SQLite convient aux sites web recevant moins de 100 k hits par jour. Le site de SQLite lui-même traite entre 400 k et 500 k requêtes HTTP par jour et, dans la plupart des cas, la charge moyenne reste inférieure à 0,1.

  • Les CMS de générateurs de sites statiques utilisent une base SQLite pour développer et mettre à jour un site web, puis exportent le tout sur le système de fichiers sous forme de pages statiques pour le déploiement.

  • En calcul scientifique haute performance, la manière la plus flexible et la plus performante d’accéder aux données est souvent une base SQLite en lecture seule sur un disque RAM.

  • Il serait intéressant de comparer cette approche SQLite avec les cas où le système de fichiers peut fournir déduplication, snapshots, gestion de versions et compression. Avec un système de fichiers avancé, il peut être plus simple de remplacer un répertoire par une nouvelle version.

  • Utiliser une base de données comme système de fichiers a des avantages, mais quand des problèmes surviennent, cela peut devenir un cauchemar.