
Înainte de a începe, trebuie să las , pentru a fi clar despre ce discutăm.
În acest articol, aș dori să discut despre stratul care se ocupă cu stocarea fișierelor și cum poate fi folosit de oricine. , fără legătură directă cu muzica. Poate organiza stocarea oricăror fișiere.
În articolul anterior, am făcut un pic de "critică" pe ipfs, dar aceasta a fost în contextul sarcinii pe care o abordam. În general, consider că acest proiect este grozav. Îmi place mai mult posibilitatea de a crea rețele diferite pentru sarcini diferite. Acest lucru permite o mai bună organizare a structurii și reduce sarcina pe nodurile individuale și pe rețea în ansamblu. Chiar și în cadrul unui anumit proiect, dacă este necesar, se poate sparge rețeaua în părți pe anumite criterii, reducând astfel sarcina generală.
Deci, storacle folosește un mecanism pentru organizarea rețelei. Principalele caracteristici:
- Fișierele pot fi adăugate în stocare prin orice nod.
- Fișierele sunt salvate integral, nu pe blocuri.
- Fiecare fișier are un hash unic bazat pe conținut pentru lucrul ulterior cu acesta.
- Fișierele pot fi duplicate pentru mai multă fiabilitate
- Numărul de fișiere pe un nod este limitat doar de sistemul de fișiere (există o excepție, despre care vom discuta mai jos)
- Numărul de fișiere din rețea este limitat de capacitățile spreadable în ceea ce privește numărul de noduri acceptabile în rețea, care în a doua versiune vor putea permite lucrul cu un număr infinit de noduri (despre aceasta, într-un alt articol)
Un exemplu simplu despre cum funcționează din program:
Serverul:
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);
}
})();Privire de interior
Sub capacul mașinii nu este nimic supranatural. Informațiile despre numărul de fișiere, dimensiunea totală a acestora și alte detalii sunt stocate într-o bază de date în memorie și sunt actualizate atunci când fișierele sunt adăugate sau șterse, astfel că nu este necesar să se acceseze frecvent sistemul de fișiere. O excepție o constituie activarea colectorului de gunoi, când este necesară circulația fișierelor după atingerea unor dimensiuni ale stocării, și nu interdicția adăugării de noi fișiere. În acest caz, este necesar să se traverseze stocarea, iar lucrul cu un număr mare de fișiere (> un milion, să zicem) poate provoca sarcini semnificative. Este mai bine să se păstreze un număr mai mic de fișiere și să se ruleze mai multe noduri. Dacă "curățătorul" este dezactivat, nu există această problemă.
Stocarea fișierelor constă în 256 de dosare și 2 niveluri de imbricare. Fișierele sunt păstrate în dosare de nivelul secundar. Deci, în cazul în care există 1 milion de fișiere, în fiecare astfel de dosar vor fi aproximativ 62500 de fișiere (1000000 / sqrt(256)).
Numele dosarelor sunt generate din hash-ul fișierului, pentru a permite accesul rapid, știind hash-ul.
Această structură a fost aleasă ținând cont de un număr mare de cerințe diferite pentru stocare: suport pentru sisteme de fișiere slabe, unde nu este recomandat să ai multe fișiere într-un singur dosar, parcurgere rapidă a tuturor dosarelor, etc. O anumită soluție de compromis.
Cache
Atunci când se adaugă fișiere, precum și la obținerea acestora, linkurile către fișiere sunt scrise în cache.
Datorită acestui fapt, de multe ori nu este necesar să se traverseze întreaga rețea căutând fișierul. Acest lucru accelerează obținerea linkurilor și reduce încărcătura asupra rețelei. De asemenea, cache-ul se realizează prin intermediul headerelor http.
Izomorfism
Clientul este scris în javascript și este izomorf, poate fi utilizat direct din browser.
Se poate încărca un fișier ca script și se poate accesa window.ClientStoracle sau poate fi importat prin sistemul de construire etc.
Linkuri amânate
O caracteristică interesantă este "linkul amânat". Aceasta este un link către un fișier care poate fi obținut sincron, aici și acum, iar fișierul va fi tras când va fi găsit în stocare. Este foarte convenabil atunci când, de exemplu, trebuie să afisezi pe site anumite imagini. Pur și simplu setăm în src linkul amânat și totul este gata. Se pot inventa multe cazuri.
Api client
- async Client.prototype.storeFile() — salvarea fișierului
- async Client.prototype.getFileLink() — obținerea unui link direct către fișier
- async Client.prototype.getFileLinks() — obținerea unei liste de linkuri directe către fișier de pe toate nodurile unde acesta există
- async Client.prototype.getFileToBuffer() — obține fișierul în buffer
- async Client.prototype.getFileToPath() — obține fișierul în sistemul de fișiere
- async Client.prototype.getFileToBlob() — obține fișierul în blob (pentru versiunea browser)
- async Client.prototype.removeFile() — elimină fișierul
- Client.prototype.createRequestedFileLink() — creează un link întârziat
Exportul fișierelor pe un alt server
Pentru a muta fișierele pe un alt nod, poți:
- Să copiezi întreaga folder de stocare împreună cu setările. (în viitor, acest lucru poate să nu mai funcționeze)
- Să copiezi doar folderul cu fișiere. Dar, în acest caz, va fi necesar să rulezi o dată funcția node.normalizeFilesInfo(), pentru a recalcula toate datele și a le introduce în baza de date.
- Folosind funcția node.exportFiles(), care va începe copierea fișierelor.
Setările principale ale nodului
Atunci când pornești nodul de stocare, poți specifica toate setările necesare.
Voi descrie cele mai importante, restul poate fi găsit pe GitHub.
- storage.dataSize — dimensiunea folderului cu fișiere
- storage.tempSize — dimensiunea folderului temporar
- storage.autoCleanSize — dimensiunea minimă a stocării care trebuie menținută. Dacă acest parametru este specificat, atunci imediat ce spațiul începe să fie insuficient, cele mai puțin folosite fișiere vor fi șterse.
- file.maxSize — dimensiunea maximă a fișierului
- file.minSize — dimensiunea minimă a fișierului
- file.preferredDuplicates — numărul preferat de duplicate ale fișierului în rețea
- file.mimeWhitelist — tipurile de fișiere acceptate
- file.mimeBlacklist — tipurile de fișiere neacceptate
- file.extWhitelist — extensiile de fișiere acceptate
- file.extBlacklist — extensiile de fișiere neacceptate
- file.linkCache — diverse setări pentru cache-ul linkurilor
Aproape toți parametrii legați de dimensiuni pot fi specificați atât în unități absolute, cât și relative.
Lucrul prin linia de comandă
Biblioteca poate fi utilizată prin linia de comandă. Pentru asta, trebuie să o instalezi global: npm i -g storacle. După aceea, poți lansa acțiunile dorite din directorul cu proiectul, unde se află nodul. De exemplu, storacle -a storeFile -f ./file.txt -c ./config.js, pentru a adăuga un fișier. Toate acțiunile pot fi găsite în
De ce ai avea nevoie de asta
- Dacă vrei să creezi un proiect descentralizat în care se preconizează stocarea și lucrul cu fișiere prin metode convenabile. De exemplu, proiectul cu muzică, descris în linkul de la începutul articolului, folosește storacle.
- Dacă lucrezi la alte proiecte unde trebuie să stochezi fișiere în mod distribuit, poți construi cu ușurință o rețea privată, configurând flexibil nodurile și adăugând altele noi atunci când este necesar.
- Dacă ai nevoie doar să stochezi fișierele site-ului tău și nu vrei să scrii totul de la zero, această bibliotecă ar putea fi mai potrivită decât altele în cazul tău.
- Dacă ai un proiect în care lucrezi cu fișiere, dar dorești să efectuezi toate manipulările din browser, poți evita scrierea codului server.
Contactele mele:
Sursa: habr.com
