Skip to content

Stockage de fichiers et stockage d'objets

Préface

Un utilisateur charge un avatar, vous le stockez dans le répertoire /uploads du serveur — puis le disque du serveur se remplit, ou vous ajoutez un second serveur, et l'utilisateur constate que son avatar apparaît et disparaît. Le stockage de fichiers peut sembler simple, mais dans un environnement distribué, c'est un problème architectural qui nécessite une attention sérieuse. Le stockage d'objets est la réponse standard de l'ère Internet à ce problème.

Que allez-vous apprendre dans cet article ?

Après avoir étudié ce chapitre, vous serez en mesure de :

  • Connaître les types de stockage : comprendre les différences et les scénarios d'application du stockage par blocs, du stockage de fichiers et du stockage d'objets
  • Maîtriser les concepts clés du stockage d'objets : Bucket, Object, Key, URL pré-signée, etc.
  • Concevoir des solutions de téléchargement : apprendre à choisir entre le téléchargement direct côté client et le transit côté serveur
  • Comprendre l'accélération CDN : comprendre comment le CDN accélère la distribution mondiale de ressources statiques
  • Meilleures pratiques : maîtriser les techniques pratiques de nommage de fichiers, contrôle d'accès, gestion du cycle de vie
ChapitreContenuConcept clé
Chapitre 1Comparaison des types de stockageStockage par blocs, stockage de fichiers, stockage d'objets
Chapitre 2Concepts clés du stockage d'objetsBucket, Object, Key, métadonnées
Chapitre 3Solutions de téléchargement de fichiersTéléchargement direct côté client, URL pré-signée
Chapitre 4Accélération CDNNœuds de périphérie, stratégie de cache, récupération à la source
Chapitre 5Meilleures pratiquesConventions de nommage, permissions, cycle de vie

0. Vue d'ensemble : pourquoi ne pas stocker les fichiers localement sur le serveur ?

Au début d'un projet, stocker les fichiers chargés par les utilisateurs dans un répertoire local du serveur est l'approche la plus intuitive. Mais à mesure que le projet évolue, vous rencontrerez une série de problèmes :

  • Espace disque limité : le disque du serveur finit toujours par se remplir, l'extension est compliquée
  • Pas de partage multi-serveurs : après l'équilibrage de charge, les requêtes utilisateur peuvent atteindre différents serveurs, les fichiers sont introuvables
  • Pas de sauvegarde : si le serveur tombe en panne, les fichiers sont perdus
  • Pas de CDN : les utilisateurs du monde entier accèdent au même serveur, la vitesse est lente

La valeur centrale du stockage d'objets

Le stockage d'objets (comme AWS S3, Alibaba Cloud OSS) résout tous ces problèmes : capacité illimitée, accessibilité mondiale, sauvegarde automatique, support natif du CDN. Il est devenu la norme de facto pour le stockage de fichiers dans les applications Internet.


1. Comparaison des types de stockage : blocs, fichiers, objets

Le monde informatique dispose de trois modes de stockage principaux, chacun résolvant des problèmes à différents niveaux.

Storage Type Comparison
Click to inspect the characteristics of each storage model
🧱
Block storage
📁
File storage
☁️
Object storage
Object storage
Stores files as objects through HTTP APIs. Each object has a unique key. It has a flat structure, nearly unlimited capacity, and low cost, making it a common choice for internet applications.
Access method
HTTP/HTTPS RESTful API (PUT/GET/DELETE)
Typical scenarios
Images, videos, backups, static site hosting, data lakes
Representative products
AWS S3, Alibaba Cloud OSS, MinIO, Cloudflare R2
Scalability
Nearly unlimited scaling with automatic distributed storage
DimensionStockage par blocsStockage de fichiersStockage d'objets
Unité de donnéesBlocs de taille fixeFichiers + répertoiresObjets (Key-Value)
Protocole d'accèsiSCSI/FCNFS/SMBAPI REST HTTP
PerformanceLa plus élevée (millisecondes)MoyennePlus faible (mais suffisante)
ExtensibilitéLimitéeMoyenneQuasiment illimitée
CoûtLe plus élevéMoyenLe plus bas
Scénario typiqueBases de donnéesFichiers partagésImages/vidéos/sauvegardes

Aide-mémoire simple

  • Stockage par blocs comme un disque dur — pour les bases de données
  • Stockage de fichiers comme un dossier partagé réseau — pour partager des configurations entre plusieurs serveurs
  • Stockage d'objets comme un cloud de stockage — pour les images et vidéos chargées par les utilisateurs

2. Concepts clés du stockage d'objets

Le modèle de données du stockage d'objets est très simple : un Bucket (seau) est le conteneur, un Object (objet) est le fichier, chaque objet étant identifié par une Key (clé) unique.

my-app-bucket/                    ← Bucket (seau)
├── avatars/user-123.jpg          ← Clé d'objet
├── avatars/user-456.png          ← Clé d'objet
├── reports/2024/q1-report.pdf    ← Clé d'objet (le "répertoire" n'est qu'un préfixe de clé)
└── uploads/temp/file.zip         ← Clé d'objet
ConceptDescriptionExemple
BucketConteneur de stockage, nommage globalement uniquemy-app-prod, company-assets
ObjectLe fichier stocké lui-même + métadonnéesUne image, un PDF
KeyIdentifiant unique de l'objetavatars/user-123.jpg
MétadonnéesInformations supplémentaires sur l'objetContent-Type, étiquettes personnalisées
ACLListe de contrôle d'accèspublic-read, private
URL pré-signéeLien d'accès temporaire autoriséLien de téléchargement/chargement valide 15 minutes

Le stockage d'objets n'a pas de vrais « répertoires »

avatars/user-123.jpg — le avatars/ n'est pas un répertoire, c'est seulement un préfixe de clé. Le stockage d'objets a une structure plate, tous les objets sont au même niveau. Les « dossiers » affichés dans la console ne sont qu'un effet visuel de regroupement par préfixe.


3. Solutions de téléchargement de fichiers : qui télécharge ?

Il existe deux approches principales pour le téléchargement de fichiers : le transit par le serveur et le téléchargement direct par le client. Pour la plupart des scénarios, le téléchargement direct par le client est le meilleur choix.

File Upload Method Comparison
Switch between upload modes to compare their flow
1
Client → Server
The user selects a file and uploads it to your backend server
Large files consume server bandwidth and memory
2
Server receives file
The backend temporarily stores the file on local disk or in memory
May hit Nginx body size limits
3
Server → OSS
The backend forwards the file to object storage
The file is transferred twice, which is inefficient
4
OSS returns URL
Object storage returns the file access URL
5
Server → Client
The backend returns the file URL to the frontend

Avantages du téléchargement direct côté client

  1. Économise la bande passante du serveur : les fichiers ne passent pas par votre serveur, vont directement vers OSS
  2. Évite les dépassements de délai : le chargement de gros fichiers ne déclenche pas les limites de timeout de Nginx/Passerelle
  3. Réduit la charge du serveur : le serveur ne fait que générer des informations d'identification, pas besoin de traiter le flux de fichiers
  4. Supporte la reprise de téléchargement : OSS supporte nativement le chargement par fragments, le frontend peut implémenter la reprise

Étapes de mise en œuvre : le frontend demande au backend une URL pré-signée → le frontend utilise cette URL pour télécharger directement vers OSS → OSS rappelle le backend pour notification


4. Accélération CDN : rendre le site rapide pour les utilisateurs du monde entier

Lorsque vos utilisateurs sont répartis dans le monde entier, le téléchargement de fichiers depuis un seul serveur source est lent. Le CDN (Content Delivery Network) déploie des nœuds de périphérie dans le monde entier, mettant en cache les fichiers au nœud le plus proche de l'utilisateur, réduisant considérablement la latence d'accès.

How CDN Acceleration Works
Compare file access paths with and without CDN
👤
Beijing user
5ms
Beijing CDN node
Cache hit
Return to origin on cache miss
🏢
Origin (US West S3)
Time to first byte (TTFB)
~30ms
Download 1MB image
~50ms
Concept CDNDescription
Nœud de périphérieServeurs de cache distribués dans le monde entier
Récupération à la sourceLorsque le nœud de périphérie n'a pas de cache, il demande le fichier au serveur source
Taux de réussite du cacheProportion de requêtes servies directement par les nœuds de périphérie, plus c'est élevé mieux c'est
TTLDurée de validité du cache, après expiration il faut récupérer à nouveau à la source
Purge du cacheSuppression proactive du cache des nœuds de périphérie pour que les nouveaux fichiers prennent effet

Meilleures pratiques CDN

  • Ajouter un hash au nom de fichier : logo.a3f2b1.png au lieu de logo.png, ainsi pas besoin de purger le cache lors de la mise à jour du fichier
  • Définir un TTL raisonnable : ressources statiques (JS/CSS/images) avec un TTL long (1 an), HTML avec un TTL court (5 minutes)
  • Activer la compression Gzip/Brotli : les ressources texte compressées voient leur volume réduit de 60 à 80 %

5. Meilleures pratiques

PratiqueDescriptionExemple
Convention de nommage des clésOrganiser les fichiers avec des préfixes significatifs{type}/{date}/{uuid}.{ext}
Éviter les clés chaudesNe pas commencer par des numéros séquentielsUtiliser des préfixes UUID ou hash
Principe du moindre privilègeBucket privé par défautNe définir public-read que pour les fichiers devant être publics
Règles de cycle de vieNettoyage automatique des fichiers expirésLes fichiers temporaires sont automatiquement supprimés après 7 jours
Configuration CORSLe téléchargement direct côté client nécessite la configuration CORSAutoriser PUT/POST pour votre domaine
Chiffrement côté serveurActiver SSE pour les fichiers sensiblesSSE-S3 ou SSE-KMS

Résumé

Le stockage de fichiers est un problème fondamental auquel toute application Web est confrontée. Le stockage d'objets, avec sa capacité illimitée, son faible coût et sa haute disponibilité, est devenu le choix standard pour les applications Internet.

Récapitulatif des points clés de ce chapitre :

  1. Trois types de stockage : stockage par blocs pour les bases de données, stockage de fichiers pour le partage, stockage d'objets pour les fichiers utilisateurs
  2. Modèle de stockage d'objets : Bucket + Key + Object, structure plate, accès via API HTTP
  3. Téléchargement direct côté client : solution URL pré-signée, les fichiers ne passent pas par le serveur, efficace et économique en ressources
  4. Accélération CDN : cache des nœuds de périphérie + hash dans le nom de fichier, pour une vitesse optimale partout dans le monde
  5. Sécurité et gestion : principe du moindre privilège, règles de cycle de vie, chiffrement côté serveur

Pour aller plus loin