Prima di cumincià, devu lascià
In questu articulu, mi piacerebbe vede u stratu chì hè rispunsevuli di almacenà i fugliali, è cumu pò esse usatu da qualcunu.
In l'articulu precedente, aghju "rottu u barile" un pocu ipfs, ma questu hè accadutu precisamente in u cuntestu di u prublema ch'e aghju risoltu. In generale, pensu chì stu prughjettu hè bellu. Preferite solu a capacità di creà diverse reti per diverse attività. Questu permette di organizà megliu a struttura è riduce a carica nantu à i nodi individuali è a reta in tuttu. Ancu in u quadru di un prughjettu, se ne necessariu, pudete sparte a reta in pezzi secondu certi criterii, riducendu a carica generale.
Allora storacle usa u mecanismu
- I schedari ponu esse aghjuntu à u repository attraversu qualsiasi node.
- I schedari sò salvati sanu sanu, micca in blocchi.
- Ogni schedariu hà u so propiu hash di cuntenutu unicu per un travagliu ulteriore cun ellu.
- I schedari ponu esse duplicati per una affidabilità più grande
- U numeru di schedari nantu à un node hè limitatu solu da u sistema di schedari (ci hè una eccezzioni, più nantu à quì sottu)
- U numaru di schedari in a reta hè limitata da e capacità spreadable secondu u numeru di nodi validi in a reta, chì in a seconda versione puderà travaglià cù un numeru infinitu di nodi (più nantu à questu in un altru articulu)
Un esempiu simplice di cumu funziona in generale da u prugramma:
Servitore:
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);
}
})();
Cliente:
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);
}
})();
Veduta interna
Ùn ci hè nunda di fantasia sottu u cappucciu. L'infurmazioni nantu à u numeru di schedari, a so dimensione tutale è altri punti sò guardati in una basa di dati in memoria è sò aghjurnati quandu i schedari sò sguassati è aghjunti, per quessa, ùn ci hè bisognu di accede à freti à u sistema di schedari. Un'eccezzioni hè di attivà u cullettivu di basura quandu avete bisognu di circulà i fugliali quandu una certa dimensione di almacenamento hè righjunta, è ùn impedisce micca di aghjunghje novi. In questu casu, avete da passà l'almacenamiento, è travaglià cù un gran numaru di schedari (> dì un milione) pò purtà à carichi significativi. È hè megliu almacenà menu schedari è eseguisce più nodi. Se u "pulitore" hè disattivatu, ùn ci hè micca un tali prublema.
L'almacenamiento di u schedariu hè custituitu da 256 cartulare è 2 livelli di nidificazione. I schedari sò guardati in cartulare di u sicondu livellu. Questu hè, se ci sò 1 milione. Ci sarà circa 62500 schedari in ogni tali cartulare (1000000 / sqrt (256)).
I nomi di u cartulare sò furmati da u file hash in modu chì pudete accede rapidamente se cunnosci l'hash.
Sta struttura hè stata scelta basatu annantu à un gran numaru di esigenze di almacenamento differenti: supportu per i sistemi di schedari debuli, induve ùn hè micca desideratu avè parechji schedari in un cartulare, traversu veloce di tutti i cartulare se ne necessariu, etc. Qualchì tipu d'oru mediu.
caching
Quandu aghjunghjenu i schedari, è ancu quandu li riceve, i ligami à i schedari sò scritti in a cache.
Grazie à questu, assai spessu ùn hè micca bisognu di traversà tutta a reta in cerca di un schedariu. Questu accelerà a ricezione di ligami è riduce a carica nantu à a reta. A caching si trova ancu via intestazioni http.
Isomorfia
U cliente hè scrittu in javascript è hè isomorficu, pò esse usatu direttamente da u navigatore.
Pudete carricà u schedariu
Ligami differiti
Una funzione interessante hè ancu "riferenza differita". Questu hè un ligame à un schedariu chì pò esse acquistatu in modu sincronu, quì è avà, è u schedariu serà tiratu quandu si trova digià in u almacenamiento. Questu hè assai còmuda quandu, per esempiu, avete bisognu di vede qualchi ritratti nantu à u situ. Avemu solu messu un ligame differitu in src è questu hè. Pudete cullà cù parechji casi.
Client API
- async Client.prototype.storeFile() - salvà u schedariu
- async Client.prototype.getFileLink() - uttene un ligame direttu à u schedariu
- async Client.prototype.getFileLinks() - ottene una lista di ligami diretti à un schedariu da tutti i nodi induve esiste
- async Client.prototype.getFileToBuffer() - mette u schedariu in u buffer
- async Client.prototype.getFileToPath() - uttene un schedariu in u sistema di fugliale
- async Client.prototype.getFileToBlob() - uttene u schedariu in blob (per a versione di u navigatore)
- async Client.prototype.removeFile() - sguassà un schedariu
- Client.prototype.createRequestedFileLink() - crea un ligame differita
Esporta i fugliali à un altru servitore
Per trasfiriri i schedari à un altru node, pudete:
- Basta à copià tuttu u cartulare di almacenamiento cù i paràmetri. (questu ùn pò micca travaglià in u futuru)
- Copia solu u cartulare cù i schedari. Ma, in stu casu, vi tuccherà à eseguisce a funzione una volta node.normalizeFilesInfo()per recalculate tutte e dati è entre in a basa di dati.
- aduprà a funzione node.exportFiles()chì hà da cumincià à cupià i schedari.
Configurazione di u nodu di basa
Quandu principia u node di almacenamiento, pudete specificà tutti i paràmetri necessarii.
Descriveraghju i più basi, u restu pò esse truvatu in Github.
- storage.dataSize - dimensione di u cartulare cù i schedari
- storage.tempSize - dimensione di u cartulare tempuranee
- storage.autoCleanSize - a dimensione minima di almacenamiento chì deve esse tenuta. Se specificate stu paràmetru, quandu u spaziu cumencia à esce, i schedarii menu usati seranu sguassati.
- file.maxSize - dimensione massima di u schedariu
- file.minSize - dimensione minima di u schedariu
- file.preferredDuplicates - numeru preferitu di duplicati di schedari nantu à a reta
- file.mimeWhitelist - tipi di schedari validi
- file.mimeBlacklist - tipi di schedari invalidi
- file.extWhitelist - estensioni di file valide
- file.extBlacklist - estensioni di fugliale invalide
- file.linkCache - diverse paràmetri di cache di ligami
Quasi tutti i paràmetri ligati à e dimensioni ponu esse inseriti in valori assoluti è relativi.
U travagliu via a linea di cumanda
A biblioteca pò esse usata via a linea di cumanda. Per fà questu, avete bisognu di stallà in u mondu: npm i -g storacle. Dopu questu, pudete lancià l'azzioni necessarii da u cartulare di u prughjettu induve u node hè. Per esempiu, storacle -a storeFile -f ./file.txt -c ./config.jsper aghjunghje u schedariu. Tutte l'azzioni ponu esse truvate in
Perchè puderebbe bisognu di questu?
- Se vulete creà un tipu di prughjettu decentralizatu in u quale pensa à almacenà è travaglià cù i schedari cù metudi convenienti. Per esempiu, u prughjettu di musica discrittu in u ligame à u principiu di l'articulu usa storacle.
- Se travagliate in qualsiasi altri prughjetti induve avete bisognu di almacenà i schedari in una manera distribuita. Pudete facilmente custruisce a vostra rete chjusa, cunfigurà in modu flessibile i nodi è aghjunghje novi quandu hè necessariu.
- Sì avete bisognu di almacenà i vostri fugliali di u situ web in un locu è hè troppu per voi per scrive tuttu. Forsi sta biblioteca hè più adattata chè l'altri in u vostru casu.
- Sì avete un prughjettu in u quale travagliate cù i schedari, ma vulete realizà tutte e manipulazioni da u navigatore. Pudete evitari di scrive u codice di u servitore.
I mo cuntatti:
Source: www.habr.com