
Avant de commencer, je dois laisser , afin que vous compreniez de quoi il s'agit.
Dans cet article, je voudrais examiner le niveau qui est responsable du stockage des fichiers, et comment cela peut être utilisé par n'importe qui. , il n'y a pas de lien direct avec la musique. Vous pouvez organiser le stockage de tout type de fichiers.
Dans l'article précédent, j'ai un peu "critique" ipfs, mais cela s'est fait justement dans le contexte du problème que je résolvais. Dans l'ensemble, je trouve ce projet formidable. J'apprécie simplement plus la possibilité de créer différentes réseaux pour différentes tâches. Cela permet de mieux organiser la structure et de réduire la charge sur les nœuds individuels et le réseau dans son ensemble. Même dans le cadre d'un projet, si nécessaire, on peut diviser le réseau en morceaux selon certains critères, réduisant ainsi la charge globale.
Ainsi, storacle utilise le mécanisme pour organiser le réseau. Les principales caractéristiques :
- Les fichiers peuvent être ajoutés au stockage via n'importe quel nœud.
- Les fichiers sont sauvegardés dans leur intégralité, pas par blocs.
- Chaque fichier a son propre hachage unique basé sur son contenu pour un travail ultérieur.
- Les fichiers peuvent être dupliqués pour plus de fiabilité.
- Le nombre de fichiers sur un nœud est limité uniquement par le système de fichiers (il y a une exception, qui sera mentionnée plus bas).
- Le nombre de fichiers dans le réseau est limité par les capacités de spreadable quant au nombre de nœuds autorisés dans le réseau, qui, dans la deuxième version, pourront permettre de travailler avec un nombre infini de nœuds (de cela, dans un autre article).
Un exemple simple de la façon dont cela fonctionne dans le programme :
Serveur :
const Node = require('storacle').Node;
(async () => {
try {
const node = new Node({
port: 4000,
hostname: 'localhost'
});
await node.init();
} catch(err) {
console.error(err.stack);
process.exit(1);
}
})();Client :
const Client = require('storacle').Client;
(async () => {
try {
const client = new Client({
address: 'localhost:4000'
});
await client.init();
const hash = await client.storeFile('./my-file');
const link = await client.getFileLink(hash);
await client.removeFile(hash);
} catch(err) {
console.error(err.stack);
process.exit(1);
}
})();Un regard à l'intérieur
Sous le capot, rien de surnaturel. Les informations sur le nombre de fichiers, leur taille totale et d'autres éléments sont stockées dans une base de données en mémoire et sont mises à jour lors de la suppression et de l'ajout de fichiers, ce qui évite la nécessité de fréquentes requêtes au système de fichiers. L'exception à cela est l'activation du collecteur de déchets, lorsque la circulation des fichiers est nécessaire en atteignant certaines tailles de stockage, et non l'interdiction d'ajouter de nouveaux fichiers. Dans ce cas, il est nécessaire de parcourir le stockage, et le travail avec un grand nombre de fichiers (> un million, disons) peut entraîner des charges substantielles. Il est donc préférable de conserver moins de fichiers et de démarrer plus de nœuds. Si le "nettoyeur" est désactivé, il n'y a pas de problème de ce type.
Le stockage de fichiers se compose de 256 dossiers et de 2 niveaux de profondeur. Les fichiers sont stockés dans les dossiers du deuxième niveau. Ainsi, en cas de présence de 1 million de fichiers dans chaque dossier, il y aurait environ 62500 fichiers (1000000 / sqrt(256)).
Les noms des dossiers sont formés à partir du hachage du fichier, permettant d'y accéder rapidement en connaissant le hachage.
Cette structure a été choisie en raison de nombreux besoins différents en matière de stockage : support des systèmes de fichiers faibles, où il n'est pas souhaitable d'avoir de nombreux fichiers dans un seul dossier, parcours rapide de tous les dossiers si nécessaire, etc. Une sorte de juste milieu.
Mise en cache
Lors de l'ajout de fichiers, ainsi que lors de leur récupération, des liens vers les fichiers sont enregistrés dans le cache.
Grâce à cela, il est souvent inutile de parcourir tout le réseau à la recherche d'un fichier. Cela accélère l'obtention des liens et réduit la charge du réseau. La mise en cache se fait également via les en-têtes http.
Isomorphisme
Le client est écrit en JavaScript et est isomorphe, il peut être utilisé directement depuis le navigateur.
Vous pouvez télécharger un fichier en tant que script et accéder à window.ClientStoracle ou l'importer via un système de construction, etc.
Liens différés
Une fonctionnalité intéressante est le "lien différé". C'est un lien vers un fichier que l'on peut obtenir de manière synchrone, ici et maintenant, et le fichier sera récupéré lorsqu'il sera trouvé dans le stockage. C'est très pratique, par exemple, lorsqu'il faut afficher des images sur un site. Il suffit d'inscrire le lien différé dans src et le tour est joué. On peut penser à de nombreux cas d'utilisation.
API client
- async Client.prototype.storeFile() — sauvegarde d'un fichier
- async Client.prototype.getFileLink() — récupération d'un lien direct vers le fichier
- async Client.prototype.getFileLinks() — obtenir une liste de liens directs vers le fichier depuis tous les nœuds où il existe
- async Client.prototype.getFileToBuffer() — obtenir le fichier dans un tampon
- async Client.prototype.getFileToPath() — obtenir le fichier dans le système de fichiers
- async Client.prototype.getFileToBlob() — obtenir le fichier au format blob (pour la version navigateur)
- async Client.prototype.removeFile() — supprimer le fichier
- Client.prototype.createRequestedFileLink() — créer un lien différé
Exporter des fichiers vers un autre serveur
Pour transférer des fichiers vers un autre nœud, vous pouvez :
- Copier simplement tout le dossier de stockage avec les paramètres (cela peut ne pas fonctionner à l'avenir)
- Copier uniquement le dossier contenant les fichiers. Dans ce cas, il faudra exécuter une fois la fonction node.normalizeFilesInfo(), pour recalculer toutes les données et les enregistrer dans la base.
- Utiliser la fonction node.exportFiles(), qui commencera à copier les fichiers.
Paramètres principaux du nœud
Lors du démarrage du nœud de stockage, vous pouvez spécifier tous les paramètres nécessaires.
Je vais décrire les plus importants, le reste peut être trouvé sur GitHub.
- storage.dataSize — la taille du dossier contenant les fichiers
- storage.tempSize — la taille du dossier temporaire
- storage.autoCleanSize — la taille minimale de stockage à conserver. Si ce paramètre est spécifié, dès que l'espace commence à manquer, les fichiers les moins utilisés seront supprimés.
- file.maxSize — la taille maximale du fichier
- file.minSize — la taille minimale du fichier
- file.preferredDuplicates — le nombre de duplicata de fichier préféré dans le réseau
- file.mimeWhitelist — types de fichiers autorisés
- file.mimeBlacklist — types de fichiers interdits
- file.extWhitelist — extensions de fichiers autorisées
- file.extBlacklist — extensions de fichiers interdites
- file.linkCache — différents paramètres de mise en cache des liens
Presque tous les paramètres liés aux tailles peuvent être spécifiés en valeurs absolues et relatives.
Fonctionnement via la ligne de commande
La bibliothèque peut être utilisée via la ligne de commande. Pour cela, il faut l'installer globalement : npm i -g storacle. Après cela, vous pouvez exécuter les actions nécessaires depuis le répertoire avec le projet, où se trouve le nœud. Par exemple, storacle -a storeFile -f ./file.txt -c ./config.js, pour ajouter un fichier. Toutes les actions peuvent être trouvées dans
Pourquoi en aurait-il besoin
- Si vous souhaitez créer un projet décentralisé dans lequel il est prévu de stocker et de travailler avec des fichiers de manière pratique. Par exemple, le projet de musique décrit dans le lien au début de l'article utilise storacle.
- Si vous travaillez sur d'autres projets nécessitant un stockage de fichiers décentralisé, vous pouvez facilement créer votre propre réseau privé, configurer des nœuds de manière flexible et en ajouter de nouveaux lorsque nécessaire.
- Si vous avez simplement besoin d'un endroit pour stocker les fichiers de votre site et que vous ne voulez pas vous fatiguer à tout écrire vous-même, cette bibliothèque pourrait être plus adaptée que d'autres dans votre cas.
- Si vous avez un projet où vous travaillez avec des fichiers mais souhaitez effectuer toutes les manipulations depuis le navigateur, vous pouvez éviter d'écrire du code serveur.
Mes contacts :
Source : habr.com
