Storacle - almacenamiento decentralizatu di schedari

Storacle - almacenamiento decentralizatu di schedari

Prima di cumincià, devu lascià ligame à l'articulu precedentecusì ch'ellu sia chjaru di ciò chì esattamente avemu parlatu.

In questu articulu, mi piacerebbe vede u stratu chì hè rispunsevuli di almacenà i fugliali, è cumu pò esse usatu da qualcunu. Storacle hè una biblioteca autonoma, ùn ci hè micca una cunnessione diretta cù a musica. Pudete urganizà u almacenamentu di qualsiasi schedari.

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 spargugliu per urganizà una reta. Funzioni chjave:

  • 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 https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js cum'è un script è accessu finestra.ClientStoracle o impurtà attraversu u sistema di creazione, etc.

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 https://github.com/ortexx/storacle/blob/master/bin/actions.js

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

Add a comment